Blynk ไม่เชื่อมต่อใหม่


(Wirayut Charoenphong) #1

สวัสดีครับ ตอนนี่ผมกำลังทำโปรเจ็คเกี่ยวกับตู้คีบตุ๊กตาควบคุมผ่าน smartphone แต่ตอนนี่ติดปัญหาที่ว่าการเริ่มต้นการเชื่อมต่อใหม่ มีเวลาในการใช้ระบบควบคุม90วิ ครับ พอครบ90วโปรแกรมตัดจริง แต่พอจะเริ่มใช้หรือเริ่มเล่นใหม่ผมได้ทำการปล่อยฮอตสปอตให้กับบอร์ด บอร์ดเชื่อมต่อ แต่โปรแกรม blynk ไม่ทำการเชื่อมต่อใหม่ให้ เป็นเพราะอะไรครับ รบกวนสอบถามพี่ๆหน่อยนะครับ

Codeที่ใช้

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //ถ้าจอไม่แสดงผล ให้ลองเปลี่ยน 0x3F เป็น 0x27
int lifetime = 10;
char auth[] = "98ec6bc2cda741ecb16e37de9f886705";
char ssid[] = "wirayut";
char pass[] = "11223344";
Servo servo;
BLYNK_WRITE(V3) {
servo.write(param.asInt());
}
void setup() {
lcd.begin(); //lcd เริ่มทำงาน
lcd.setCursor(0,0); //ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print("Time(second)");//แสดงข้อความในวงเล็บ
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
servo.attach(15); // 15 means D8 pin of ESP8266
}
void loop(){
if(WL_CONNECTED);{ // ตรวจสอบถ้าแอพเริ่มทำงาน
Blynk.run();//แอพblynkเริ่มการททำงาน
lifetime -= 1;//ค่าของตัวแปร ลบที่ละ1
delay(1000);
lcd.setCursor(0,1);//ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print(lifetime);//แสดงค่าของตัวแปร lifetime ออกมา
}
if  (lifetime <= 0){//ถ้าlifetime มีค่าน้อยกว่าหรือเท่ากับ 0
lcd.clear(); //lcd clearหน้าจอทั้งหมด
ESP.restart();//แอพหยุดการทำงาน
Blynk.run();
}
}

Qrcodeโปรแกรม


(Permpol Thanapunnamas) #2

90 วินาที นี้หมายถึงการจับเวลาของตู้เกมใช่ป่ะครับ พอครบก็ให้เริ่มให้ด้วยคำสั่ง restart


(Wirayut Charoenphong) #3

ใช่ครับพี่ เป็นการจับเวลาของตู้เกมผมโดยให้การทำงานว่าครบ90วิ โปรแกรมหลุด พอจะเล่นใหม่ก้แค่ปล่อยฮอตสปอตออกมาใหม่


(Permpol Thanapunnamas) #4

เบื้องต้นลองเพิ่มตามโค้ตนี้ก่อนครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //ถ้าจอไม่แสดงผล ให้ลองเปลี่ยน 0x3F เป็น 0x27
int lifetime = 10;
char auth[] = "98ec6bc2cda741ecb16e37de9f886705";
char ssid[] = "wirayut";
char pass[] = "11223344";
Servo servo;
BLYNK_WRITE(V3) {
servo.write(param.asInt());
}
void setup() {
lcd.begin(); //lcd เริ่มทำงาน
lcd.setCursor(0,0); //ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print("Time(second)");//แสดงข้อความในวงเล็บ
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
Blynk.connect();   // for a local server requiring WiFi connection


servo.attach(15); // 15 means D8 pin of ESP8266

}
void loop(){
  
if(WL_CONNECTED);{ // ตรวจสอบถ้าแอพเริ่มทำงาน
Blynk.run();//แอพblynkเริ่มการททำงาน
lifetime -= 1;//ค่าของตัวแปร ลบที่ละ1
delay(1000);
lcd.setCursor(0,1);//ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print(lifetime);//แสดงค่าของตัวแปร lifetime ออกมา
}
if  (lifetime <= 0){//ถ้าlifetime มีค่าน้อยกว่าหรือเท่ากับ 0
lcd.clear(); //lcd clearหน้าจอทั้งหมด
ESP.restart();//แอพหยุดการทำงาน
Blynk.run();
}

}

