Remy_Martin
(Permpol Thanapunnamas)
พฤศจิกายน 11, 2019, 4:45am
1
กระทู้นี้เป็นการแสดงตัวอย่างการใช้งาน Button ทั้งสอบแบบ แบบแรกคือ พื้นฐาน ไม่สามารถปรับขนาดได้
แบบที่สองจะเป็นปุ่มเล็ก สามารถปรับขนาดได้ตามใจ แต่ราคาก็จะอัพขึ้นมานิดหน่อย
ถ้าเราเลือกแบบใช้ Digital เราก็ฟิก GPIo ตามบอร์ดนั้นได้เลย ไม่ต้องใส่โค้ตอะไร
ส่วนแบบ Virtual ก็จะเป็นการฟิกแบบเอาไปใช้กับอัลกอลิทึกเราต่ออีกทีเหมาะกับการใช้งานที่มีความซับซ้อน แบบนี้ต้องใส่โค้ตตามด้านล่างจริงจะทำงานได้
ส่วนโค้ตก็ใช้แบบนี้ได้ทั้งสองแบบ เหมือนกัน กดปุ่มให้ on และ กดอีกที ก็ off
char Relay1 = 12;
void setup()
{
Serial.begin(115200);
pinMode(Relay1, OUTPUT);
WiFi.begin(ssid, pass);
Blynk.config(auth, server, port);
Blynk.connect(); // for Blynk's cloud server if WiFi already connected
}
BLYNK_WRITE(V1)
{
if (param.asInt()==1) {
digitalWrite(Relay1, HIGH);
}else{
digitalWrite(Relay1, LOW);
}
}
void loop()
{
Blynk.run();
}
อีกเรื่องคืออย่าลืมตั้งค่าปุ่มด้วยว่าอยากให้กดติดปล่อยดับ push หรือ แบบกดติด กดดับ switch
Stun_TV
(Stun TV)
มกราคม 13, 2020, 2:45pm
2
ถ้าผมต้องการกดปุ่มONในแอพBlynkเป็นเวลา5วินาที ครบ5วินาทีล่ะOFFปิดเองอัตโนมัติ ผมควรทำไงครับ
1 Likes
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 13, 2020, 3:00pm
3
โค้ตน่าจะประมาณนี้ครับ
...
BlynkTimer timer; // Timer object for the DHT sensor
// This function reads the DHT 11 sensor and saved the temparature and humdity reading to V5 and V6
void sendSensor()
{
...
// Please don't send more that 10 values per second.
// 1 decimal
Blynk.virtualWrite(V5, String(h, 1));
Blynk.virtualWrite(V6, String(t, 1));
// 0 decimal
//Blynk.virtualWrite(V5, (int) h);
//Blynk.virtualWrite(V6, (int) t);
}
// This function initiates, completed the charger relay, and counts down the charge time
void countCharger()
{
...
Blynk.virtualWrite(V2, chargeCounter); // Update the counter to V2 to display the remaining time in the app in seconds
...
}
// This function gets called when the charger button is turned on/off in the app
BLYNK_WRITE(V1)
{
int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable in seconds
...
chargeCounter = chargeTime; // Set the internal counter value in second
Blynk.virtualWrite(V2, chargeCounter); // Update the remaining time in the app in seconds
...
}
void setup()
{
...
// Setup up the callback functions. DHT read every 5 seconds, charger countdown ever second.
timer.setInterval(5050L, sendSensor);
timer.setInterval(1000L, countCharger);
}
void loop()
{
Blynk.run();
// Kick off the timers
timer.run();
}
ถ้าจะให้อธิบายสักหน่อย เดียวจะมีบทความเรื่อง timer มาลงครับ ช่วงนี้ติดงานโปรเจค
Stun_TV
(Stun TV)
มกราคม 13, 2020, 4:48pm
5
คือในโค้ดนี้ต้องใช้ควบกับDHTหรอครับ
BLYNK_WRITE(V1) //คำสั่งนี้คือของปุ่มBotton ใช้มั้ยครับ
Blynk.virtualWrite(V2, chargeCounter); //คำสั่งนี้คือของTimer หรือไม่ครับ ผมเข้าใจถูกมั้ยครับ
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 13, 2020, 6:19pm
6
เป็นส่วนของการแสดงผลครับ ให้ส่งค่า chargeCounter
ซึ่งก็คือค่าที่นับ + ไปเรื่อยๆ ด้วยคำสั่งนี้ครับ
timer.setInterval(1000L, countCharger);
คำสั่งนี้จะเข้าไปทำงานในฟังก์ชันนี้ ทุกๆ 1 วินาที
void countCharger()
{
...
Blynk.virtualWrite(V2, chargeCounter); // Update the counter to V2 to display the remaining time in the app in seconds
...
}
ถ้าเซ็นเซอร์ไม่มี ก็ตัดส่วนนี้ออกไปครับ
timer.setInterval(5050L, sendSensor);
ทีนี้พอเรามีเวลาในโปรแกรมแล้วเราก็เอาเวลาในส่วนนี้แหละครับมาใช้อ้างอิงในการกดปุ่มให้มัน หน่วงไปเท่าไหร่ โดนอิงกับ เวลาที่เรามีนี้
11167
(ธีรพล สุภวาร)
มกราคม 14, 2020, 4:31pm
7
มีสอนครบทุกฟังชั่นหรือยังครับ
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 14, 2020, 5:00pm
8
ส่วนตัวเคยใช้งานมาเกือบทุกฟังก์ชันแล้วครับ กำลังเขียนคู่มืออยู่ ทำงานประจำด้วยเลยไม่ค่อยมีเวลา ตอนนี้อาสัยตอบตามที่มีกระทู้ถามมาก่อนครับ
Stun_TV
(Stun TV)
มกราคม 28, 2020, 1:54pm
9
คือผมยังงงอยู่น่ะครับ
นี้โค้ดทั้งหมดของผม
#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0 // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22 // DHT 11 ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 2; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 16; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 5; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม
char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "vivo1606";
char pass[] = "9876543210";
BlynkTimer timer;
DHT dht(DHTPIN, DHTTYPE);
void myTimerEvent()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
else
{
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.println(t);
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V4, t);
}
}
void setup()
{
Serial.begin(115200);
pinMode(sensorPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
Blynk.connect();
dht.begin();
Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
timer.setInterval(2000L, myTimerEvent);
}
BLYNK_WRITE(V1)
{
}
BLYNK_WRITE(V3)
{
}
BLYNK_WRITE(V6)
{
if (param.asInt() == 1) {
digitalWrite(Relay3, LOW);
} else {
digitalWrite(Relay3, HIGH);
}
delay(1000);
}
void loop()
{
float EC = adc.readADC(0);
Blynk.virtualWrite(V2, EC);
Serial.print("EC = " );
Serial.println(adc.readADC(0));
sensorValue = analogRead(A0);
if (sensorValue >= 640 && sensorValue <= 1024)
{
Serial.println(sensorValue);
digitalWrite(RelayPin, HIGH);
delay(1500);
}
else {
Serial.println(sensorValue);
digitalWrite(RelayPin, LOW);
delay(1000);
}
delay(1000);
Serial.print("Sensor = " );
Serial.println(sensorValue);
Blynk.run();
timer.run(); // Initiates BlynkTimer
}
คือผมต้องการให้ปั๊มน้ำสองตัวทำงานแค่5วิ ของBLYNK_WRITE(V1) ,BLYNK_WRITE(V3)
ผมควรทำไงครับ
Stun_TV
(Stun TV)
มกราคม 28, 2020, 5:21pm
10
ผมอยากรู้ว่าในส่วนที่วงไว้นี้คือV2นี้คือตัวไหนในแอพBlynkหรอครับ
โค้ดที่พี่บอกมานี้มีเท่านี้ใช้มั้ยครับ
(ขอบคุณครับ)
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 28, 2020, 10:36pm
11
ต้องอ้างอิงเวลาจาก ฟังก์ชันนี้ครับ
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 28, 2020, 10:39pm
12
ส่วนนี้เป็นการใช้ display เพื่อแสดงเวลาในการนับครับเราไม่รู้ว่ามันนับเวลาไปถึงไหนแล้วเราเลยเอา display มากำหนดเป็น v2 เพื่อดูว่ามันนับไปเท่าไหร่แล้วครับ
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 29, 2020, 1:10am
14
แก้ไขหน่อยครับๆ ให้อ้างอิงจากฟังก์ชันนี้นะ
timer.setInterval(1000L, countCharger);
คำสั่งนี้จะเข้าไปทำงานในฟังก์ชันนี้ ทุกๆ 1 วินาที
ตัวอย่างโดยประมาณที่จะหน่วง 5 วิ
int x_time = 0;
bool _x_time = false;
BLYNK_WRITE(V1)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time = 0;
_x_time = true;
pump = HIGH; //สั่ง เปิด ปั๊ม
}else{
_x_time = false;
}
}
void countCharger(){
if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump = LOW; //สั่ง ปิด ปั๊ม
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
_x_time = false;
}
}
}
ผมเขียนคร่าวๆ นะครับลองไปเติมต่อเอง
Stun_TV
(Stun TV)
มกราคม 30, 2020, 1:12pm
16
พี่ครับ ผมลองเติมต่อแล้วแต่ก็ยังใช้งานได้ไม่ได้ ขารีเลย์เข้าขาไหนผมงงหมดเลยครับ
Stun_TV
(Stun TV)
มกราคม 30, 2020, 1:56pm
18
#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0 // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22 // DHT 11 ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 12; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 17; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 5; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม
char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "vivo1606";
char pass[] = "9876543210";
BlynkTimer timer;
BlynkTimer sensor; // Timer object for the DHT sensor
BlynkTimer charger; // Timer object for the charger
DHT dht(DHTPIN, DHTTYPE);
int x_time = 16;
bool _x_time = false;
int chargeCounter = 0;
int chargeTime = 2;
int pump = LOW;
int x_time1 = 0;
bool _x_time1 = false;
int chargeCounter1 = 0;
int pump1 = LOW;
void myTimerEvent()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
else
{
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.println(t);
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V4, t);
}
}
void setup()
{
Serial.begin(115200);
pinMode(sensorPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
Blynk.connect();
dht.begin();
Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
timer.setInterval(5050L, myTimerEvent);
timer.setInterval(1000L, countCharger);
timer.setInterval(1000L, countCharger1);
}
void countCharger()
{
if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump = LOW;
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V10,chargeCounter);
_x_time = false;
}
}
}
void countCharger1()
{
if(_x_time1 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time1++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time1 > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump1 = LOW;
Blynk.virtualWrite(V3, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V11, chargeCounter1);
_x_time1 = false;
}
}
}
BLYNK_WRITE(V1)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time = 16;
_x_time = true;
}else{
_x_time = false;
// Set the internal counter value in second
chargeCounter = chargeTime;
Blynk.virtualWrite(V10,chargeCounter);
}
}
BLYNK_WRITE(V3)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time1 = 0;
_x_time1 = true;
}else{
_x_time1 = false;
// Set the internal counter value in second
Blynk.virtualWrite(V11, _x_time1);
}
}
BLYNK_WRITE(V6)
{
if (param.asInt() == 1) {
digitalWrite(Relay3, LOW);
} else {
digitalWrite(Relay3, HIGH);
}
delay(1000);
}
void loop()
{
float EC = adc.readADC(0);
Blynk.virtualWrite(V2, EC);
Serial.print("EC = " );
Serial.println(adc.readADC(0));
sensorValue = analogRead(A0);
if (sensorValue >= 640 && sensorValue <= 1024)
{
Serial.println(sensorValue);
digitalWrite(RelayPin, HIGH);
delay(1500);
}
else {
Serial.println(sensorValue);
digitalWrite(RelayPin, LOW);
delay(1000);
}
delay(1000);
Serial.print("Sensor = " );
Serial.println(sensorValue);
Blynk.run();
timer.run(); // Initiates BlynkTimer
}
ปุ่มกดในแอพตอนนี้กดค้างล่ะดับเองประมาณ5วิแล้วครับ แต่ไฟของรีเลย์ไม่ขึ้นขณะทำการกดครับ
Stun_TV
(Stun TV)
มกราคม 30, 2020, 3:02pm
19
#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0 // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22 // DHT 11 ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 12; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 17; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 15; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม
char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "vivo1606";
char pass[] = "9876543210";
BlynkTimer timer;
BlynkTimer sensor; // Timer object for the DHT sensor
BlynkTimer charger; // Timer object for the charger
DHT dht(DHTPIN, DHTTYPE);
int x_time = 16;
bool _x_time = false;
int chargeCounter = 0;
int chargeTime = 2;
int pump = LOW;
int x_time1 = 0;
bool _x_time1 = false;
int chargeCounter1 = 0;
int pump1 = LOW;
void myTimerEvent()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
else
{
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.println(t);
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V4, t);
}
}
void setup()
{
Serial.begin(115200);
pinMode(sensorPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
pinMode(x_time, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
digitalWrite(x_time, HIGH);
Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
Blynk.connect();
dht.begin();
Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
timer.setInterval(5050L, myTimerEvent);
timer.setInterval(1000L, countCharger);
timer.setInterval(1000L, countCharger1);
}
void countCharger()
{
if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump = LOW;
digitalWrite(x_time, HIGH);
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V10,chargeCounter);
_x_time = false;
}
}
}
void countCharger1()
{
if(_x_time1 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time1++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time1 > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump1 = LOW;
Blynk.virtualWrite(V3, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V11, chargeCounter1);
_x_time1 = false;
}
}
}
BLYNK_WRITE(V1)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time = 16;
_x_time = true;
digitalWrite(x_time, LOW);
}else{
_x_time = false;
// Set the internal counter value in second
chargeCounter = chargeTime;
digitalWrite(x_time, HIGH);
Blynk.virtualWrite(V10,chargeCounter);
}
}
BLYNK_WRITE(V3)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time1 = 0;
_x_time1 = true;
}else{
_x_time1 = false;
// Set the internal counter value in second
Blynk.virtualWrite(V11, _x_time1);
}
}
BLYNK_WRITE(V6)
{
if (param.asInt() == 1) {
digitalWrite(Relay3, LOW);
} else {
digitalWrite(Relay3, HIGH);
}
delay(1000);
}
void loop()
{
float EC = adc.readADC(0);
Blynk.virtualWrite(V2, EC);
Serial.print("EC = " );
Serial.println(adc.readADC(0));
sensorValue = analogRead(A0);
if (sensorValue >= 640 && sensorValue <= 1024)
{
Serial.println(sensorValue);
digitalWrite(RelayPin, HIGH);
delay(1500);
}
else {
Serial.println(sensorValue);
digitalWrite(RelayPin, LOW);
delay(1000);
}
delay(1000);
Serial.print("Sensor = " );
Serial.println(sensorValue);
Blynk.run();
timer.run(); // Initiates BlynkTimer
}
ตอนนี้รีเลย์ทำงานแล้วครับ แต่ปัญหาคือพอกดปุ่มให้ทำงานในแอพพอถึงระยะปิดเองก้ปกติ แต่พอจะกดทำงานอีกรอบรีเลย์ก็ไม่ทำงานแล้วครับ
Remy_Martin
(Permpol Thanapunnamas)
มกราคม 30, 2020, 3:26pm
20
ทำงานอีกรอบอยู่ใน loop ไหนครับ