สวัสดีครับ ขอสอบถามหน่อยครับ code วัดอุณหภูมิ แจ้งเตือนผ่าน Line จะให้ส่ง line ครั้งเดียว จำใช้คำสั่งแบบไหนครับ

`#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include <DHT_U.h>
#include <TridentTD_LineNotify.h> 
#define DHTPIN 0 // กำหนดขาให้กับอุปกรณ์ตรวจสอบความชื้น DHT22
#define DHTTYPE DHT22
#define LED D5 /// alarm
#define SW1 D6 ///switch

int setTemp;
int setHumid;

BLYNK_WRITE(V3) //temperature slider in app on pin V3
{
setTemp = param.asInt();
}
BLYNK_WRITE(V4) //temperature slider in app on pin V4
{
setHumid = param.asInt();
}

/////////////////////////////////////////////////////////

DHT_Unified dht(DHTPIN, DHTTYPE);

//* **BLYNK TOKEN** //
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char ssid[] = "xxxxxxx";
char pass[] = "xxxxxxx";

// ***LINE TOKEN*** //
#define LINE_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

extern "C" { /////////// สถานะเชื่อม wifi
#include "user_interface.h"
}



SimpleTimer timer;

BLYNK_CONNECTED() {
Blynk.syncAll();
}



void setup()
{
Serial.begin(115200);
Serial.println("test");
Serial.println(LINE.getVersion());
LINE.setToken(LINE_TOKEN);
LINE.notify("[myarduino.net](http://myarduino.net/)");
wifi_status_led_install(2,  PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); //สถานะเชื่อม wifi


Blynk.begin(auth, ssid, pass, "blynk.honey.co.th", 8080);
pinMode(D5, OUTPUT); // ***อุณหภูมิ output*** ///
digitalWrite(D5, LOW);
////////////////////////////////////////////////////////////
pinMode(D6, OUTPUT); // ***switch*** ///
digitalWrite(D6, LOW);
///////////////////////////////////////////////////////////
dht.begin();

timer.setInterval(1000L, sendUptime);

}

void sendUptime()
{
  
// *****ชุดคำสั่งการทำงานของอุณหภูมิ***** *//
Blynk.virtualWrite(V5, millis() / 1000);
sensors_event_t event;
dht.temperature().getEvent(&event);
if (!isnan(event.temperature)) {
Blynk.virtualWrite(V1, event.temperature);
if (event.temperature >=  setTemp ) {
digitalWrite(D5, HIGH);
Blynk.virtualWrite(V11, 255);

String LineText;
String string1 = "High temperature ";
String string2 = " °C";
LineText = string1 + event.temperature + string2;
Serial.print("Line ");
Serial.println(LineText);
LINE.notify(LineText);
  
}
else {
digitalWrite(D5, LOW);
Blynk.virtualWrite(V11, 0);
}
}
Blynk.virtualWrite(V6, millis() / 1000);
dht.humidity().getEvent(&event);
if (!isnan(event.relative_humidity)) {
Blynk.virtualWrite(V2, event.relative_humidity);
if (event.temperature >=  setHumid ) {
//digitalWrite(D7, LOW);
String LineText;
String string1 = "High humidity  ";
String string2 = " %";
LineText = string1 + event.temperature + string2;
Serial.print("Line ");
Serial.println(LineText);
LINE.notify(LineText);
}
///////////////////////////////////else {
///////////////////////////////////digitalWrite(D7, HIGH);
///////////////////////////////////}
}
}

//*********************************************************//

void loop()
{
if(Blynk.connected()) {
Blynk.run();
timer.run();
Blynk.virtualWrite(V7, WiFi.RSSI()); // ความแรงสัญญาณ

if(digitalRead(SW1)==HIGH)
Blynk.virtualWrite(V10, 255);
else
Blynk.virtualWrite(V10, 0);

  }
}

ตอนนี้ สามรถสั่งให้แจ้งเตือนออกไปทาง Line ได้หรือยัง ( สมัคร Line Notify แล้วใช่ไหม )

ส่ง line ได้แล้วครับ แต่ส่ง line ตลอด ไม่หยุดครับ อยากให้ส่งครั้งเดียวครับ

ลองศึกษาดูครับ

ดูจาก Code แล้ว จขกท. ทำไมกำหนด D6 เป็น Output แล้ว แต่ยังใช้ Function Input ตอนท้ายครับ
d61


d62

1 Like

ดูทรงแล้วมีปุ่มจากภายนอกด้วย @rut ถ่ายปุ่มมาดูหน่อยครับ ให้เห็นว่าต่ออย่างไรด้วย

ภาพ

อยากรู้ว่า V10 นี้ใช้ widget อะไรไว้ ถึงต้องส่ง 255 ออกมา แคป หน้าแอปมาด้วยครับ

ภาพ

ผมไม่แน่ใจหลักการถูกหรือป่าวครับ คือ output D6 สั่ง เปิด-ปิด โดยกดปุ่มที่ blynk ครับ เมื่อมีการกดสวิตช์ (blynk) ให่ส่งออก output ครับ แสดงผล led ที่ blynk ด้วย ครับ ถ้าหลักการผิดแนะนำด้วยนะครับ

คือผมจะทำเตือนอุณหภูมิผ่าน line เมื่อสูงเกินกำหนด และแจ้งเตือนอีกครั้งเมื่ออุณหภูมิปกติ ครับ ปัญหาของผมคือส่ง line แจ้งเตือนตลอดเมื่ออุณหภูมิเกิน

ส่วน output D6 พอดีผมเห็นว่ามีขา I/0 เหลือ เลยจะทำ เปิด-ปิด เครื่องใช้ไฟฟ้าด้วย โดยกดปุ่มที่ blynk ให้ส่งออก output D6 ครับ แสดงผล led ที่ blynk ด้วย ครับ ถ้าหลักการผิดแนะนำด้วยนะครับ


ถ้าสั่งงานจาก Blynk ไปยัง ESP สามารถเลือก GPIO ตรงๆ ได้เลยครับ ไม่ต้องเขียน Code ควบคุม และ ใน ปุ่มกด ปิด/เปิด ที่ Blynk สามารถกำหนด ให้แสดงสถานะ ว่า On หรือ off

ส่วนการ ที่แจ้งเตือนออกไปที่ Line ตลอดเวลา เนื่องจาก เขียนให้ตรวจสอบค่า >= ( มากกว่าหรือเท่ากับ ) มันเข้าเงื่อนไขตลอดเวลา จนกว่า มันจะ ต่ำกว่า มันจึงหยุดส่ง มันติด Loop ตรงนี้อยู่ ลองศึกษาจาก @Remy_Martin ที่ส่ง Link มาให้ครับ

อีกจุด ตรงการตรวจสอบค่า Humid มีค่ามากน้อย ทำไมเอาค่า Temp มาเปรียบเทียบกับ Humidity

Capture1

1 Like

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

ผมยังไม่เห็นการใช้ v10 ในแอปเลยนะครับ มันอยู่ตรงไหนหรอ

V10 เป็น LED ผมเพิ่มเข้าไปอีกตัวครับ แต่ยังไม่ได้เพิ่มใน blynk ครับ ส่วนแจ้งเตือน line ผมลองก็ยังส่งไม่หยุด พยายามแก้ให้ได้ครับ

วางโค้ตอัพเดทล่าสุดด้วยครับ

ลองศึกษา จาก กระทู้นี้ดูครับ ปัญหาเดียวกับ เจ้าของกระทู้เลย

https://eleceasy.com/t/select-switch-3/5905/24

กำลังศึกษาตามลิ้งที่แนะมาครับ

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include <DHT_U.h>
#include <TridentTD_LineNotify.h> 
#define DHTPIN 0 //=== กำหนดขาให้กับอุปกรณ์ตรวจสอบความชื้น DHT11
#define DHTTYPE DHT22
#define LED D5 //=== alarm
#define SW1 D6 //=== SW1 blynk
#define SW2 D7 //=== SW2 blynk
#define SW3 D8 //=== SW3 blynk
#define BLYNK_DEBUG
//==========================================================================
int setTemp;
int setHumid;

BLYNK_WRITE(V3) //temperature slider in app on pin V3
{
setTemp = param.asInt();
}
BLYNK_WRITE(V4) //temperature slider in app on pin V4
{
setHumid = param.asInt();
}

//==========================================================================

DHT_Unified dht(DHTPIN, DHTTYPE);
int blynkIsDownCount = 0;


//=============BLYNK TOKEN==================================================
char auth[] = "xxxxxxxxxxxxxxxxxxx";
char ssid[] = "xxxxxxx";
char pass[] = "xxxxxxxx";

//=============LINE TOKEN===================================================
#define LINE_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxx"

//=============สถานะเชื่อม wifi===============================================
extern "C" { 
#include "user_interface.h"
}

//=========================================================================
SimpleTimer timer;

BLYNK_CONNECTED() {
Blynk.syncAll();
}

//=========================================================================

void setup()
{
Serial.begin(115200);
Serial.println(LINE.getVersion());
LINE.setToken(LINE_TOKEN);
wifi_status_led_install(2,  PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); //===เพิ่ม สถานะเชื่อม wifi

Blynk.begin(auth, ssid, pass, "blynk.honey.co.th", 8080);
timer.setInterval(10000L, reconnectblynk);

pinMode(D5, OUTPUT); // ***OUTPUT เตือน TEMP*** ///
digitalWrite(D5, LOW); 
pinMode(D6, OUTPUT); // ***sw1*** //
digitalWrite(D6, LOW);
pinMode(D7, OUTPUT); // ***SW2*** //
digitalWrite(D7, LOW);
pinMode(D8, OUTPUT); // ***SW3*** //
digitalWrite(D8, LOW);

dht.begin();
timer.setInterval(1000L, sendUptime);
}

//==================ชุดคำสั่งการทำงานของอุณหภูมิ==============================//
void sendUptime()
{  
Blynk.virtualWrite(V5, millis() / 1000);
sensors_event_t event;
dht.temperature().getEvent(&event);
if (!isnan(event.temperature)) {
Blynk.virtualWrite(V1, event.temperature);
if (event.temperature >=  setTemp ) {
digitalWrite(D5, HIGH);
Blynk.virtualWrite(V11, 255);
String LineText;
String string1 = "High temperature ";
String string2 = " °C";
LineText = string1 + event.temperature + string2;
Serial.print("Line ");
Serial.println(LineText);
LINE.notify(LineText);
}
}
else {
digitalWrite(D5, LOW);
Blynk.virtualWrite(V11, 0);
}


Blynk.virtualWrite(V6, millis() / 1000);
dht.humidity().getEvent(&event);
if (!isnan(event.relative_humidity)) {
Blynk.virtualWrite(V2, event.relative_humidity);
if (event.temperature >=  setHumid ) {
//digitalWrite(D7, LOW);
String LineText;
String string1 = "High humidity  ";
String string2 = " %";
LineText = string1 + event.temperature + string2;
Serial.print("Line ");
Serial.println(LineText);
LINE.notify(LineText);
}
///////////////////////////////////else {
///////////////////////////////////digitalWrite(D7, HIGH);
///////////////////////////////////}
}
}


//============================================================================
void reconnectblynk()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
    Blynk.syncAll();
  }
}

//=============================================================================================
void loop()
{
if(Blynk.connected()) {  
Blynk.run();
timer.run();
Blynk.virtualWrite(V7, WiFi.RSSI());


if(digitalRead(SW1)==HIGH)
Blynk.virtualWrite(V10, 255);
else
Blynk.virtualWrite(V10, 0);

if(digitalRead(SW2)==HIGH)
Blynk.virtualWrite(V12, 255);
else
Blynk.virtualWrite(V12, 0);

if(digitalRead(SW3)==HIGH)
Blynk.virtualWrite(V13, 255);
else
Blynk.virtualWrite(V13, 0);
}
}

//====================================END=====================================

ขอบคุณครับ เดี๋ยงลองศึกษาตามที่แนะนำครับ

ผมลองแก้ Code แล้ว แต่ส่ง line แจ้งเฉพาะตอน อุณหภูมิปกติ ตอนอุณหภูมิสูงไม่แจ้งเตือน ช่วยดูให้หน่อยครับ ว่าผิดตรงไหนครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include <DHT_U.h>
#include <TridentTD_LineNotify.h> 
#define DHTPIN 0 //=== กำหนดขาให้กับอุปกรณ์ตรวจสอบความชื้น DHT11
#define DHTTYPE DHT22
#define LED D5 //=== alarm
#define SW1 D6 //=== SW1 blynk
#define SW2 D7 //=== SW2 blynk
#define SW3 D8 //=== SW3 blynk
#define BLYNK_DEBUG
//==========================================================================
int setTemp;
int setHumid;

int temp = 0;

BLYNK_WRITE(V3) //temperature slider in app on pin V3
{
setTemp = param.asInt();
}
BLYNK_WRITE(V4) //temperature slider in app on pin V4
{
setHumid = param.asInt();
}

//==========================================================================

DHT_Unified dht(DHTPIN, DHTTYPE);
int blynkIsDownCount = 0;

//=============BLYNK TOKEN=======================================
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxx";
char ssid[] = "xxxxxxxxxxxxxxxxxxx";
char pass[] = "xxxxxxxxxxxxxxxxxx";

//=============LINE TOKEN===================================================
#define LINE_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

//=============สถานะเชื่อม wifi===============================================
extern "C" { 
#include "user_interface.h"
}

//=========================================================================
SimpleTimer timer;

BLYNK_CONNECTED() {
Blynk.syncAll();
}

//=========================================================================

void setup()
{
Serial.begin(115200);
Serial.println(LINE.getVersion());
LINE.setToken(LINE_TOKEN);
wifi_status_led_install(2,  PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); //===เพิ่ม สถานะเชื่อม wifi

Blynk.begin(auth, ssid, pass, "blynk.honey.co.th", 8080);
timer.setInterval(10000L, reconnectblynk);

pinMode(D5, OUTPUT); // ***OUTPUT เตือน TEMP*** ///
digitalWrite(D5, LOW); 
pinMode(D6, OUTPUT); // ***sw1*** //
digitalWrite(D6, LOW);
pinMode(D7, OUTPUT); // ***SW2*** //
digitalWrite(D7, LOW);
pinMode(D8, OUTPUT); // ***SW3*** //
digitalWrite(D8, LOW);

dht.begin();
timer.setInterval(1000L, sendUptime);
}



//==================ชุดคำสั่งการทำงานของอุณหภูมิ==============================//
void sendUptime()
{  
Blynk.virtualWrite(V5, millis() / 1000);
sensors_event_t event;
dht.temperature().getEvent(&event);
if (!isnan(event.temperature)) {
Blynk.virtualWrite(V1, event.temperature);
if (event.temperature >=  setTemp ) {
digitalWrite(D5, HIGH);
Blynk.virtualWrite(V11, 255);

     if (event.temperature <=  setTemp && temp == 1) {
    String LineText;
    String string1 = "พัดลมทำงาน High temperature ";
    String string2 = " °C";
    LineText = string1 + event.temperature + string2;
    Serial.print("Line ");
    Serial.println(LineText);
    LINE.notify(LineText);
        temp=0;
      }
       }


else {

digitalWrite(D5, LOW);
Blynk.virtualWrite(V11, 0);
if (event.temperature <=  setTemp && temp == 0) {
    String LineText;
    String string1 = "พัดลมหยุดทำงาน temperature ";
    String string2 = " °C";
    LineText = string1 + event.temperature + string2;
    Serial.print("Line ");
    Serial.println(LineText);
    LINE.notify(LineText);
        temp=1;
}
}

Blynk.virtualWrite(V6, millis() / 1000);
dht.humidity().getEvent(&event);
if (!isnan(event.relative_humidity)) {
Blynk.virtualWrite(V2, event.relative_humidity);
if (event.temperature >=  setHumid ) {
//digitalWrite(D7, LOW);
String LineText;
String string1 = "High humidity  ";
String string2 = " %";
LineText = string1 + event.temperature + string2;
Serial.print("Line ");
Serial.println(LineText);
LINE.notify(LineText);
}
///////////////////////////////////else {
///////////////////////////////////digitalWrite(D7, HIGH);
///////////////////////////////////}
}
}
}

//============================================================================================
void reconnectblynk()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
    Blynk.syncAll();
  }
}

//=============================================================================================
void loop()
{
if(Blynk.connected()) {  
Blynk.run();
timer.run();
Blynk.virtualWrite(V7, WiFi.RSSI());


if(digitalRead(SW1)==HIGH)
Blynk.virtualWrite(V10, 255);
else
Blynk.virtualWrite(V10, 0);

if(digitalRead(SW2)==HIGH)
Blynk.virtualWrite(V12, 255);
else
Blynk.virtualWrite(V12, 0);

if(digitalRead(SW3)==HIGH)
Blynk.virtualWrite(V13, 255);
else
Blynk.virtualWrite(V13, 0);
}
}

//====================================END=====================================

แน่ใจหรือไม่ว่ามันเข้าไปเงื่อนไขนี้แล้ว

ตอนนี้ได้แล้วครับ แก้ตรงเครื่องหมายใส่ผมผิดครับ
ขอสอบถามอีกเรื่องครับ wifi เชื่อมต่อนาน บางทีก็ไม่เชื่อมต่อ ต้องปิด เปิด net ใหม่ ก่อนหน้านี้ใช้ code อื่น เชื่องต่อง่ายปกติครับ น่าจะเป็นที่อะไรครับ

if (event.temperature >= setTemp && temp == 1) {

ต้องแคป serial ตอนที่เชื่อมไม่ได้มาดูครับ