(Wirayut Charoenphong) #5

อาการเหมือนเดิมครับพี่ พอครบเวลา บอร์ดหลุด แต่ พอปล่อยฮอตสปอตให้บอร์ดใหม่ ก็ไม่เชื่อมาต่อ


(Permpol Thanapunnamas) #6

เดียวเย็นๆ แก้ให้ใหม่ครับ


(Permpol Thanapunnamas) #7

แคปดีบัคมันมาดูด้วยจะดีมากนะ จะได้แก้กันถูกทาง


(Wirayut Charoenphong) #8

ขอบคุณมากๆนะครับพี่


(Permpol Thanapunnamas) #9

ตามนี้ครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //ถ้าจอไม่แสดงผล ให้ลองเปลี่ยน 0x3F เป็น 0x27
int lifetime = 10;
char auth[] = "98ec6bc2cda741ecb16e37de9f886705";
char ssid[] = "wirayut";
char pass[] = "11223344";
Servo servo;
BLYNK_WRITE(V3) {
servo.write(param.asInt());
}
void setup() {
lcd.begin(); //lcd เริ่มทำงาน
lcd.setCursor(0,0); //ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print("Time(second)");//แสดงข้อความในวงเล็บ
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
Blynk.connect();   // for a local server requiring WiFi connection

Serial.println("Connecting Wifi...");
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
    }
servo.attach(15); // 15 means D8 pin of ESP8266
timer.setInterval(15000, reconnectBlynk); // check every 15 seconds if we are connected to the server
setSyncInterval(10 * 30); // Sync interval in seconds (10 minutes)
  SetTimeIntervals();
}
void loop(){

  if (!Blynk.connected()) {
    if(Blynk.connect()) {
      BLYNK_LOG("Reconnected");
    } else {
      
      BLYNK_LOG("Not reconnected");
    }
  }
if(WL_CONNECTED);{ // ตรวจสอบถ้าแอพเริ่มทำงาน
Blynk.run();//แอพblynkเริ่มการททำงาน
lifetime -= 1;//ค่าของตัวแปร ลบที่ละ1
delay(1000);
lcd.setCursor(0,1);//ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print(lifetime);//แสดงค่าของตัวแปร lifetime ออกมา
}
if  (lifetime <= 0){//ถ้าlifetime มีค่าน้อยกว่าหรือเท่ากับ 0
lcd.clear(); //lcd clearหน้าจอทั้งหมด
ESP.restart();//แอพหยุดการทำงาน
Blynk.run();
}
}

ถ้าไม่ได้ให้แคป ดีบัคตอนนั้นมาดูด้วยครับ


(Wirayut Charoenphong) #10

ด้านบนต้องประกาศไลบลารี่อะไรเพิ่มไหมครับมันขึ่นแบบนี่


(Permpol Thanapunnamas) #11

นี้คือสาเหตุที่มันไม่ต่อ blynk ครับ มันรีบูตคัวเองแล้วค้าง ติด wdt reset


(Permpol Thanapunnamas) #12

