Widget Slider บน Blynk และ จอ LCD + ปุ่ม Keypad 4*4

รบกวนขอคำแนะนำหน่อยนะครับพอดีผมเป็นมือใหม่พึ่งหัดเล่นนะครับ ผมอยากทราบว่าจะทำให้ค่าที่กดจาก keypad 4*4 ตรง Set-H และ Set-T ที่ขึ้นบนจอ LCD ไปปรากฏค่า ตรง Slider บน Blynk ยังไงครับ และเมื่อเรากดปรับ Slider บน Blynk ตรง Set-H และ Set-T ไปยังไงก็ให้ค่าบนจอ LCD ลด-เพิ่ม ตามไปด้วยเท่านั้น โดยผมใช้ปุ่ม A เป็น Set-H และปุ่ม B เป็น Set-T

และอีกอย่างหนึ่งก็คือ ผมใช้ปุ่ม C เป็น เมื่อกดหนึ่งครั้งให้หลอดไฟติด และกดอีกครั้งให้ไฟดับ เหมือนกันครับเมื่อกดปุ่ม C ตรง keypad ให้ไฟ ติด-ดับ ตรงปุ่ม Button, LAMP ที่ Blynk ต้องขึ้นสถานะ ON-OFF ด้วย ไม่ว่าจะควบคุมผ่านทางไหนทั้ง 2 อย่างต้องเชื่อมต่อกัน โดย ผมตั้ง LED ชื่อ LAMP บน Blynk และปุ่ม Button ให้ทำงานร่วมกัน ผมใช้บอร์ด [ESP32 Node MCU รบกวนผู้รู้หน่อยนะครับ ผมต้องใช้โค้ดยังไงและวางตรงไหนบ้างครับ

#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp32.h>




#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22   
DHT dht(DHTPIN, DHTTYPE);
SimpleTimer timer;



#include <WiFi.h>
#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#define I2CADDR 0X20



#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include<EEPROM.h>



#define Fog     12
#define Fanfog  14
#define FanIn   27
#define FanOut  26
#define LampH   25
#define Lamp    33





#define INTERVAL_MESSAGE1 5000         
unsigned long time_1 = 0;
void print_time(unsigned long time_millis);
int n = 0;                                                                                   // +1 ถ้า 2=0 จะหยุดการทำงาน






char auth[] = "8-p-2RMK9HBu1UkfO_45amwGWyIYPF2o";
char ssid[] = "LAPTOP-8CTKO8C7 7243";
char pass[] = "212224236248";
char sever[] = "oasiskit.com";
int port = 8080;




const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {0, 1, 2, 3};
byte colPins[COLS] = {4, 5, 6, 7};
Keypad_I2C kpd ( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574 );


char key;
int num;                               //ตัวแปลหมายเลขสำหรับใช้กับความชื้น
long numa;                             //ค่าตัวแปลของความชื้น
int num2;                              //ตัวแปลหมายเลขสำหรับใช้กับอุณหภูมิ
long numb;                             //ค่าตัวแปลของอุณหภูมิ
int s = 0;                             //ตัวแปลกดตั้งค่าครั้งแรก
float h;
float t;
int numc;                              // ปุ่ม ปิด-เปิด ไฟ
int i;                                 //+1 ถ้า 2=0 จะหยุดการทำงาน
int pinValue = LOW;




WidgetLED LampBlynk (V9);
WidgetLED FogBlynk (V12);
WidgetLED FanfogBlynk (V13);
WidgetLED FanInBlynk (V14);
WidgetLED FanOutBlynk (V15);
WidgetLED LampHBlynk (V16);




BLYNK_WRITE(V1)
{
  pinValue = param.asInt();
  if (pinValue == 1) {
    LampBlynk.on();
  }
  else if (pinValue == 0) {
    LampBlynk.off();
  }
}






BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V1);
  Blynk.syncAll();

}







