NodeMcu ทำ smart home project ที่ 1


โปรเจ็ค​นี้ผมทำมาหลายเดือนแล้ว
แก้ไขไป ปรับปรุงไป
ณ จุดนี้
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 ออกก็ไม่เป็นไรแล้วครับ

1 Likes

ระบบกรองน้ำ



ใช้แผ่นโฟมที่ขึ้นลงตามระดับน้ำ ช่วยสะท้อนแสง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

  1. เวลา 18.21น. (วัดที่B+/-)​ 2.386 V (วัดout +/-.)​…
  2.      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

  1. เวลา 16.35น. (วัดที่B+/- )​ 3.887 V (วัดout +/-.)​ 3.887v

+++

ก้อนที่3-เก่า 9800mAh
24/8/65

  1. เวลา 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 เสียงของหน้าสัมผัสเบาลงครึ่งหนึ่ง​

1 Likes

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​… :sob:
หลังจากพยายามหาวิธีแบบประหยัด แต่ไม่สำเร็จ
คงต้องยอมจ่ายแพงแล้วหละ
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
การต่อตรงไม่ผ่านโมดูล ทำให้แบตเก่า บวม และมีน้ำยาไหลออกมา แต่แบตไม่ร้อนเลยครับ
ผมเลยเลิกการชาร์จแบบนี้แล้วครับ

1 Likes

28สค65

เมื่อวาน​มีปัญหา​เรื่องน้ำกรองล้น จนพื้นห้องเปียกเลย
ปัญหา​น่าจะเป็นจาก เซ็นเซอร์​อินฟราเรด​ที่ทำงานไม่คงเส้นคงวา
ผมลองเอาลิมิตสวิตช์​มาแทน IR เซ็นเซอร์​ ดังรูป โดยเอาก้านยาวๆ(ในรูปเอาซี่ของโครงร่มที่เสียแล้ว)​มาผูกติดกับตัวยันของลิมิต​สวิตช์
อีกด้านผมให้ยันกับโฟมที่ลอยขึ้นมากับระดับน้ำ
เรื่อง โค้ด จะใช้ input_pullup และเอาโค้ดที่เกี่ยวกับIRออก

฿฿฿
เรื่อง input_pullup​ ผมละงงทุกที ต้องรื้อตำราทุกครั้ง อันนี้​เข้าใจง่ายดี


฿฿฿฿

฿฿฿

สายที่ir มี3เส้นพอดี
คือ vcc gnd data
ผมเอา R10K ต่อคร่อมระหว่าง​vcc กับdata และdata ต่อขั้วcommonของลิมิตสวิตช์​ และอีกปลายอีกด้านเข้า D7(ตามเดิม)
และขั้วNOของลิมิตสวิตช์​ต่อเข้าสายgnd
จบรายการ
สำหรับโค้ดไม่ต้องแก้แล้วครับ เพราะ ใช้คำสั่ง ดักค่า 0 เหมือนกับโ้ค้ด อินฟราเรดเซ็นเซอร์​ใช้ก่อนหน้านี้

จบเคสแล้วครับบบบ
30สค65
ใช้ได้ดี ไม่รวน กวนใจเรื่องน้าล้นแล้วครับ

1 Likes

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 Likes

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 ชุดคือ

  1. B+/- ต่อกับ แบต 18650
    2.Out +/- ต่อออกไปใช้งาน เป็นไฟ 5vdc ซึ่งผมจะบัดกรีเข้า ทรานซิสเตอร์BD139 แปลงเป็นไฟ 1.5vdc อีกที

ผลที่ออกมา
ใช้ได้ดีครับ
สามารถปล่อยไฟและชาร์จพร้อมๆกันได้ครับ
อัพเดต
8กย65
หลังจาก(ทำข้อ 8) 12ชั่วโมง ผลปรากฎว่า นาฬิกาเดินได้ตรงเวลา เหมือนกับใช้ถ่าน AA ครับ
ทำเรือนที่ 2


ตอนแรกใช้ชาร์จโมดูลอันแรก แต่ไม่เวิอร์ก

เปลี่ยนชาร์จโมดูลใหม่แล้ว

ใช้งานจริงแล้วครับ

1 Likes

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เสียแน่นอน​ครับ​