ลองแก้ตามนี้ครับน่าจะผ่านละ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //ถ้าจอไม่แสดงผล ให้ลองเปลี่ยน 0x3F เป็น 0x27
int lifetime = 10;
bool lock = false;
char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
char ssid[] = "XXXXXXX";
char pass[] = "00000000";
Servo servo;
BLYNK_WRITE(V3) {
servo.write(param.asInt());
}
void setup() {
wdt_disable();
lcd.begin(); //lcd เริ่มทำงาน
lcd.setCursor(0,0); //ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print("Time(second)");//แสดงข้อความในวงเล็บ
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
servo.attach(15); // 15 means D8 pin of ESP8266
lock = false;
}
void loop(){
  ESP.wdtDisable();
ESP.wdtEnable(WDTO_8S);
if(WL_CONNECTED);{ // ตรวจสอบถ้าแอพเริ่มทำงาน
Blynk.run();//แอพblynkเริ่มการททำงาน
lifetime -= 1;//ค่าของตัวแปร ลบที่ละ1
delay(1000);
lcd.setCursor(0,1);//ตั้งค่าให้อยู่ที่บรรทัดที่ 1 ตัวที่ 1 *
lcd.print(lifetime);//แสดงค่าของตัวแปร lifetime ออกมา
Serial.println(lifetime);  // used for debugging
}
if  (lifetime == 0){//ถ้าlifetime มีค่าน้อยกว่าหรือเท่ากับ 0

lcd.clear(); //lcd clearหน้าจอทั้งหมด
ESP.wdtFeed();
ESP.wdtDisable(); //ปิดการทำงาน
ESP.restart();//แอพหยุดการทำงาน
ESP.wdtEnable(WDTO_8S); 

}

  //}
 }

นี้ผลลัพธ์ครับ


(Wirayut Charoenphong) #13

ตอนนี่ได้ผลดีเลยครับพี่ แต่ว่า มันติดตรงที่ว่า พอเวลาหมดปุ้ปมันนับเวลาต่อทันที่ ผมเลยจะเขียนdelay(5000)วิ ไว้ไม่ให้มันนับต่อ เพื่อเวลาไว้มห้ผมปิดฮอตสปอต


(Permpol Thanapunnamas) #14

จริงๆ แล้วเราไม่ควรเขียนให้มัน restart ตัวเองใหม่นะ มันตรงๆ เกินไป ควรเขียนให้มันรอปุ่ม start แทนแล้วจับเวลา พอหมดเวลาก็รอกดปุ่ม start เพื่อเริ่มอีกครั้ง ครับ


(Wirayut Charoenphong) #15

ใช้คำสั่งไหนในการรอแทนคำว่ารีสตาทอะครับ reconnect หรือเราสร้างมาอีกปุ่มเพื่อใช้ในการเปนแมนนวลให้การสตาทอะครับ


(Permpol Thanapunnamas) #16

เพิ่มมาอีกปุ่มเลยครับ แทนการหลอดเหรียญของตู้


(Wirayut Charoenphong) #17

พี่ครับตอนนี่ผมทำได้แล้วนะครับโดยผมไม่ได้ใช้ปุ่มเพิ่มขึ้นมา แต่ใช้การ ให้โปรแกรมdisconnectก่อน แล้วรอ5วิ esprestarใหม่ครับ พี่ว่าเวิคไหมครับ :joy:


(Permpol Thanapunnamas) #18

จริงๆ ไม่ต้อง disconnect ก่อนก็ได้นะ คือหลักการไม่ควร discnnect เลย แค่ให้มันวนอยู่ใน void loop รอกด ปุ่ม start ค่อยนับ พอจบก็ออกจาก if มารอทำใหม่ครับ


(Wirayut Charoenphong) #19

ผมกลัวในเรื่องของการพรีเซนงานนะคับพี่ เผื่ออาจารย์เขาถามว่าแล้วถ้าเราไม่กดปุ่มstart โปรแกรมไม่จับเวลาก็จริง แต่โปรแกรมมันทำงานได้ตลอดอะคับ


(Permpol Thanapunnamas) #20

สมมติว่า เราเขียนโปรแกรมไว้แบบนี้

void loop{
if( SW == high ){

//Main program

 }
}

ถ้าเราไม่กด sw ยังไงโปรแกรมก็จะไม่เข้าไปทำงานใน main program แน่นอนครับ