โปรเจ็คนี้ผมทำมาหลายเดือนแล้ว
แก้ไขไป ปรับปรุงไป
ณ จุดนี้
1.ควบคุมปั๊มน้ำ
2.ควบคุมเครื่องกรองน้ำ
3.ปิดเปิดไฟเวลากลางคืน
ใช้ mcu8266 พังไปแล้ว2ตัว, ตอนนี้ตัวที่3แล้วครับ…เพิ่งเปลี่ยนวันนี้
เดี๋ยวถ้ามีเวลาผมค่อยทะยอยเล่าให้ฟังว่า เจอปัญหาอะไรบ้าง
blynk
21สค65
มีปัญหาว่าปั๊มไม่ทำงาน
เลยมาดูโดยไม่ต่ โน้ตบุก ใช้แต่มือถือ สังเกตว่า nodeทำงานแบบเปิด(รีเลย์)แบบกะพริบๆ
และไม่ต่อblynk
ตอนแรกสงสัยไฟจากแบตต่ำไป ก็เอาwall charge มาเสียบตรงทึ่nodeและถอดสายออกจากpinให้หมด และกดreset อาการเหมือนเดิม คือ led กะพริบเป็นช่วงๆ blynk ก็ไม่ต่อ
วินิจฉัยไม่ได้เพราะไม่ดูในserial monitor
เลยเช็ค ssid ดู, ปรากฏว่าssid ที่nodeใช้ประจำ ไม่มีในรายชื่อเลย
พอมาดู ตัวปล่อย ssid ดังกล่าวดับ 555
(รูปนี่ถ่ายตอนทำงานแล้ว)
ผมเสียบปลั๊กใหม่ และกดรีเซ็ตใหม่ และได้ปล่อย สัญญาณwifiออกมา
มาดูที่nodemcu กลับทำงานปกติแล้ว
แสดงว่า มีโค้ดที่ใช้อยู่ตอนนี้ มันจะหยุดทันทีเมื่อไม่ต่อwifi ซึ่งผมไม่รู้มาก่อนว่าจะเกิดเหตุการณ์แบบนี้
เดี๋ยวภายหลังจะปรึกษาเพื่อนๆเรื่องแก้โค้ดแบบไม่ให้หยุดทำงานแม้ว่า ไม่มีwifi
21/8/65
โค้ดดังนี้ครับ
//ขาที่ใช้แล้วได้แก่ D0(pump),D1(ledclose),D2(ledopen),D3(lamp),D4(dht),D5(fan),D6(valve),D7(infrared);
//Blynk
//V0=PUMPBLYNK (led) ปั๊มน้ำ,V1=LIGHTBLYNK (led),V2=ssid (value display),V3=pump state(value display),V4=temperature(gauge),
//V5=เปิดปิดหลอดไฟ(swith button),V6=logเปิดวาล์วกรองน้ำ(terminal),V7=logปิดวาล์วกรองน้ำ(terminal)
//V8=logเปิดปั๊มน้ำ(terminal),V9=logปิดปั๊มน้ำ(terminal),V10=logเปิดหลอดไฟ(terminal),V11=เวลา(value display)
//V12=วันที่(value display),V13=logปิดหลอดไฟ(terminal),V14=log เปิดพักลม,V15=log ปิดพักลม,V15
int pump = D0;
#define pump_ON 120000 //milliseconds
#define pump_OFF 60000
unsigned long pump_ms; //time from millis()
unsigned long pump_msLast; //last time the LED changed state
boolean pump_State; //current LED state
int ledclose = D1;
int ledopen = D2;
int lamp = D3;
#include <Adafruit_Sensor.h>
#include "DHT.h"
#define DHTPIN D4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
float temperature;
float humidity;
int fan = D5;
//น้ำกรอง
int infrared = D7;
int valve = D6;
int val = 0;
unsigned long myTime;
//1 ขึ้น Blynk
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "5XynaCD6C0xPj0N2fpb4tXGXb8YDwTxz";
WidgetLED PUMPBLYNK(V0);
WidgetLED LIGHTBLYNK(V1);
//V4ใช้แล้ว Gauge อุณหภูมิ
///
BlynkTimer timer;
//-4.ดึงเวลาจากเน็ตมาใช้เปิดปิดไฟ
#include <NTPClient.h>
#include <time.h>
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
int currentHour;
int currentMinute;
int monthDay;
int currentMonth;
//-1·แจ้งทางไลน์
#include <TridentTD_LineNotify.h>
#define LINE_TOKEN "xxxxaiPX" // ใส่ รหัส TOKEN ป้านปากาปาแย- xxxxxaiPX
#include <WiFiUdp.h>
char* ssid[] = {"aaa", "bbb","ccc","ddd"}; //Array containing any wifi networks the device can use
char* pass[] = {"AAA", "BBB","CCC","DDD"}; //Array containing associated wifi passwords
int i = 0;
int w = 0;
int wifi_timeout = 10; //Timeout for each connection attempt (seconds)
#define SSID_COUNT (sizeof(ssid)/sizeof(ssid[0])) //Determines the number of SSIDs in ssid[] array
int a=0;
WiFiUDP ntpUDP;
// กำหนดค่า offset time เนื่องจากเวลาของเซิฟเวอร์นี้เป็นเวลา UTC เราต้องทำให้เป็นเวลาของประเทศไทย
// เวลาของประเทศไทย = UTC+7 ชั่วโมง ต้องกำหนด offset time = 7 ชั่วโมง
const long offsetTime = 25200; // หน่วยเป็นวินาที จะได้ 7*60*60 = 25200
// กำหนด object ของ WiFiUDP ชื่อว่า ntpUDP
NTPClient timeClient(ntpUDP, "pool.ntp.org");
//Week Days
String weekDays[7]={"อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์"};
//Month names
String months[12]={"มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"};
String string_close;
String string_open;
void setup() {
Serial.begin(9600);
//Attempt connection with the first SSID in the array (index 0)
WiFi.begin(ssid[w], pass[w]);
Serial.print("Connecting to ");
Serial.println(ssid[w]);
while (WiFi.status() != WL_CONNECTED) {
//If timeout is reached, increment w counter, try the next wifi network
if (i == wifi_timeout){
Serial.println("");
w++;
//Make sure we havent reached the end of the list of SSIDs
if (w < SSID_COUNT){
Serial.println("Switching to alternate SSID...");
WiFi.begin(ssid[w], pass[w]);
Serial.print(ssid[w]);
delay(100);
} else {
//If we have tried all the defined SSIDs, reboot and try again, or change to break; and continue on with program
Serial.println("No WiFi connection available, rebooting...");
ESP.restart();
}
i = 0;
} else {
Serial.print(".");
delay(500);
}
i++;
}
if (WiFi.status() == WL_CONNECTED){
Serial.println("");
Serial.print("Connected to: ");
Serial.print(WiFi.SSID());
Serial.print(", Signal: ");
Serial.println(WiFi.RSSI());
}
// Blynk.begin(auth, ssid[w], pass[w]);
Blynk.begin(auth, ssid[w], pass[w], "oasiskit.com", 8080);
// Initialize a NTPClient to get time
timeClient.begin();
// Set offset time in seconds to adjust for your timezone, for example:
// GMT +1 = 3600
// GMT +7 = 25200
// GMT -1 = -3600
// GMT 0 = 0
timeClient.setTimeOffset(25200);
pinMode(pump, OUTPUT);
pinMode(ledclose, OUTPUT);
pinMode(ledopen, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(lamp, OUTPUT);
// น้ำกรอง
pinMode(infrared, INPUT);
pinMode(valve, OUTPUT);
digitalWrite(valve, 0);
//-2 ตรวจสอบอุณหภูมิ
// timer.setInterval(100L, timecheck);
//-1·แจ้งทางไลน์
// กำหนด Line Token
LINE.setToken(LINE_TOKEN);
//-4.ดึงเวลาจากเน็ตมาใช้เปิดปิดไฟ
configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server
Serial.println("\nLoading time");
while (!time(nullptr)) {
Serial.print("*");
delay(100);
}
Serial.println("");
Blynk.syncAll();
}
void loop(void) {
string_close="|| ปิดเวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth);
string_open= "|| เปิดเวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth);
Blynk.virtualWrite(V2, (ssid[w]));
pumptask();
timecheck();
Blynk.virtualWrite(V3, pump_State);
filter();
fantask();
}
//////////////////////////
void timecheck()
{
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
String formattedTime = timeClient.getFormattedTime();
Serial.print("Formatted Time: ");
Serial.println(formattedTime);
currentHour = timeClient.getHours();
Serial.print("Hour: ");
Serial.println(currentHour);
currentMinute = timeClient.getMinutes();
Serial.print("Minutes: ");
Serial.println(currentMinute);
int currentSecond = timeClient.getSeconds();
Serial.print("Seconds: ");
Serial.println(currentSecond);
String weekDay = weekDays[timeClient.getDay()];
Serial.print("Week Day: ");
Serial.println(weekDay);
//Get a time structure
struct tm *ptm = gmtime ((time_t *)&epochTime);
monthDay = ptm->tm_mday;
Serial.print("Month day: ");
Serial.println(monthDay);
currentMonth = ptm->tm_mon+1;
Serial.print("Month: ");
Serial.println(currentMonth);
String currentMonthName = months[currentMonth-1];
Serial.print("Month name: ");
Serial.println(currentMonthName);
int currentYear = ptm->tm_year+1900;
Serial.print("Year: ");
Serial.println(currentYear);
//Print complete date:
String currentDate = String(weekDay) + "-" +String(monthDay) + "-" + String(currentMonth) + "-" + String(currentYear) ;
Serial.print("Current date: ");
Serial.println(currentDate);
// Send time to the App
Blynk.virtualWrite(V11, formattedTime);
Blynk.virtualWrite(V12, currentDate);
if ((currentHour >5) && (currentHour<18))
{
Serial.println("เป็นเวลากลางวัน ปิดไฟ");
Blynk.virtualWrite(V13, string_close);//V13 log ปิดหลอดไฟ
digitalWrite(lamp, LOW);
LIGHTBLYNK.off();
myTime = millis();
if ( myTime%3600000<2000)
{
LINE.notify("เป็นเวลากลางวัน ปิดไฟ");
}
}
else
{
Serial.println("เป็นเวลากลางคิน เปิดไฟ");
digitalWrite(lamp, HIGH);
Blynk.virtualWrite(V10, string_open);//V10 log เปิดหลอดไฟ
LIGHTBLYNK.on();
myTime = millis();
if ( myTime%3600000<2000)
{
LINE.notify("เป็นเวลากลางคิน เปิดไฟ");
}
}
}
/////////////////////////////////////////////
void filter()
{
val = digitalRead(infrared);
Serial.print("val: ");
Serial.println(val);
if (val == 0) {
Serial.println("เต็ม ");
myTime = millis();
if ( myTime%3600000<2000)
{
LINE.notify("น้ำเต็ม");
LINE.notify("ปิดวาล์ว");
}
digitalWrite(valve, LOW);
Blynk.virtualWrite(V7, string_close);//V7 log close valveน้ำกรอง
}
else {
Serial.println("น้ำเหลือน้อย");
Serial.println("เปิดวาล์ว");
myTime = millis();
if ( myTime%3600000<2000)
{
LINE.notify("น้ำใกล้หมด");
LINE.notify("เปิดวาล์ว");
}
digitalWrite(valve, HIGH);
Blynk.virtualWrite(V6, string_open);//V6 log open valveน้ำกรอง
}
}
/////////////////////////////
BLYNK_WRITE(V5)
{
if (param.asInt()==1) {
digitalWrite(lamp, HIGH);
Serial.println("เปิดไฟ");
Blynk.setProperty(V1,"color","#0xFFFF");// เปลี่ยนสีของหลอดไฟเป็นสีฃาว
}else{
Serial.println("ปิดไฟ");
digitalWrite(lamp, LOW);
Blynk.setProperty(V1,"color","#0x0000");// เปลี่ยนสีของหลอดไฟเป็นสีดำ
}
}
BLYNK_WRITE(V8)
{
if (param.asInt()==1) {
digitalWrite(pump, HIGH);
Blynk.virtualWrite(V8, string_open);//V8 log open pump
digitalWrite(ledopen, HIGH);
digitalWrite(ledclose, LOW);
Serial.println("เปิดปั๊มน้ำ");
Blynk.setProperty(V0,"color","#FF4000");// เปลี่ยนสีของปั๊มเป็นสีแดง
}else{
digitalWrite(pump, LOW);
Blynk.virtualWrite(V9, string_close);//V9 log close pump
digitalWrite(ledclose, HIGH);
digitalWrite(ledopen, LOW);
Serial.println("ปิดปั๊มน้ำ");
Blynk.setProperty(V0,"color","#2EFE2E");// สีเขียว
}
}
///////////////////////////////////////////////////
void fantask()
{
//-2 ตรวจสอบอุณหภูมิ
temperature = dht.readTemperature();
if (isnan(temperature)){
Serial.println("Failed to read from DHT");
temperature = 0.0;
}
else
{
Serial.println("เครื่องนี้");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" ºC");
}
Blynk.virtualWrite(V4, temperature);
Serial.print("\t");
Serial.print("อุณหภูมิ");
Serial.println(temperature, 1);
if (temperature>49)
{
digitalWrite(fan, HIGH);
Blynk.virtualWrite(V14, string_open);//V14 log เปิดพักลม
Serial.println("เปิดพักลม");
myTime = millis();
if ( myTime%1200000<2000)
{
LINE.notify("อุณหภูมิ=");
LINE.notify(temperature);
LINE.notify("เปิดพัดลม");
}
delay(20000);
digitalWrite(fan, LOW);
}
else
{
digitalWrite(fan, LOW);
Blynk.virtualWrite(V15, string_close);//V15 log ปิดพักลม
Serial.println("ปิดพักลม");
myTime = millis();
if ( myTime%1200000<2000)
{
LINE.notify("อุณหภูมิ=");
LINE.notify(temperature);
LINE.notify("ปิดพัดลม");
}
}
}
//////////
void pumptask()
{
pump_ms = millis();
if (pump_ms - pump_msLast > (pump_State ? pump_ON : pump_OFF))
{
digitalWrite(pump, pump_State = !pump_State);
pump_msLast = pump_ms;
}
if (pump_State==1)
{
PUMPBLYNK.on();
digitalWrite(ledopen, HIGH);
digitalWrite(ledclose, LOW);
Serial.println("เปิดปั๊มน้ำ");
Blynk.virtualWrite(V8, string_open);//V8 log open pump
// Blynk.setProperty(V0,"color","#FF4000");// เปลี่ยนสีของปั๊มเป็นสีแดง
myTime = millis();
if ( myTime%1800000<2000)
{
LINE.notify("ปั๊มน้ำปากาปาแยเปิด");
}
}
else
{
PUMPBLYNK.off();
digitalWrite(ledclose, HIGH);
digitalWrite(ledopen, LOW);
Serial.println("ปิดปั๊มน้ำ");
Blynk.virtualWrite(V9, string_close);//V9 log close pump
// Blynk.setProperty(V0,"color","#2EFE2E");// สีเขียว
myTime = millis();
if ( myTime%1800000<2000)
{
LINE.notify("ปั๊มน้ำปากาปาแยปิด");
}
}
}
////////////////////////
อัพเดต
เจอแล้วคือ ESP.restart()
ผม disable ออกก็ไม่เป็นไรแล้วครับ
ระบบกรองน้ำ
ใช้แผ่นโฟมที่ขึ้นลงตามระดับน้ำ ช่วยสะท้อนแสงinfraredได้ดีกว่าผิวน้ำ
เจอฝาของมันแล้ว สวยงามเลย
เป็นวาล์ว12vdc ที่คุมโดยnodemcuผ่านรีเลย์
22สค65
1.น้ำไม่ไหล
2.ต่อมาเจอปัญหาน้ำกรองล้นไม่ยอมหยุด
สาเหตตรวจพบ
1.ไฟสำรองไม่พอ ต้องเอาไฟจากwall charge มาเสียบตรงที่nodemcuโดยตรง
2.สายสัญญาณจากเซ็นเซอร์อินฟราเรดที่เก็บน้ำกรองหลุดจากnodemcu
3.ต่อมาเซ็นเซอร์อินฟราเรด ร้อน และไฟledค้าง ปกติledจะดับเมื่อไม่เจอวัตถุใกล้ๆ
แปลน
1.แบต18650 2 ก้อน ลองต่ออนุกรม ให้ได้ 7v เพื่อเลี้ยงnodemcu เพราะnodemcuมีโหลดไปยังเซ็นเซอร์และรีเลย์ หลายตัว
2.ลดความแออัดในตู้control จะได้ไม่หลุดอีก
3.เปลี่ยน เซ็นเซอร์อินฟราเรดตัวใหม่ หลังจากตัวเก่าใช้มา3เดือนแล้ว
ตัวเก่า
ตัวใหม่
อัพเดต
เช็คใหม่เซ็นอินฟราเรดเดิม กลับสู่ภาวะปกติแล้ว ใช้ของเดิมต่อ
***ผมเอามือวางใกล้ๆเซ็น4จะไม่เห็น, พอลองใช้โฟม เซ็นเซอร์จะตอบสนองดีมาก
แบต18650 2ตัว, module charge2ตัว
ต่อปกติ B+, B- เข้าแบตของใครของมัน
แต่ out+ และ out- ผมต่ออนุกรม
และเปลี่ยนใช้สาย2.5ตร.มม.หมด
และมีตัวชาร์จเข้า 18650 แต่ที่ชาร์จขนาดเล็ก
อัพเดต
หลังจากผมout+ และ out- ผมต่ออนุกรม
ปรากฏว่า charge module 1 ตัวร้อนมากๆ และวัดโวลต์รวมได้ 3.7v ไม่ได้7v ตามทึ่คิด เลยแยกออก ให้โมดูลชาร์จ ของใครของมัน ทีนี่เพิ่มสายต่อขั้ว + ของ18650ก้อนที่1 ต่อเข้าขั้ว - ของก้อนที่2 จากนั้นวัดโวลต์ ระหว่าง - ของก้อน1 และ+ ของก้อน2 ได้ 7โวลต์แล้ว
ทีนี่ผมเอาสาย ที่ได้7โวลต์นี้ต่อเข้า Vin และ gnd ของnodemcu ปรากฏว่า ทำงานได้แล้ว
อัพเดต
ตอน22.00น. ระบบกรองน้ำทำงานเพี้ยน คือ 1.เซ็นเซอร์อินฟราเรดน้ำกรองไม่ทำงาน แม้ว่าน้ำจะเต็มหรือไม่ก็ตาม
2.nodemcuก็หยุดทำงาน
ผมคิดว่า น่าเป็นระบบสำรองไฟยังไม่ดีพอ
ผมเลยเอาเพาเวอร์แบ็งค์ใช้แทนแบต18650 และจากเพาเวอร์แบงค์เสียบusbของnodemcuเลย ปรากฏว่าทำงานปกติเหมือนเดิม โดยใช้wall charge เดิมมาชาร์จ เพเวอร์แบงก์ไปด้วย
อัพเดต
23/8/65
7.00น. nodemcu ดับอีกแล้ว และ เพเวอร์แบงก์ ไฟก็หมดเกลี้ยง!!!
รู้ปัญหาแล้วว่า ไฟชาร์จเข้าไม่พอ เลยเปลี่ยน wallcharger เอาที่แรงขึ้น
เอาแบบฟาสต์ชาร์จ เสียบเข้า เพเวอร์แบงก์ แทนของเดิม
วัดกระแสการการใช้งานของnodemcu
จริงๆแล้วควรวัดกระแสการใช้งานตั้งแต่เริ่มแรกที่โปรเจคเสร็จ แต่ผมรู้สึกว่า wall chargeทั่วไปน่าจะพอ เห็นเขาบอกว่า nodemcu กินไฟระดับ แค่หลักสิบมิลลิแอมป์ น่าจะไม่เกินมือถือ เลยไม่เคยวัด เลยใช้วิธีลองใช้เรื่อยๆ พอถึง ณ ตอนนี้ มันชัดเจนว่าไม่พอซะแล้ว คิดผิดซะแล้ว
ผมใช้สาย usb ปอกเปลือกดู ว่าข้างในมีสายไฟกี่เส้น มีกี่เส้น ถ้ามีแค่2เส้น แสดงว่ามีเส้น +, - เท่านั้น แต่ถ้ามีมากกว่า2เส้น แสดงว่ามีสายดาต้าอยู่ด้วย
ของผมมี2เส้น เลยตัดให้ขาด1เส้น เพื่อใช้มัลติมิเตอร์คร่อมระหว่างกลางเพื่อวัดกระแส
kkkkkkkkkkkkk
วัด จากwall chargeตัวเล็ก เพื่อต่อเข้า เพเวอร์แบงก์ (เริ่มต้นมีไฟ20%)
=52mA
kkkkkkkkkkkkkk
วัด จากwall chargeตัวเล็ก เพื่อต่อเข้า nodemcu
=146mA
ทำงานปกติ
kkkkkkkkkkk
วัด จากwall chargeตัวใหญ่ เพื่อต่อเข้า nodemcu
=147mA
kkkkkkkkkkk
วัด จากwall chargeตัวใหญ่ เพื่อต่อเข้า nodemcu
=147mA
iiiiiiiiiiiiiiiiiiiiiiii
วัด จากwall chargeตัวใหญ่ เพื่อต่อเข้า เพเวอร์แบงก์ (เริ่มต้นมีไฟ20%)
=44.5mA
pppppppppppppp
วัด จาก เพเวอร์แบงก์ (เริ่มต้นมีไฟ20%)แล้วต่อเข้า
nodemcuอึกที
130mA
hhhhhhhhhhhjj
เฮ้ย ขนาดเอาสายออก มิเตอร์ยังโชว์0.3A
เซ็งโดนมิเตอร์หลอก? หรือเราไม่เป็น
อัพเดต
สรุปแล้วเราไม่เป็นเอง
ถ้ายังไม่ตรวจอะไรเลย มันก็ขึ้นค่าเป็นลบ
ตั้งย่าน A(DC) ค่าขึ้นเอง -0. 18 A
kkkkkkkkkkkk
ตั้งในย่าน mA (DC) ค่าขึ้นเอง -0. 06mA
kkkkk
อัพเดต-จบเคส
หลังจากเฝ้าติดตามการเปิดปิดวาล์ว ให้สัมพันธ์กับระดับน้ำ โดยปรับหมุนตัวต้านทานที่เซ็นเซอร์อินฟราเรด ซ้ำไปซ้ำมา เกือบ1ชม.
ปรากฏว่าเซ็นเซอร์เพี้ยนจริงๆ และเซ็นเซอร์นี้มีled สว่างตัวเดียว อีกตัวดับ ปกติถ้าวัตถุระยะใกล้จะสว่างทั้ง2led
หลังจากเปลี่ยนเซ็นเซอร์ ใหม่
ตอนนี้ทำงานปกติแล้ว
(ต้องรอดูต่อไป)
23/8/65
เรื่อง โมดูลชาร์เจอร์นี้ราคาอันละ14บาทด มีสเป๊ค ให้กระแสชาร์จ 1Amp. สำหรับแบต 18650 1ก้อน
แบตก้อนนึ้ (3400mA ของใหม่ ราคา90บาทต่อก้อน) ตอนนี้วัดโวลต์ ได้ 2.8 v ผมใช้โมดูลชาร์จ แต่ แผ่นโมดูลร้อนมาก มือแตะไม่ได้เลย ขนาดเทปพันสายไฟยังละลายเลยครับ ผมลองวัดกระแสได้ 220 mA เอง ยังไม่ถึงครึ่งAด้วยซ้ำ โมดูล 1A คงเป็นราคาคุย
คิดว่าถ้าใช้แบบนี้ ได้ไม่กี่วัน โมดูลคงเสื่อมเพราะความร้อนสูงแน่
ผมเลยใช้กาว2ตันติดกับฮีตซิงค์ซะเลย ความร้อนที่โมดูลลดลง สามารถเอานิ้วแต่ได้ แค่อุ่นๆ
** เวลาติดต้องระวังขั้วด้วย เดี๋ยว
จะช้อตลงฮีตซิ้งค์**
แบต แรกรับ 3.7vครับ ทึ่ต่ำนี้เพราะว่าเมื่อคืนผมต่ออนุกรม และต่อเข้าโหลดโดยไม่ผ่านโมดูลชาร์เจอร์ เลยไม่มีการตัด*
ขอบันทึกการชาร์จหน่อย
ก้อนที่1-ใหม่ 3400mAh
23/8/65
- เวลา 18.21น. (วัดที่B+/-) 2.386 V (วัดout +/-.)…
-
19.10 2.406 ....
24/8/65
3. เวลา 10.31น. วัดได้ 2.513 V
4.เวลา 16.25 น. (วัดที่B+/- )2.530 (วัดout +/-) 92.mv
+++
ก้อนที่2-ใหม่ 3400mAh
24/8/65
- เวลา 16.35น. (วัดที่B+/- ) 3.887 V (วัดout +/-.) 3.887v
+++
ก้อนที่3-เก่า 9800mAh
24/8/65
- เวลา 16.41น. (วัดที่B+/- ) 92.4m V (วัดout +/-.) 887mV
25สค65
สรุป ณ ตอนนี้ ว่า
ปัญหาอยู่ที่ คุณภาพ ของ โมดูลชาร์เจอร์ เจอทั้ง3 ตัว
หยุดการบันทึก
ผมแกะเอาฮีตซิ้งค์เก็บไว้ครับ
อยากทราบจากเพื่อนๆ ที่ใช้โมดูลชาร์เจอร์แบบนี้ มีไหมครับ ถ้ามี ผลการใช้เป็นอย่างไงบ้างครับ..
24สค65
ผมลองเอาแบต18650 มาใช้กับ นาฬิกาติดผนัง ใช้ไฟ1.5vdc
1.วัดโวลต์ของแบต18650 ได้3.8V
2.ต่อเลยจากแบต18650เข้านาฬิกา เดินได้แต่ไม่เรียบ
3.ลองลดโวลต์ด้วยตัวต้านทาน ตามเว๊บนึ้ คือผมใช้
+()ขั้วบวกแบต > R20k>*>R13k> -(ขั้วลบ)แบต
วัดระหว่าง * กับ ขั้วลบ ได้ 1.55v
แล้วต่อสายจาก * เข้าขั้วบวกของนาฬิกา และขั้วลบแบตเข้า ขั้วลบของนาฬิกา(ดังรูป) ปรากฏว่านาฬิกาไม่เดิน
พอผมเอาถ่าน2A ใส่เดินได้ปกติครับ…
ใครพอทราบไหมว่า ทำไมลดโวลต์ด้วยตัวต้านทานมันถึงไม่เดินครับ
24สค65
วันนี้ได้ทำ RC snubber สักที หลังจากได้ปรึกษากับเพื่ิอนๆ และได้ซื้ออุปกรณ์เตรียมหลายเดือนแล้ว
+++
+++
+++
+++
magnetic contactor ที่คุมปั๊มน้ำประปาหลังบ้าน (น่าจะไม่เกิน10แอมป์)
หลังจากใส่ rc snubber เสียงของหน้าสัมผัสเบาลงครึ่งหนึ่ง
24สค65
4วันที่ผ่านมา ได้เรียนรู้หลายอย่างเกี่ยวกับไฟสำรอง nodemcu
1.ที่ไม่มีปัญหาเลย(เกิน24ชั่วโมง) คือใช้power bank สำเร็จรูป
เสียบwall charge เข้า power bank และจากpower bank เข้า nodemcu
แต่ควรวัดกระแสแล้วให้มากกว่าที่ nodemcu มิฉะนั้นแล้ว ไฟในเพาเวอร์แบงก์หมดเกลี้ยงเหมือนกัน
2.ใช้ โมดูลชาร์จเจอร์ ที่กล่าวข้างต้น ให้กระแสเพียงพอกับnodeMCUแล้ว แต่ควรติดฮีตซิ้งค์ด้วย
เพราะถ้าโมดูลร้อน กระแสจะออกน้อย สุดท้ายโมดูลจะตัดการจ่ายไฟได้
ที่สำคัญ อย่าพ่วงโมดูล หรือพ่วงแบต และอย่าต่อโหลดโดยตรงผ่านแบต มิฉะนั้น งานเข้า เหมือนผมได้เจอมาข้างต้น
ให้ต่อ 1โมดูลนี้ ต่อ 1ก้อน 18650 เท่านั้นครับ
2.1 หลังจากได้ใช้ 6ชั่วโมง ปรากฏว่าnodemcu ทำงานรวน ลองเช็คโมดูลชาร์เจอร์ B+/- ได้ 3.472v , out+/- ได้ 0.0v แสดงว่าโมดูลชาร์เจอร์ตัดการทำงานแล้ว
โดยที่ใช้wall charge และload อันเดียวกันกับpower bank (ข้อ1)
สรุปได้ว่า bms ของ power bank มีประสิทธิภาพดีกว่าของโมดูลชาร์จเจอร์
หรือพูดง่ายๆว่า คุณภาพตามราคาครับ
2.2 ผมเลยใช้ powerbank ใหม่ ตามข้อ 1ใหม่
2.3 มาวัดกระแส nodemcuในระบบ
ใช้ไฟจากpowerbank ในช่วง 110-148 mA
3.(25สค65)ได้ประกอบเพเวอร์แบงก์ตามคลิปนี้
แล้วเอามาแทนเพเวอร์แบงก์เดิม
…
ปรากฏว่า nodemcuในระบบ ใช้กระแส 2.1A!!! มากกว่าทึ่วัดด้วยมัลติมิเตอร์เสียอีก
รวมค่าใช้จ่าย
-wall charge แบบ fast charge + สายแบบ fast charge ของใหม่ 300บาท
-เคสเปล่า 117บาท
-แบต18650 ของlg มือ2 8ก้อน 180บาท
รวม 597บาท…
นี่คือค่าใช้จ่ายสำหรับภาคสำรองไฟ nodemcu…
หลังจากพยายามหาวิธีแบบประหยัด แต่ไม่สำเร็จ
คงต้องยอมจ่ายแพงแล้วหละ
30สค65
เพเวอร์แบงก์นี้ป้อนไฟได้ดีมาก ระบบทำงานต่อเนื่องมา7วัน แล้วครับ ไฟยังโชว์100%ตลอด
ตอนนี้ทำงานขณะไม่มี wifi ได้แล้วใช่ไหมครับ
ได้แล้วครับ
วิธีแก้มี 2 แบบคือ เอาคำสั่ง esp.restart ออกหรือเขียนข้ามถ้าต่อ wifi ไม่ได้ที่ผมเคยเขียนคือ เปิดเครื่องมาให้มันเช็ค หา wifi ก่อน 20 ครั้ง ถ้าไม่เจอก็ข้ามการต่อ wifi ไปเลย และเขียน เช็ค wifi อีก ทุกๆ 60 วิ ถ้าเจอก็ต่อถ้าไม่เจอก็ข้าม
ขอบคุณครับ
25สค65
ยังคาใจไม่หาย 555
ผมเอาแบตเก่า จะทิ้งแล้วมาทดลอง
ครั้งนี้ผม ลองชาร์จแบบสดๆตรงๆ
จากwall charge ต่อเข้า18650เลย โดยที่ขั้วลบผมผ่านมัลติมิเตอร์เพือวัดกระแส และเอามัลติมิเตอร์อีกตัววัดโวลต์ของ18650
จะสังเกตุว่า กระแสช่วงแรกๆ 270mA ต่อมากระแสลดลงเรื่อยๆ ตรงตามทฤษฏีที่ กระแสจะหยุดไหลเมื่อ voltageเท่ากันทั้ง2ฝั่ง
12.55น.
ตอนนี้เหลือ 195mA
voltage ของแบต จาก 3v ตอนนี้ขึ้น 3.7v
ผมหยุดก้อนนี้ก่อน
ก้อนที่2 ใหม่ 3400mAh ใช้ wall charge แบบfast charge
13.30 น. กระแส 320mA 2.7V
28สค65
การต่อตรงไม่ผ่านโมดูล ทำให้แบตเก่า บวม และมีน้ำยาไหลออกมา แต่แบตไม่ร้อนเลยครับ
ผมเลยเลิกการชาร์จแบบนี้แล้วครับ
28สค65
เมื่อวานมีปัญหาเรื่องน้ำกรองล้น จนพื้นห้องเปียกเลย
ปัญหาน่าจะเป็นจาก เซ็นเซอร์อินฟราเรดที่ทำงานไม่คงเส้นคงวา
ผมลองเอาลิมิตสวิตช์มาแทน IR เซ็นเซอร์ ดังรูป โดยเอาก้านยาวๆ(ในรูปเอาซี่ของโครงร่มที่เสียแล้ว)มาผูกติดกับตัวยันของลิมิตสวิตช์
อีกด้านผมให้ยันกับโฟมที่ลอยขึ้นมากับระดับน้ำ
เรื่อง โค้ด จะใช้ input_pullup และเอาโค้ดที่เกี่ยวกับIRออก
฿฿฿
เรื่อง input_pullup ผมละงงทุกที ต้องรื้อตำราทุกครั้ง อันนี้เข้าใจง่ายดี
฿฿฿฿
฿฿฿
สายที่ir มี3เส้นพอดี
คือ vcc gnd data
ผมเอา R10K ต่อคร่อมระหว่างvcc กับdata และdata ต่อขั้วcommonของลิมิตสวิตช์ และอีกปลายอีกด้านเข้า D7(ตามเดิม)
และขั้วNOของลิมิตสวิตช์ต่อเข้าสายgnd
จบรายการ
สำหรับโค้ดไม่ต้องแก้แล้วครับ เพราะ ใช้คำสั่ง ดักค่า 0 เหมือนกับโ้ค้ด อินฟราเรดเซ็นเซอร์ใช้ก่อนหน้านี้
จบเคสแล้วครับบบบ
30สค65
ใช้ได้ดี ไม่รวน กวนใจเรื่องน้าล้นแล้วครับ
29สค65
ปัญหาเรื่องการต่อwifi ที่ตั้งมี 2ssid(A, B) ผมใช้โค้ดที่nodemcuเลือกเอง เผื่อว่าตัวไหนเสีจะได้ใช้ตัวที่เหลือ
มี B คือ ssidที่ผมทำrepeater(เป็นESP8266) ต่อจากA(เราเตอร์/โมเด็ม ยี่ห้อ huawei)อีกที โดยแยกขื่อssid และpwd ต่างหาก(เราเตอร์)
Bสัญญาณแรงกว่าA เพราะใกล้กว่า
พอรันแล้ว nodemcu จะเลือกAทุกครั้ง ทำให้หลุดจากBLYNKบ่อยมาก (โดยที่ทำงานปกติ)
อยากถามเพื่อนๆว่า เป็นเพราะอะไร ทำไมไม่ต่อกับB ทั้งที่ Bสัญญาณแรงมากกว่าA
฿฿฿
ผมเลยเอาโค้ดเดิม ที่ระบุแต่B มาใช้แทน จะทำให้ ติดต่อBLYNKได้เกือบตลอดเวลาแล้วครับ👍
1กย65
8วันมานี้ ระบบจุดนี้ทำงานได้ดีตลอดมาครับ
1กย65
วันนี้จะปรับปรุงโค้ด ให้ใน loop ว่างที่สุดและใช้ timer.setInterval(1000L, myTimerEvent);แทน
เช่น
void loop()
{
Blynk.run();
timer.run();
}
เห็นเขาว่า ระบบจะเสถียรมากขึ้นครับ
สรุปแล้ว ผมทำได้แบบนี้
timer.setInterval(1000L,reconnect_and_others);
timer.setInterval(1250L,pumptask);
timer.setInterval(1500L,timecheck);
timer.setInterval(1750L,filter);
timer.setInterval(1000L,fantask);
(ใส่ในช่วงท้ายๆของ void setup() ครับ)
7กย65
โปรเจ็คติดแบต18650ให้กับนาฬิกาติดผนัง
เนื่องจาก นาฬิกาติดผนังที่เข็มวินาทีเคลื่อนไหวลื่นๆแบบไม่ใช่กระดิกๆเหมือนนาฬิกาทั่วไป มันจะดูสวยงาม แต่มันจะเปลืองถ่าน2A(1.5vdc)มากครับ ต้องเปลี่ยนบ่อยกว่า
ผมเลยศึกษาจากเน็ต
1.สามารถชาร์จกับไฟบ้านได้
2.สามารถแปลงไฟเป็น 1.5vdc เพื่อใช้กับนาฬิกาได้
3.ถ้าไฟบ้านดับ จะใช้ไฟในแบตสำรองได้
อุปกรณ์
1.แบต 3400mAh 1ก้อน ราคา 99บาท
ตอนหลังผมซื้อแบตมือสอง 1700mAh ก้อนละ20บาทเพื่อความประหยัด
2.วงจรชาร์จไฟบ้านเข้าแบต18650 เป็น5vdc อันละ47บาท
3.ทรานซิสเตอร์ BD139แปลง 5vdc -> 1.5 vdc ราคา6บาท
4.ตัวต้านทาน 1k ohm x2ตัว
5.ปากกาที่เสียแล้ว1อัน
6.บัดกรี
7.สายไฟ 1มม. แดง, ดำ2เส้น
8.ปืนยิงกาวร้อน
ขั้นตอนประกอบ
1.เอาแบตมาบัดกรีต่อวงจรชาร์จ(2)เข้า B+/B-
2.เอาสายUSBเก่าๆที่ไม่ใช้แล้ว ใช้เฉพาะหัวเสียบ ตัดปลาย และ หาเส้นที่เป็น +/- ส่วนใหญ่แดง เป็น+, ดำเป็น-
3.ดูคลิปนี้ประกอบ
จากข้อ2. +บัดกรีขากลางของbd139, บัดกรี ต้านทาน2ตัว (ตามคลิป)
4.ต่อสาย +/- จาก bd139 ตามคลิป เพื่อต่อเข้ารางแบต
5.
ใช้ปากกาเก่า ที่ไม่ใช้ ตัดความยาวเท่าถ่าน2A และสาย+/-ติดปลาย, จากนั้นเสียบเข้ารางถ่าน
6.
กาวพลาสติกร้อนยึดทุกอย่างใว้ด้านหลัง
7.เสร็จแล้วครับ
รีวิว
เจอปัญหา ของบอร์ดชาร์จนี้ คือ ถ้าชาร์จไฟเข้า มันจะไม่ปล่อยไฟออกมา
ถ้าดึงสายชาร์จออก นาฬิกาก็จะเดิน
ทั้งๆที่แบตที60%แล้วก็ตาม
แต่ลองเพาเวอร์แบงก์ที่ใช้กับมือถือ หรือตัวนี้สามารถชาร์จและปล่อยไฟพร้อมๆกันได้
ถ้าเป็นแบบนี้จริง โมดูลชาร์จ(2)นี้คงไม่เวิ์กกับโปรเจ็คนี้ครับ
อัพเดต
เสียดายซื้อ3อัน สามารถชาร์จได้100%
แต่1.พอใช้จริง ไม่ถึง2นาทีก็ตัด
2.ถัาเราชาร์จเข้าแช่ไว้มันจะหยุดการจ่ายไฟแม้ว่ามันจะเต็ม100%ก็ตาม
3.ถ้าเอาสายชาร์จออกมันจะเป็นแบบข้อ 1.อีก
สรุปแล้ว ชาร์จเข้าได้อย่างเดียว แต่ไมยอมปล่อยไฟออกมา
8.ลองใช้ โมดูลชาร์จ อันอื่น คือ ตัวที่เคยใช้กับเลี้ยงไก่ ซึ่งราคาถูกกว่า เพียงแต่ไม่มี จอ LCD แสดง%ของแบตเตอรี่
ที่ผมไม่ใช้กับการเลี้ยงไก่ เพราะให้กระแสไม่พอ เลยถอดเก็บไว้
ผมเอาโมดูลชาร์จตัวนี้แทนโมดูลชาร์จ(2) ได้เลย เพียงแต่ ไฟออกจากโมดูลชาร์จ จะมี 2 ชุดคือ
- B+/- ต่อกับ แบต 18650
2.Out +/- ต่อออกไปใช้งาน เป็นไฟ 5vdc ซึ่งผมจะบัดกรีเข้า ทรานซิสเตอร์BD139 แปลงเป็นไฟ 1.5vdc อีกที
ผลที่ออกมา
ใช้ได้ดีครับ
สามารถปล่อยไฟและชาร์จพร้อมๆกันได้ครับ
อัพเดต
8กย65
หลังจาก(ทำข้อ 8) 12ชั่วโมง ผลปรากฎว่า นาฬิกาเดินได้ตรงเวลา เหมือนกับใช้ถ่าน AA ครับ
ทำเรือนที่ 2
ตอนแรกใช้ชาร์จโมดูลอันแรก แต่ไม่เวิอร์ก
เปลี่ยนชาร์จโมดูลใหม่แล้ว
ใช้งานจริงแล้วครับ
9กย65
วันนี้ผมจะมารีวิว โมดูลชาร์จเจอร์ตัวที่3
ผมสั่งมา10ชิ้น
ราคา 14บาทต่อชิ้น(รวมค่าส่งแล้ว)
ผมได้เอามาต่อ แบต18650 ของเก่า มาลองต่อดังรูป
time/date<—>โวลต์<—>หมายเหตุ
8.00/10กย65<—>?<—>เริ่มชาร์จ
21.29/10กย65<—>a=1.3v,b=64mv,c=4.0v<—>bน่าจะเสื่อมที่สุด
16.06/14กย65<—>a=4.2v,b=64mv,c=4.0v<—>bน่าจะเสียแล้ว เอาไปทิ้ง
ชุด2
time/date<—>โวลต์<—>หมายเหตุ
16.29/14กย65<—>D=2.1v,E=54mv,F=40mv<—>เริ่มชาร์จ
10.14/16กย65<—>(ก)D=4.14v,(ข)E=54mv(เท่าเดิม),(ค)F=40mv(เท่าเดิม)<—>ก, ข, ค เลขประจำตัวเป็นโมดูลชาร์จเจอร์
10.54/16กย65<—>(ก)F=40mv,(ข)D=4.11v,(ค)E=50mv<—>สลับตัวชาร์จกับแบต เริ่มชาร์จ
12.28/19กย65<—>(ก)F=40mv,(ข)D=4.12v,(ค)E=50mv<—>สลับตัวชาร์จกับแบต ผลเท่าเดิม แสดงว่าแบตE, Fเสียแน่นอนครับ