อยากเขียนให้ Blynk นับรอบ Servo แล้วแสดงจำนวนรอบหมุนได้ไหมครับ

อยากเขียนให้ Blynk นับรอบ Servo แล้วแสดงจำนวนรอบหมุนได้ไหมครับ ช่วยแนะนำหน่อยครับ

นับเชิงกายภาพ หรือเชิงโปรแกรมครับ

1 Likes

เชิงโปรแกรมครับ แบบหมุน 1 ครั้ง ขึ้นโชว์ใน blynk 1 ประมาณนี้อะครับ

ควบคุมการหมุดด้วยอะไรครับ มีการใช้ R ปรับค่าได้หรือไม่

1 Likes

ผมเขียนโปรแกรมควบคุม Servo อัตโนมัติครับ อยากให้อ่านค่าการหมุนของ servo ใน if else ครับ

ตอนนี้เขียนไปถึงไหนแล้วครับ ขอดูโค้ตหน่อย

1 Likes
#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Servo.h>
Servo myservo;
int sensor = 2;
#define TRIGGER_PIN 16
#define ECHO_PIN 17 

Servo servo;

char auth[] = "QSGioJ54QqODIL6jKoLZe3fui2_5Dtnv";
char ssid[] = "3bb-wlan 2.4G";
char pass[] = "0931379604";

void setup(){
  
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  myservo.attach(4);
  myservo.write(90);
  delay(1000);
}

void loop(){

    int val = analogRead(sensor);
    static boolean s = false;
    if(ReadDistance()<50) {      
      s = true;
      delay(2000);
      if(val >0 && val <200) {
      delay(2000);
      myservo.attach(4);
      myservo.write(180);
      delay(2000);
      myservo.attach(4);
      myservo.write(90);
      delay(2000);
      myservo.detach();
    }
     else {
      s = false; 
      if(val >300 && val <500){
      delay(2000);
      myservo.attach(4);
      myservo.write(0);
      delay(2000);
      myservo.attach(4);
      myservo.write(90);
      delay(2000);
      myservo.detach();
    
  }
}  
}

{
  
  Blynk.run();
  
}  
}

long ReadDistance (void)
{
  long duration, distance;
  
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  duration = pulseIn(ECHO_PIN, HIGH);
  distance = (duration/2) / 29.1;
  Serial.print("duration=");
  Serial.print(duration);
  Serial.print("duration=");
  Serial.print(duration);
  delay(100);
  return(distance);
}

ตอนนี้โค้ตที่ให้มาทำงานเป็นอย่างไรครับ รันแล้วมันจะหมุนเซอโวร์ไปเรื่อยๆ หรอ

1 Likes

อธิบายนะครับ คือผมเขียนโปรแกรมแยกขยะประเภท ขวด กับประป๋อง ถ้าเจอกระป๋องให้หมุนซ้าย ถ้าไม่ใช่ให้หมุนขวา และผมอยากต่อยอดในแอพ blynk นับค่าการหมุน เช่น หมุนขวา 3 ครั้ง หมุนซ้าย 1 ครั้ง ให้แสดงค่าในแอพ ทั้งซ้ายว่า ขวด 3 กระป๋อง 1 ประมาณนี้อะครับ

วิ่งเข้า loop นี้นับหนึ่งใช่ไหม ถ้าวิ่งวนเข้ามาอีกรอบก็บวกไปเรื่อยๆ ช้ะ

image

1 Likes

ใช้ widget value display สองอันแยกซ้ายขวา

แล้วก็ใช้คำสั่งนี้ในการส่งค่าเพื่อแสดงผล

Blynk.virtualWrite(V0, val);

การนำไปใช้ก็ประมาณนี้

#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Servo.h>
Servo myservo;
int sensor = 2;
#define TRIGGER_PIN 16
#define ECHO_PIN 17 

Servo servo;

char auth[] = "QSGioJ54QqODIL6jKoLZe3fui2_5Dtnv";
char ssid[] = "3bb-wlan 2.4G";
char pass[] = "0931379604";
int left = 0;
void setup(){
  
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  myservo.attach(4);
  myservo.write(90);
  delay(1000);
}

void loop(){

    int val = analogRead(sensor);
    static boolean s = false;
    if(ReadDistance()<50) {      
      left++;
      Blynk.virtualWrite(V0, left);
      s = true;
      delay(2000);
      if(val >0 && val <200) {
      delay(2000);
      myservo.attach(4);
      myservo.write(180);
      delay(2000);
      myservo.attach(4);
      myservo.write(90);
      delay(2000);
      myservo.detach();
    }
     else {
      s = false; 
      if(val >300 && val <500){
      delay(2000);
      myservo.attach(4);
      myservo.write(0);
      delay(2000);
      myservo.attach(4);
      myservo.write(90);
      delay(2000);
      myservo.detach();
    
  }
}  
}

{
  
  Blynk.run();
  
}  
}

long ReadDistance (void)
{
  long duration, distance;
  
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  duration = pulseIn(ECHO_PIN, HIGH);
  distance = (duration/2) / 29.1;
  Serial.print("duration=");
  Serial.print(duration);
  Serial.print("duration=");
  Serial.print(duration);
  delay(100);
  return(distance);
}
1 Likes

ยิ่งอธิบายละเอียด คำตอบที่ได้ก็จะตรงประเด็นมากขึ้นนะครับ

1 Likes

ขอบคุณครับพี่

ข้อมูลการใช้งานเพิ่มเติมครับ

1 Likes

ผมลองเขียนแล้ว ตัวเลขขึ้นแล้วครับ แต่ servo ไม่ทำงาน

โค้ตที่ใส่ไปแค่นับบวก แล้วส่งค่าแค่นั้นนะครับ ไม่กระทบโค้ตหลักใดๆ ถ้าโค้ตหลักถูกต้องมันก็จะหมุดได้ตามปกติครับ

โค้ดหลักใช้ด้ครับ แต่พอใส่ Blynk.begin(auth, ssid, pass); ใน void setup() แล้วมันไม่ทำงานครับ

ใช้คำสั่งอื่นเชื่อมต่อแทนได้ไหมครับ

ขอดูโค้ตที่บอกว่าใส่แล้วไม่ทำงานแบบเต็มๆ ครับ

แก้ได้แล้วครับพี่ ขอบคุณครับ