ควบคุมการหมุดด้วยอะไรครับ มีการใช้ R ปรับค่าได้หรือไม่
ผมเขียนโปรแกรมควบคุม Servo อัตโนมัติครับ อยากให้อ่านค่าการหมุนของ servo ใน if else ครับ
ตอนนี้เขียนไปถึงไหนแล้วครับ ขอดูโค้ตหน่อย
#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);
}
ตอนนี้โค้ตที่ให้มาทำงานเป็นอย่างไรครับ รันแล้วมันจะหมุนเซอโวร์ไปเรื่อยๆ หรอ
อธิบายนะครับ คือผมเขียนโปรแกรมแยกขยะประเภท ขวด กับประป๋อง ถ้าเจอกระป๋องให้หมุนซ้าย ถ้าไม่ใช่ให้หมุนขวา และผมอยากต่อยอดในแอพ blynk นับค่าการหมุน เช่น หมุนขวา 3 ครั้ง หมุนซ้าย 1 ครั้ง ให้แสดงค่าในแอพ ทั้งซ้ายว่า ขวด 3 กระป๋อง 1 ประมาณนี้อะครับ
วิ่งเข้า loop นี้นับหนึ่งใช่ไหม ถ้าวิ่งวนเข้ามาอีกรอบก็บวกไปเรื่อยๆ ช้ะ
ใช้ 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);
}
ยิ่งอธิบายละเอียด คำตอบที่ได้ก็จะตรงประเด็นมากขึ้นนะครับ
ขอบคุณครับพี่
ข้อมูลการใช้งานเพิ่มเติมครับ
ผมลองเขียนแล้ว ตัวเลขขึ้นแล้วครับ แต่ servo ไม่ทำงาน
โค้ตที่ใส่ไปแค่นับบวก แล้วส่งค่าแค่นั้นนะครับ ไม่กระทบโค้ตหลักใดๆ ถ้าโค้ตหลักถูกต้องมันก็จะหมุดได้ตามปกติครับ
โค้ดหลักใช้ด้ครับ แต่พอใส่ Blynk.begin(auth, ssid, pass); ใน void setup() แล้วมันไม่ทำงานครับ
ใช้คำสั่งอื่นเชื่อมต่อแทนได้ไหมครับ
ขอดูโค้ตที่บอกว่าใส่แล้วไม่ทำงานแบบเต็มๆ ครับ
แก้ได้แล้วครับพี่ ขอบคุณครับ
สรุปหน่อยครับว่าเป็นที่อะไร
เป็นที่ servo ครับพี่ ขอบคุณครับ