void setup() {

  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass, "oasiskit.com" , 8080);



  pinMode(Fog, OUTPUT);
  pinMode(Fanfog, OUTPUT);
  pinMode(FanIn, OUTPUT);
  pinMode(FanOut, OUTPUT);
  pinMode(LampH, OUTPUT);
  pinMode(Lamp, OUTPUT);


  dht.begin();
  timer.setInterval(4000L, sendSensor);


  Wire.begin( );
  kpd.begin( makeKeymap(keys) );


  lcd.begin();
  lcd.backlight();



  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  lcd.begin();
  lcd.backlight();
  Serial.println("start");
  lcd.clear();
  lcd.setCursor(4, 1);
  lcd.print("start Program");
  lcd.setCursor(2, 2);
  lcd.print("Set Humidity&Temp");
  delay(1000);

  setone();


}






void loop() {

  ifkeyset();
  Lamp1();
  delay(50);



  lcd.setCursor(0, 0);
  lcd.print("Humidity =     ");
  lcd.setCursor(13, 0);
  lcd.print(h);
  lcd.setCursor(19, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temp     =     ");
  lcd.setCursor(13, 1);
  lcd.print(t);
  lcd.setCursor(19, 1);
  lcd.print("C");
  lcd.setCursor(0, 2);
  lcd.print("Set-H    =     ");
  lcd.setCursor(16, 2);
  lcd.print(numa);
  lcd.setCursor(11, 2);
  lcd.setCursor(19, 2);
  lcd.print("%");
  lcd.setCursor(0, 3);
  lcd.print("Set-T    =     ");
  lcd.setCursor(16, 3);
  lcd.print(numb);
  lcd.setCursor(11, 3);
  lcd.setCursor(19, 3);
  lcd.print("C");
  delay(100);






  istime();

  if (h > numa) {
    digitalWrite(FanOut, n);
  }





  if (h < numa || t > numb) {
    digitalWrite(Fog, HIGH);
    FogBlynk.on();
    digitalWrite(Fanfog, HIGH);
    FanfogBlynk.on();
  } else {
    digitalWrite(Fog, LOW);
    FogBlynk.off();
    digitalWrite(Fanfog, LOW);
    FanfogBlynk.off();
  }





  if (t > numb) {

    digitalWrite(FanIn, HIGH);
    FanInBlynk.on();
    digitalWrite(FanOut, n);

  }
  else {
    digitalWrite(FanIn, LOW);
    FanInBlynk.off();

  }





  if (t < numb) {
    digitalWrite(LampH, HIGH);
    LampHBlynk.on();
  } else {
    digitalWrite(LampH, LOW);
    LampHBlynk.off();
  }

  Blynk.run();
  timer.run();
}







void sendSensor()
{

  h = dht.readHumidity();
  t = dht.readTemperature(); 

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


  Blynk.virtualWrite(V10, t); 
  Blynk.virtualWrite(V11, h);

  Blynk.virtualWrite(V3, numa); 
  Blynk.virtualWrite(V4, numb); 


}





void setone() {                       //บังคับตั้งค่า H และ T ครั้งแรก
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("H-old = ");
  lcd.setCursor(8, 0);
  lcd.print(numa);
  lcd.setCursor(0, 1);
  lcd.print("T-old = ");
  lcd.setCursor(8, 1);
  lcd.print(numb);
  lcd.setCursor(0, 2);
  lcd.print("Set-H    =      00");
  lcd.setCursor(19, 2);
  lcd.print("%");
  lcd.setCursor(0, 3);
  lcd.print("Set-T    =      00");
  lcd.setCursor(19, 3);
  lcd.print("C");


  while (s < 100)
  {
    setnum();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("H-old = ");
    lcd.setCursor(8, 0);
    lcd.print(numa);
    lcd.setCursor(0, 1);
    lcd.print("T-old = ");
    lcd.setCursor(8, 1);
    lcd.print(numb);
    lcd.setCursor(0, 2);
    lcd.print("Set-H    =      ");
    lcd.setCursor(16, 2);
    lcd.print(numa);
    lcd.setCursor(19, 2);
    lcd.print("%");
    lcd.setCursor(0, 3);
    lcd.print("Set-T    =      00");
    lcd.setCursor(19, 3);
    lcd.print("C");
    setnum2();
  }
  delay (30);
  lcd.clear();
}




void Start()
{
  Serial.println("start");

  lcd.setCursor(0, 0);
  lcd.print("Humidity =     ");
  lcd.setCursor(13, 0);
  lcd.print(h);
  lcd.setCursor(19, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temp     =     ");
  lcd.setCursor(13, 1);
  lcd.print(t);
  lcd.setCursor(19, 1);
  lcd.print("C");
  lcd.setCursor(0, 2);
  lcd.print("Set-H    =     ");
  lcd.setCursor(16, 2);
  lcd.print(numa);
  lcd.setCursor(11, 2);
  lcd.setCursor(19, 2);
  lcd.print("%");
  lcd.setCursor(0, 3);
  lcd.print("Set-T    =     ");
  lcd.setCursor(16, 3);
  lcd.print(numb);
  lcd.setCursor(11, 3);
  lcd.setCursor(19, 3);
  lcd.print("C");
  delay(100);

}



void keynum() {
  if (key == '0')num = 0;
  if (key == '1')num = 1;
  if (key == '2')num = 2;
  if (key == '3')num = 3;
  if (key == '4')num = 4;
  if (key == '5')num = 5;
  if (key == '6')num = 6;
  if (key == '7')num = 7;
  if (key == '8')num = 8;
  if (key == '9')num = 9;
}




void ifkeyset() {
  key = kpd.getKey();                         
  if (key == 'A') {
    Serial.println("key A");
    setnum();
  }
  if (key == 'B') {                                 
    Serial.println("key B");
    setnum2();
  }

  if (key == 'C') {
    Serial.println("key C");
    c12();
  }
}



void setnum() {     //------------------------------------------------------------------------ป้อนค่า A
a1:
  Serial.println("A ---- a1");
  lcd.blink();
  lcd.setCursor(16, 2);
  int x = 0;
  numa = 0;
  Serial.println("A a1 x=0");
  while (x < 100) {
    key = kpd.getKey();
    if (key) {
      keynum();
      if (key != 'A' && key != 'B' && key != 'C' && key != 'D') {
        if (numa > 0 && key != '#') {
          numa = numa * 10 + num;
          if (numa > 99 || key == '*') {
            lcd.setCursor(16, 2);
            lcd.print("00");
            goto a1;

          }
          delay(30);
        }
        if (key == '#') {
          lcd.noBlink();
          lcd.clear();
          lcd.setCursor(1, 1);
          lcd.print("SETUP Humidity OK");
          lcd.setCursor(8, 2);
          lcd.print(numa);
          lcd.setCursor(11, 2);
          lcd.print("%");
          delay(2000);
          x = 100;
          //          i = 49;
          lcd.clear();
        }
        if (numa == 0) {
          numa = num;
          delay(30);
        }
      }
      lcd.setCursor(16, 2);
      lcd.print(numa);
      Serial.println("-------------------------------------------------------------------------------------------------------------------");
    }
  }
  EEPROM.write(0, numa);

}




void setnum2() {      //---------------------------------------------------------------------------  ป้อนค่า B
a2:
  Serial.println("B ---- a1");
  lcd.blink();
  lcd.setCursor(16, 3);
  int x = 0;
  numb = 0 ;
  Serial.println("B a1 x=0");
  while (x < 100) {
    key = kpd.getKey();
    if (key) {
      keynum();
      if (key != 'A' && key != 'B' && key != 'C' && key != 'D') {
        if (numb > 0 && key != '#') {
          numb = numb * 10 + num;
          if (numb > 99 || key == '*') {
            lcd.setCursor(16, 3);
            lcd.print("00");
            goto a2;
          }
          delay(30);
        }
        if (key == '#') {
          lcd.noBlink();
          lcd.clear();
          lcd.setCursor(4, 1);
          lcd.print("SETUP Temp OK");
          lcd.setCursor(8, 2);
          lcd.print(numb);
          lcd.setCursor(11, 2);
          lcd.print("C");
          delay(2000);
          x = 100;
          s = 100;
          //          i = 49;
          lcd.clear();
        }
        if (numb == 0) {
          numb = num;
          delay(30);
        }
      }
      lcd.setCursor(16, 3);
      lcd.print(numb);
      Serial.println("-------------------------------------------------------------------------------------------------------------------");
    }
  }
  EEPROM.write(1, numb);

}




void c12() {
  Serial.println("ccccccccccccccc");
  int x = 0;
  //numc = 0;
  Serial.println("numc----------------------c");
  while (x < 100) {
    key = kpd.getKey();
    Serial.println("C------------------C");
    loop1();
    Serial.println("--------------------------------------------------------------C-----------------------------------------------------");
    x = 100;
    if (i == 2) {
      i = 0;
      Serial.print("i re =");
      Serial.println(i);
    }
  }
}




void loop1() {
  Serial.println("loop1");
  numc = 0;
  while (numc < 100) {

    Serial.println("numc=0----");
    i++;
    delay(50);
    Serial.print("i = ");
    Serial.println(i);
    numc = 100;

  }

}



void Lamp1() {
  Serial.println("Lamp onnnnnnnnn");
  digitalWrite(Lamp, i);
  delay(30);

}



void istime() {
  if (millis() - time_1 > INTERVAL_MESSAGE1) {
    time_1 = millis();
    print_time(time_1);
    Serial.println("I'm message number one!");
    n++;
    Serial.print("n = ");
    Serial.println(n);
    FanOutBlynk.on();
  }


  if (n == 2) {
    n = 0;
    Serial.print("n re =");
    Serial.println(n);
    FanOutBlynk.off();
  }

}




void print_time(unsigned long time_millis) {
  Serial.print("Time: ");
  Serial.print(time_millis / 1000);
  Serial.print("s - ");
}


1 Like

เอาที่ผมพอรู้นะครับ

int v1;  //หรือ float v1;
int v2; //หรือ float v2;


//--รับค่าจาก Slide Bar เข้ามา เป็น int หรือ float
BLYNK_WRITE(V1)//สร้าง Slide bar ตัวที่1  ที่  Blynk     Set-H 
{
  v1 = param.asInt();  //ให้ตัวแปร v1 รับค่าจาก Slide bar V1
}

BLYNK_WRITE(V2)//สร้าง Slide bar ตัวที่2  ที่  Blynk  Set-T 
{
  v2 = param.asInt(); //ให้ตัวแปร v2 รับค่าจาก Slide bar V2
}

void setup() 

{

}
void loop()
{
Serial.print ("V1  : ")
Serial.println(V1)
delay(1000);
Serial.print ("V2  : ")
Serial.println(V2)
delay(1000);
}

จากนั้นก็ลองเลื่อนค่า Slide bar ที่ blynk ครับ

2 Likes

ตอนนี้ สไลด์บาร์ ได้แล้วนะครับ เหลือแต่ ปุ่ม button บน blynk นะครับ ซึ่งผมไม่รู้วิธีการให้ซิงค์กันนะครับพอจะแนะนำผมได้ไหมครับ :blush:

แล้วตอนนี้ทำอะไรได้แล้วบ้างครับ

ตอนนี้สำหรับ ปิด- เปิดไฟ ทำได้ก็คือ กดปุ่ม C ตรง keypad แล้วไฟติดกดอีกครั้งดับ และ LED บน blynk ก็ติดดับพร้อมกันได้แล้ว แต่ปุ่ม button ที่ blynk กดสั่งงานไม่ได้เลยครับ ตอนนี้กดควบคุมได้แต่ปุ่ม C อย่างเดียวครับ

เบื้องต้นศึกษาจากกระทู้นี้ครับ

1 Like

#include <EEPROM.h> //โหลดไลบารี่ EEPROM มาใช้งาน เพื่ออ่านและเขียนข้อมูลที่เราต้องการเก็บไว้ใน EEPROM
int Device_1sent;



#define D3 0 //ต่อปุ่ม Pushbutton ที่ D3

//----PB1-----------------------//
uint8_t curBtnState1 = LOW;
int prevBtnState1 = LOW;
int pin1  = 0;







//สร้างปุ่ม Blynk V1  สถานะ ON OFF นะครับ

BLYNK_WRITE(V1)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_1_On();
  }
  if (pinValue == 0) {
    Device_1_Off();
  }
}

