Tawatchai (TWC ) August 18, 2020, 11:34am #1
รบกวนขอคำแนะนำหน่อยนะครับพอดีผมเป็นมือใหม่พึ่งหัดเล่นนะครับ ผมอยากทราบว่าจะทำให้ค่าที่กดจาก 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
PUYIOT August 18, 2020, 4:22pm #2
เอาที่ผมพอรู้นะครับ
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
Tawatchai (TWC ) August 18, 2020, 8:38pm #3
ตอนนี้ สไลด์บาร์ ได้แล้วนะครับ เหลือแต่ ปุ่ม button บน blynk นะครับ ซึ่งผมไม่รู้วิธีการให้ซิงค์กันนะครับพอจะแนะนำผมได้ไหมครับ
Remy_Martin (Permpol Thanapunnamas) August 19, 2020, 3:14am #4
แล้วตอนนี้ทำอะไรได้แล้วบ้างครับ
Tawatchai (TWC ) August 19, 2020, 3:56am #5
ตอนนี้สำหรับ ปิด- เปิดไฟ ทำได้ก็คือ กดปุ่ม C ตรง keypad แล้วไฟติดกดอีกครั้งดับ และ LED บน blynk ก็ติดดับพร้อมกันได้แล้ว แต่ปุ่ม button ที่ blynk กดสั่งงานไม่ได้เลยครับ ตอนนี้กดควบคุมได้แต่ปุ่ม C อย่างเดียวครับ
Remy_Martin (Permpol Thanapunnamas) August 19, 2020, 3:59am #6
เบื้องต้นศึกษาจากกระทู้นี้ครับ
1 Like
PUYIOT August 19, 2020, 9:03am #7
#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 ก็ทำงานสัมพันธ์กันแล้วครับ
- จาก โค้ด จะมีตัวแปรที่ทำหน้าที่เป็นตัวกลางระหว่าง ปุ่ม ON OFF ของ Blynk กับ Push button คือ ฟัังก์ชั่น Device_1_On(); กับ Device_1_Off();
- เมื่อฟังก์ชั่นตัวไหนทำงานก็เอาค่า ไปเก็บใน EEPROM เพื่อให้ทำงานต่อเนื่องจากของเดิมกรณีไฟดับ ESP8266 Restart หรือ การเชื่อมต่อ Blynk หลุด ครับ ขอให้สำเร็จนะครับ