void Device_1_On() {
  Device_1sent = 11;
  Blynk.virtualWrite(V1, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(10, Device_1sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_1_Off() {

  Device_1sent = 10;
  Blynk.virtualWrite(V1, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(10, Device_1sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}

//ถ้า Blynk เชื่อมต่อได้แล้ว
BLYNK_CONNECTED()
{

//ให้อ่านค่าจาก EEPROM Address 10  ซึ่งตอนนี้เก็บค่า ตัวแปร Device_1sent อยู่
  Device_1sent = EEPROM.get(10, Device_1sent)

// ถ้าตอนนี้ ตัวแปร Device_1sent เก็บค่า 11 ก็ให้ ปุ่ม V1 ที่ Blynk ติด  คือ ON   อุปกรณ์เราที่ต่ออยู่จะทำงาน
  if (Device_1sent  == 11) {
      Blynk.virtualWrite(V1, 1);


    }
// ถ้าตอนนี้ ตัวแปร Device_1sent เก็บค่า 10 ก็ให้ ปุ่ม V1 ที่ Blynk ติด  คือ OFF  อุปกรณ์เราที่ต่ออยู่จะไม่ทำงาน
    if (Device_1sent  == 10) {
      Blynk.virtualWrite(V1, 0);

    }
    Serial.print("Device_1sent :");
    Serial.println(Device_1sent);
//ดูที่ Serial Monitor ของ Arduino IDE ถ้า Blynk เชื่อมต่อติดแล้ว มันจะ print สถานะของปุ่มมาให้ดูครับ
}

//นี่คือการค้างสถานะ ที่ไม่ใช้ การ Sync ของ Blynk ครับ
//ต่อไปเรื่อง ปุ่มกด ผมขอเป็น Pushbutton นะครับ ของคุณกด Keypad ก็ลองไปประยุกต์ดู

void setup() {

pinMode(D3, INPUT_PULLUP);//  ปุ่ม  Push button

}


void loop()  {

//ปุ่มกด

//------PB 1 (D3)---------------------------------------------------------------------------//
      if (pin1  == 0) {
        uint8_t  curBtnState1 = digitalRead(D3);
        if ((curBtnState1 != prevBtnState1) && prevBtnState1 == HIGH) {

          Device_1_On();
        }
        prevBtnState1 = curBtnState1;

      }

      if (pin1  == 1) {
        uint8_t curBtnState1 = pcf8575_1.digitalRead(P0);
        if ((curBtnState1 != prevBtnState1) && prevBtnState1 == HIGH) {

          Device_1_Off();
        }
        prevBtnState1 = curBtnState1;
      }


}

แค่นี้ระหว่างปุ่ม Push button กับปุ่ม ON OFF ของ Blynk ก็ทำงานสัมพันธ์กันแล้วครับ

  1. จาก โค้ด จะมีตัวแปรที่ทำหน้าที่เป็นตัวกลางระหว่าง ปุ่ม ON OFF ของ Blynk กับ Push button คือ ฟัังก์ชั่น Device_1_On(); กับ Device_1_Off();

  2. เมื่อฟังก์ชั่นตัวไหนทำงานก็เอาค่า ไปเก็บใน EEPROM เพื่อให้ทำงานต่อเนื่องจากของเดิมกรณีไฟดับ ESP8266 Restart หรือ การเชื่อมต่อ Blynk หลุด ครับ ขอให้สำเร็จนะครับ

2 Likes