Nodemcu-เลี้ยงไก่-ปลูกผักกินเอง(ตอน2)

ไม่ผิดครับ มันเป็นฝุ่นในเล้าไก่ และรอยบัดกรีครับ

1 Likes

ครับ น้อยไป เดี๋ยว​จะพ่วงเพิ่มเข้าอีกครับ
จะได้เคลียร์อแดปเตอร์​เก่าๆไปใช้ 555

ชาร์จโมดูลทำงานโอเวอร์โหลดด้วย สามารถชาร์จ18650แค่ก้อนเดียว แต่ผมพ่วง2ก้อน 555
และอีก3สาเหตุ​คือ
1.ตู้ที่ตั้งแบตนี้รูระบายอากาศน้อยไป
2.ใช้2node ใช้เลี้ยงเซ็นเซอร์, รีเลย์หลายอัน
3.mcp23017 ผมยังต่อกับvcc, gndอยู่ลืมถอดออก เคยอ่านเขาว่า mcp23017กินไฟ 3-4แอมป์(แต่ไม่ชัวร์ข้อนี้)

ดังนั้นเอาชาร์จโมดูล2ตัวชาร์จต่อขนานกับแบตเดิม

แทนตัวที่เสีย

เจออแดปเตอร์​โนเกียร์5v350mAเสริมเข้าไปอีกตัว
!
16567459234647448286621356782841|500x500



เสร็จ​แล้ว​ครับ
ที่โมดูลชาร์จวัดขาเข้า 4.16v,ออก 3.96v

Arduino nano 33 iot

ราคา, ความเสถียร, ขาi/0 เทียวกับnodemcu/esp32อย่างไร​ครับ​

ราคาแพงกว่า 5 เท่า ผมเคยแปลงโค้ตหลายหมื่นบรรทัดจากที่เคยรันลื่นๆ บน esp32 ปรากฎว่ายังไม่ถึงครึ่ง ก็จอดสนิท เนื่องจากว่า speed มันน้อยกว่าอยู่แล้ว

ถ้าเทียบเฉพาะการจับ wifi การรีเซตตัวเอง wdt น่าจะดีกว่า เพราะถ้ามันไม่ไหวมันก็บอกไม่ไหว

ที่สนใจเลยคือมัน สามารถ ดีบัคได้ ไล่โปรแกรมได้ทีละบรรทัด เพื่อหาปัญหาระหว่างรันจริงได้ หรือดูว่าตอนนี้โปรแกรมมันวิ่งไปไหนแล้ว แต่ esp ทำไม่ได้

node1

node2

มีการออฟไลน์node1 แต่node2ยังออนไลน์อยู่
ทั้งๆที่ใช้wifiเดียวกัน, เริ่มเวลาconnect blynk serverพร้อมกัน, แบตเตอรี่​ตัวเดียวกัน…
สาเหตุ​จากอะไรได้บ้างครับ
อัพเดท
1.ปิดswitchทุกpin ก็ยังหลุด
2.ถอดnode1 ออกจากbase ก็ยังหลุด
3.เปลี่ยนnode1 ใช้nodemcuใหม่ก็ไม่หลุดแล้ว อาจเป็นเพราะnode1มันใช้นานกว่าnode2
อัพเดท
node1หยุดการทำงานอีกแล้ว ปกติจะมีไฟไปเลี้ยงเซ็นเซอร์ แม้ว่าหลุดจากblynkก็ตาม แต่ไม่มีไฟจ่ายจากnode1 เลย
อัพเดท
เริ่มโดยปิดหมดทุกpin แล้วกดปุ่มรีเซ็ต แล้ว connect blynk,แล้วไล่เปิดแต่ละpin ห่างกัน1 นาที ปรากฏว่า เปิดจนครบทุกpin ไม่offlineจากblynkเลย…และสามารถสั่งรีเลย์ตามเงื่อนไขทุกประการ
มีการ ต่อ blynk สัก 5 นาที แล้ว Off แล้วต่อใหม่อีก
สรุป ไม่รู้ว่าเป็นจากเหตุใด

ปล. 2-3วันมานี้ไม่สามารถดูผลทาง serial monitor ได้ เลยต้องอาศัย blynk ไปก่อนครับ

ขอบคุณครับ

sketch node1 4กค65

//Digital pins 0—15 can be INPUT, OUTPUT, or INPUT_PULLUP
//node1
//D0(motor_rhodes- ไก่โร้ดส์- D0/GPIO16,INPUT_PULLDOWN),D1(reserved),D2(reserved),
//D3(rhodes_tank_sensor"ถังอาหารไก่โร้ดส์"D3 = GPIO 0),D4(upper_tank_sensor ถังบน)D4 = GPIO 2),
//D5((เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank),D6(local_tank_sensor ไก่บ้านD6 = GPIO 12),D7(ac control),
//D8(motor_local)ไก่บ้าน,D9(เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank),D10(เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
//แยกตามswitch_sensor
//D9((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
//D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
//D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
//แยกตามsensor
//D4(upper_tank_sensor ถังบน)
//D3(rhodes_tank_sensor"ถังอาหารไก่โร้ดส์"
//D6(local_tank_sensor ไก่บ้าน 
//แยกตามมอเตอร์
//D0(motor_rhodes- ไก่โร้ดส์
//D8(motor_local)ไก่บ้าน
//node2
//D0,D1(reserved),D2(reserved),D3(dht),D4(lamp_chickไฟสำหรับลูกไก่),D5(lamp),
//สารบัญ blynk
//v0(-TANK1),v1(TANK2),v2(TANK3),v3(DAYNIGHT),v4(log switch sensor upper tank),v5(log switch sensor rhoses tank)
//,v6(เวลา),v7(moterled),v8(button motoer rhodes),
//v9(log switch sensor local tank),v10(log motorไก่โร้ดส์),v11(log motorไก่โร้ดส์),v12(currentDate),v13(เวลา)
//,v14(เอาไว้ทดสอบ ลบได้),v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30
#include <Wire.h>
//-1·แจ้งทางไลน์
#include <TridentTD_LineNotify.h>
#define LINE_TOKEN  "xxx"
// HIGH คือ หมด LOW คือมี
//0.ดึงเวลาจากเน็ตมาใช้
#include <NTPClient.h>
#include <time.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//1 ขึ้น Blynk
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial;
WidgetLED TANK1(V0);
WidgetLED TANK2(V1);
WidgetLED TANK3(V2);
WidgetLED DAYNIGHT(V3);
WidgetLED motorled(V7);
WidgetLED upper_tank_sensor_val_high_blynkled_v15(V15);
WidgetLED rhodes_tank_sensor_val_high_blynkled_v16(V16);
WidgetLED local_tank_sensor_val_high_blynkled_v17(V17);
WidgetLED motor_rhodes_button_v23(V23);
 String formattedTime;
 String formattedTime2;
 String currentDate;
 int monthDay;
 int currentMonth;
 String string_close;
 String string_open;
 String string_close_open_v4;
 String string_close_open_v5;
 String string_close_open_v9;
 String string_close_open_v10;
 String string_close_open_v11;
WiFiUDP ntpUDP;
const long offsetTime = 25200;       // หน่วยเป็นวินาที จะได้ 7*60*60 = 25200
NTPClient timeClient(ntpUDP, "pool.ntp.org");

//Week Days
String weekDays[7]={"อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์"};

//Month names
String months[12]={"มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"};


char auth[]="XXX";

const char *ssid     = "XXX";
const char *password = "XXX";
//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;

/////////
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
int currentHour = 0;
int currentMinute =0;
// กำหนดค่า offset time เนื่องจากเวลาของเซิฟเวอร์นี้เป็นเวลา UTC เราต้องทำให้เป็นเวลาของประเทศไทย
// เวลาของประเทศไทย = UTC+7 ชั่วโมง ต้องกำหนด offset time = 7 ชั่วโมง

// กำหนด object ของ WiFiUDP ชื่อว่า ntpUDP
//1.ถังอาหารที่1 คือถังอาหารที่เติมอาหารครั้งละ20ลิตร
//   ถ้าอาหารลดลงมากถึงระดับต่ำ1 ให้เตือนทางline
//   ถ้าอาหารลดลงมากถึงระดับต่ำ2 ให้มอเตอร์หยุดทำงาน
//   แต่ต้องเวลากลางวันเท่านั้น ถ้ากลางคืนให้มอเตอร์หยุด
int ac_control = D7;// ควบคุมไฟAC

int motor_rhodes = D0;//หมุนมอเตอร์ไปตามเข็ม ให้ไก่โรดส์
int motor_local = D8;//หมุนมอเตอร์ไปทวนเข็ม ให้ไก่บ้าน
int upper_tank_sensor = D4;
int switch_sensor_upper_tank = D9;
//D9((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
int switch_sensor_local_tank  =D5;
//D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
int switch_sensor_rhodes_tank =D10;
//D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
unsigned long upper_tank_sensor_duration;
//bool upper_tank_sensor_state;
unsigned long rhodes_tank_sensor_duration;
//bool rhodes_tank_sensor_state;
unsigned long local_tank_sensor_duration;
//bool local_tank_sensor_state;

int upper_tank_sensor_val = 0;


//int a=0;

//2.ถังอาหารที่2 คือถังที่ให้อาหารไก่ตัวใหญ่จิกกิน
//   ถ้าอาหารลดลงมากถึงระดับต่ำ1 ให้มอเตอร์เริ่มทำงาน
//   แต่ต้องเวลากลางวันเท่านั้น ถ้ากลางคืนให้มอเตอร์หยุด
//   ถ้าอาหารลดลงมากถึงระดับต่ำ2 ให้มอเตอร์หยุดทำงาน

//ถัง2
int rhodes_tank_sensor = D3; //"ถังอาหารไก่โร้ดส์"
int rhodes_tank_sensor_val = 0;
//3.ถังอาหารที่3 คือถังที่ให้อาหารไก่ตัวเล็กจิกกิน
//   ถ้าอาหารลดลงมากถึงระดับต่ำ1 ให้มอเตอร์เริ่มทำงาน
//   แต่ต้องเวลากลางวันเท่านั้น ถ้ากลางคืนให้มอเตอร์หยุด
//   ถ้าอาหารลดลงมากถึงระดับต่ำ2 ให้มอเตอร์หยุดทำงาน

//ถัง3
int local_tank_sensor = D6; 
int local_tank_sensor_val = 0;
        BlynkTimer timer;
//0  ตรวจสอบอุณหภูมิ
 
void setup()
{
         Serial.begin(9600);
     //dht11
//    Blynk.begin(auth, ssid, password);
  Blynk.begin(auth, ssid, password, "oasiskit.com", 8080);  
     //widget ใน blynk
     TANK1.on();
     TANK2.on();
     TANK3.on();
     DAYNIGHT.on();
     motorled.on();


     //-1·แจ้งทางไลน์
     Serial.println();
     Serial.println(LINE.getVersion());
     //0.ดึงเวลาจากเน็ตมาใช้
     Serial.setDebugOutput(true);
     WiFi.mode(WIFI_STA); //เชื่อมต่อ Wifi
     WiFi.begin(ssid, password);
     Serial.println("\nConnecting to WiFi");
     while ((WiFi.status() != WL_CONNECTED)&&(a<6)) {
           Serial.print("*");
           a=a+1;
           delay(100);
      }
     //-1·แจ้งทางไลน์
     // กำหนด Line Token
     LINE.setToken(LINE_TOKEN);
// 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);
  //
     configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server
     Serial.println("\nLoading time");
     while (!time(nullptr)) {
           Serial.print("!time(nullptr)");
           
           delay(100);
     }
     Serial.println("");

     //1.ถังอาหารที่1 คือถังอาหารบนที่เติมอาหารครั้งละ20ลิตร
     pinMode(motor_rhodes, OUTPUT);
     pinMode(motor_local, OUTPUT);
     pinMode(upper_tank_sensor, INPUT_PULLUP);
 //    pinMode(rhodes_tank_sensor, INPUT_PULLUP);
//     pinMode(local_tank_sensor, INPUT_PULLUP);
     pinMode(switch_sensor_upper_tank, OUTPUT);
      //int switch_sensor_upper_tank = D9;
      //D9((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
      digitalWrite(switch_sensor_upper_tank, 1);//active low 24 มิย. 65
     pinMode(switch_sensor_local_tank, OUTPUT);
      //int switch_sensor_local_tank  =D5;
      //D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
      digitalWrite(switch_sensor_local_tank, 1);//active low 24 มิย. 65
     pinMode(switch_sensor_rhodes_tank, OUTPUT);
      //int switch_sensor_rhodes_tank =D10;
      //D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
      digitalWrite(switch_sensor_rhodes_tank, 1);//active low 24 มิย. 65
     
     //2.ถังอาหารที่2 คือถังที่ให้อาหารไก่โรดส์กิน
     pinMode(rhodes_tank_sensor, INPUT_PULLUP);// กำหนดขาทำหน้าที่ให้ขา D3 เป็น INPUT รับค่าจากเซ็นเซอิร์cntd "ถังอาหารไก่โร้ดส์: "  
 
      //3.ถังอาหารที่3 คือถังที่ให้อาหารไก่บ้านกิน
     pinMode(local_tank_sensor, INPUT_PULLUP);// กำหนดขาทำหน้าที่ให้ขา D6 เป็น INPUT รับค่าจากเซ็นเซอิร์local_tank_sensor    //แทนpinMode(infrared3, INPUT);

     
     digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์
     string_close_open_v10=string_close+","+string_close_open_v10;
     Blynk.virtualWrite(V10,string_close_open_v10);
     digitalWrite(motor_local, 1);//ปิดมอเตอร์
     string_close_open_v11=string_close+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);
     pinMode(ac_control, OUTPUT); //ควบคุมไฟ AC 
     
     digitalWrite(ac_control, 0);//ปิดไฟ AC
    timer.setInterval(1000L, check_sensortask);//

  Blynk.syncAll();      

}

void check_sensortask()
  {
  //D4(upper_tank_sensor ถังบนD4 = GPIO 2,upper_tank_sensor_val),D3(rhodes_tank_sensor"ถังอาหารไก่โร้ดส์"D3 = GPIO 0,rhodes_tank_sensor_val),D6(local_tank_sensor ไก่บ้านD6 = GPIO 12,local_tank_sensor_val),
//       digitalWrite(switch_sensor_upper_tank, 0);//active low 24 มิย. 65
  delay(100);
  upper_tank_sensor_duration = pulseIn(upper_tank_sensor, LOW,2000);
  Serial.println(upper_tank_sensor_duration);
//   Blynk.virtualWrite(V18, upper_tank_sensor_duration);
   if(upper_tank_sensor_duration!=0)
     {
     digitalWrite(switch_sensor_upper_tank, 1);//active low 24 มิย. 65
     upper_tank_sensor_val_high_blynkled_v15.on();
     string_close_open_v4="ค่าความถี่="+String(upper_tank_sensor_duration)+","+string_close+","+string_close_open_v4;
     Blynk.virtualWrite(V4, string_close_open_v4);
     }
     else
     {
     upper_tank_sensor_val_high_blynkled_v15.off();
     string_close_open_v4="ค่าความถี่="+String(upper_tank_sensor_duration)+","+string_open+","+string_close_open_v4;
     Blynk.virtualWrite(V4, string_close_open_v4);
     digitalWrite(switch_sensor_upper_tank, 0);//active low 24 มิย. 65
 
      }
  delay(100);
  rhodes_tank_sensor_duration = pulseIn(rhodes_tank_sensor, LOW,2000);
  Serial.println(rhodes_tank_sensor_duration);
   Blynk.virtualWrite(V19, rhodes_tank_sensor_duration);
  if(rhodes_tank_sensor_duration!=0)
    {
     digitalWrite(switch_sensor_rhodes_tank, 1);//active low 24 มิย. 65
     rhodes_tank_sensor_val = 0; //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง. แจ้งให้เต็มก่อนมิฉะนั้นมอเตอร์จะหมุน
     string_close_open_v5="ค่าความถี่="+String(upper_tank_sensor_duration)+","+string_close+","+string_close_open_v5;
     Blynk.virtualWrite(V5, string_close_open_v5);
     }
     else
     {
     rhodes_tank_sensor_val_high_blynkled_v16.off(); 
     digitalWrite(switch_sensor_rhodes_tank, 0);//active low 24 มิย. 65
     string_close_open_v5="ค่าความถี่="+String(upper_tank_sensor_duration)+","+string_open+","+string_close_open_v5;
     Blynk.virtualWrite(V5, string_close_open_v5);
      }
  delay(100);
  local_tank_sensor_duration = pulseIn(local_tank_sensor, LOW,10000);
  Serial.println(local_tank_sensor_duration);
   Blynk.virtualWrite(V20, local_tank_sensor_duration);
  if(local_tank_sensor_duration!=0 )
    {
     digitalWrite(switch_sensor_local_tank, 1);//active low 24 มิย. 65
     local_tank_sensor_val = 0; //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง. แจ้งให้เต็มก่อนมิฉะนั้นมอเตอร์จะหมุน
     local_tank_sensor_val_high_blynkled_v17.on();
     string_close_open_v9="ค่าความถี่="+String(upper_tank_sensor_duration)+","+string_close+","+string_close_open_v9;
     Blynk.virtualWrite(V9, string_close_open_v9);
     }
     else
     {
     local_tank_sensor_val_high_blynkled_v17.off(); 
     digitalWrite(switch_sensor_local_tank, 0);//active low 24 มิย. 65
     string_close_open_v9="ค่าความถี่="+String(upper_tank_sensor_duration)+","+string_open+","+string_close_open_v9;
     Blynk.virtualWrite(V9, string_close_open_v9);
      }
    Blynk.syncAll();            
  }
void loop() {
     ///
     check_time();

     string_close="ปิดเวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth);
     string_open= "เปิดเวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth);

     if ((currentHour >5) && (currentHour<14))
        { //if ((currentHour >5) && (currentHour<14))
          daytime();
         } //if ((currentHour >5) && (currentHour<14))

      else  //if ((currentHour >5) && (currentHour<14))
       {  // else ((currentHour >5) && (currentHour<14))
        nighttime();
     } // else ((currentHour >5) && (currentHour<14))
    
  delay(100);
    Blynk.run();
  Blynk.syncAll();          
     timer.run();
}


BLYNK_WRITE(V23) 
{
if (param.asInt()==1) {
   digitalWrite(ac_control, 0);//เปิดไฟ AC
   digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเเข็ม , active low
   string_close_open_v10=string_open+","+string_close_open_v10;
    Blynk.virtualWrite(V10, string_close_open_v10);
   digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
   string_close_open_v11=string_close+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);
   motor_rhodes_button_v23.on();
   Blynk.setProperty(V7,"color","#FF4000");// สีแดง
  }
else
  {
  digitalWrite(ac_control, 1);//ปิดไฟ AC
   motor_rhodes_button_v23.off();
  delay(5000);
     digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเเข็ม , active low
    string_close_open_v10=string_close+","+string_close_open_v10;
    Blynk.virtualWrite(V10, string_close_open_v10);
     
  Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
  }
}




BLYNK_WRITE(V8) 
{
if (param.asInt()==1) {
   digitalWrite(ac_control, 0);//เปิดไฟ AC
   digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเเข็ม , active low
    string_close_open_v10=string_close+","+string_close_open_v10;
    Blynk.virtualWrite(V10, string_close_open_v10);
   digitalWrite(motor_local, 0);//เปิดมอเตอร์ทวนเข็ม , active low
    string_close_open_v11=string_open+","+string_close_open_v11;
    Blynk.virtualWrite(V11, string_close_open_v11);

   Blynk.setProperty(V7,"color","#FF4000");// สีแดง
  }
else
  {
  digitalWrite(ac_control, 1);//ปิดไฟ AC
  delay(5000);
  digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
  string_close_open_v11=string_close+","+string_close_open_v11;
  Blynk.virtualWrite(V11, string_close_open_v11);
Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
  }
}




void daytime()
{
Serial.println("เป็นเวลากลางวัน");
Blynk.setProperty(V3,"color","#F8ECE0");// สีครีม
//ให้มอเตอร์ทำงานได้ แต่ต้องเช็คว่าอาหารถัง1 มีไหม และ ในถัง2 หมดแล้วยัง 
//ถ้าครบ2 เงื่อนไข  มอเตอร์ทำงาน
upper_tank_sensor_val = digitalRead(upper_tank_sensor); // ถ้ามีอาหาร =1‚ ถ้าไม่มีอาหาร = 0 ถังอาหารบน
Serial.print("upper_tank_sensor_val: ");
Serial.println(upper_tank_sensor_val);
if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
   { 
   Serial.print("อาหารถังบนใกล้หมด ");
   Serial.println("ปิดมอเตอร์");
   Blynk.setProperty(V0,"color","#FF4000");// สีแดง
   LINE.notify("อาหารไก่ใกล้หมด");
   digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
   string_close_open_v10=string_close+","+string_close_open_v10;
   Blynk.virtualWrite(V10, string_close_open_v10);

   digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
   string_close_open_v11=string_close+","+string_close_open_v11;
   Blynk.virtualWrite(V11, string_close_open_v11);

   digitalWrite(ac_control, 0);//ปิดไฟ AC
   delay(5000);
   } //(upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
else //(upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
   { //else (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
    //เงื่อนไข2  ถัง2 ถ้า rhodes_tank_sensor_val== 1 คือถังไก่โร้ดส์ใกล้หมด
    rhodes_tank_sensor_val = digitalRead(rhodes_tank_sensor); //"ถังอาหารไก่โร้ดส์"ในการอ่านค่าสวิตช์ที่ต่ออยู่กับ ขาD3 มาเก็บในสตัวแปล rhodes_tank_sensor_val ผ่านD3 ถ้าอาหารถัง2หมด ไฟสว่าง จะต่อวงจร จะทำให้rhodes_tank_sensor_val=0 
    Blynk.setProperty(V0,"color","#2EFE2E");// สีเขียว
    Serial.print("ถังอาหารไก่โร้ดส์: ");
    Serial.println(rhodes_tank_sensor_val);
    if (rhodes_tank_sensor_val == 0) // 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
       { //(rhodes_tank_sensor_val == 0) // 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
       Serial.print("อาหารไก่โรดยังมีอีก ");
       Serial.println("ปิดมอเตอร์");
       Blynk.setProperty(V1,"color","#2EFE2E");// สีเขียว
       delay(2000);
       digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
       string_close_open_v10=string_close+","+string_close_open_v10;
       Blynk.virtualWrite(V10, string_close_open_v10);

       digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
       string_close_open_v11=string_close+","+string_close_open_v11;
       Blynk.virtualWrite(V11, string_close_open_v11);

      digitalWrite(ac_control, 0);// ปิดไฟ AC
       delay(5000);
       }//(rhodes_tank_sensor_val == 0)  0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
   else
      { //else (rhodes_tank_sensor_val == 0)  0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
      Serial.print("อาหารถังไก่โรดส์ใกล้หมด ");
      Blynk.setProperty(V1,"color","#FF4000");// สีแดง
      Serial.println("เปิดมอเตอร์");
      digitalWrite(ac_control, 0);// เปิดไฟ AC
      delay(2000);
      digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
      string_close_open_v11=string_close+","+string_close_open_v11;
      Blynk.virtualWrite(V11, string_close_open_v11);

      digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเข็ม , active low
      string_close_open_v10=string_open+","+string_close_open_v10;
      Blynk.virtualWrite(V10, string_close_open_v10);

      Blynk.setProperty(V7,"color","#FF4000");// สีแดง
      delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
      digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
      string_close_open_v11=string_close+","+string_close_open_v11;
      Blynk.virtualWrite(V11, string_close_open_v11);

      Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
      delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
      }//else (rhodes_tank_sensor_val == 0)  0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
    // เริ่มตรวจถัง 3 โดยใช้ capacitive  proximity sensor ยี่ห้อ CNTD
    local_tank_sensor_val = digitalRead(local_tank_sensor); //ในการอ่านค่าสวิตช์ที่ต่ออยู่กับ ขาD6 มาเก็บในสตัวแปล local_tank_sensor_val ผ่านD6 ถ้าอาหารถังไก่บ้านหมด ไฟสว่าง จะต่อวงจร จะทำให้local_tank_sensor_val=0 
    Serial.print("ถังอาหารไก่บ้าน: ");
    Serial.print("local_tank_sensor_val: ");
    Serial.println(local_tank_sensor_val);
    if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
       { //(if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
       Serial.print("อาหารไก่บ้านยังมีอีก ");
       Serial.println("ปิดมอเตอร์");
       Blynk.setProperty(V2,"color","#2EFE2E");// สีเขียว
       delay(2000);
       digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
       string_close_open_v10=string_close+","+string_close_open_v10;
       Blynk.virtualWrite(V10, string_close_open_v10);

       digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
       string_close_open_v11=string_close+","+string_close_open_v11;
       Blynk.virtualWrite(V11, string_close_open_v11);

       digitalWrite(ac_control, 0);// ปิดไฟ AC
       delay(5000);
       } //if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
   else //if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
      {//else if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
      Serial.print("อาหารถังไก่บ้านใกล้หมด ");
      Blynk.setProperty(V2,"color","#FF4000");// สีแดง
      Serial.print("อาหารถังบนยังมีอีก ");
      digitalWrite(ac_control, 0);// เปิดไฟ AC
      delay(2000);
      digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเเข็ม , active low
     string_close_open_v10=string_close+","+string_close_open_v10;
     Blynk.virtualWrite(V10, string_close_open_v10);

      digitalWrite(motor_local, 0);//เปิดมอเตอร์ทวนเข็ม , active low
     string_close_open_v11=string_open+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);

      Blynk.setProperty(V7,"color","#FF4000");// สีแดง
      delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
      digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
     string_close_open_v11=string_close+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);

      Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
      }//else if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
   } //(upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
}


void nighttime()
{
  Serial.println("เป็นเวลากลางคืน");// จะปิดอาหารไก่บ้าน   แต่ไก่โรดส์เปิดตลอด
  Blynk.setProperty(V3,"color","#6E6E6E");//Grey
  //ให้มอเตอร์หยุดทำงาน
  digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
     string_close_open_v10=string_close+","+string_close_open_v10;
    Blynk.virtualWrite(V10, string_close_open_v10);

 digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
    string_close_open_v11=string_close+","+string_close_open_v11;
    Blynk.virtualWrite(V11, string_close_open_v11);

 //ให้มอเตอร์ทำงานได้ แต่ต้องเช็คว่าอาหารถัง1 มีไหม และ ในถัง2 หมดแล้วยัง 
 //ถ้าครบ2 เงื่อนไข  มอเตอร์ทำงาน
 upper_tank_sensor_val = digitalRead(upper_tank_sensor);
 Serial.print("upper_tank_sensor_val: ");
 Serial.println(upper_tank_sensor_val);
 if (upper_tank_sensor_val == 1) //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
    { //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
    Serial.print("อาหารถังบนใกล้หมด ");
    Serial.println("ปิดมอเตอร์");
    Blynk.setProperty(V0,"color","#FF4000");// สีแดง
    LINE.notify("อาหารไก่ใกล้หมด");
    digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
     string_close_open_v10=string_close+","+string_close_open_v10;
    Blynk.virtualWrite(V10, string_close_open_v10);

    digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
    string_close_open_v11=string_close+","+string_close_open_v11;
    Blynk.virtualWrite(V11, string_close_open_v11);

    digitalWrite(ac_control, 0);//ปิดไฟ AC
    delay(5000);
    //break;
    }//if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน 
 else //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
     { //else if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
     // เริ่มตรวจถัง 2 โดยใช้ capacitive  proximity sensor แบบสีเหลือง
     //เงื่อนไข2  rhodes_tank_sensor_val=1 คือถังไก่โร้ดส์ใกล้หมด
     delay(2000);
     rhodes_tank_sensor_val = digitalRead(rhodes_tank_sensor); //ในการอ่านค่าสวิตช์ที่ต่ออยู่กับ ขาD3 มาเก็บในสตัวแปล rhodes_tank_sensor_val ผ่านD3 ถ้าอาหารถัง2หมด ไฟสว่าง จะต่อวงจร จะทำให้rhodes_tank_sensor_val=0 
     Blynk.setProperty(V0,"color","#2EFE2E");// สีเขียว
     Serial.print("ถังอาหารไก่โร้ดส์: ");
     Serial.println(rhodes_tank_sensor_val);
     if (rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
         //อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์ดับ, ไม่มีไฟมาที่ ขา rhodes_tank_sensor ,HIGH คือเต็ม  ยกเว้นในไก่โร้ดเพราะสลับขาที่ relay AC ที่ออกเป็น NC แต่ไก่บ้านออก NO
         { //(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
         Serial.print("อาหารไก่โรดยังมีอีก ");
         Serial.println("ปิดมอเตอร์");
         Blynk.setProperty(V1,"color","#2EFE2E");// สีเขียว
         delay(2000);
         digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
     string_close_open_v10=string_close+","+string_close_open_v10;
     Blynk.virtualWrite(V10, string_close_open_v10);

         digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
     string_close_open_v11=string_close+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);

         digitalWrite(ac_control, 0);// ปิดไฟ AC
         delay(5000);
         }//(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
     else
         { //else if(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
         Serial.print("อาหารถังไก่โรดส์ใกล้หมด ");
         Blynk.setProperty(V1,"color","#FF4000");// สีแดง
         Serial.print("อาหารถังบนยังมีอีก ");
         Serial.println("เปิดมอเตอร์");
         digitalWrite(ac_control, 0);// เปิดไฟ AC
         delay(2000);
         digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
     string_close_open_v11=string_close+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);

         digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเข็ม , active low,motor_rhodes=motor_rhode
     string_close_open_v10=string_open+","+string_close_open_v10;
     Blynk.virtualWrite(V10, string_close_open_v10);

         Blynk.setProperty(V7,"color","#FF4000");// สีแดง
         //motor3=20;
         delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
         digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
     string_close_open_v11=string_close+","+string_close_open_v11;
     Blynk.virtualWrite(V11, string_close_open_v11);

         Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
         }//else if(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup

     } //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน

}



  void check_time()
  {
//     //configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //แสดงเวลาปัจจุบัน
//     time_t now = time(nullptr);
//     struct tm* p_tm = localtime(&now);
//1 
  
  timeClient.update();

  time_t epochTime = timeClient.getEpochTime();
  
  formattedTime = timeClient.getFormattedTime();
//  String formattedTime2 = timeClient.getFormattedTime();
  Serial.print("Formatted Time: ");
  Serial.println(formattedTime);  

  currentHour = timeClient.getHours();// int currentHour อยู่ด้านบนแล้ว เพื่อประกาศเป็น global var
  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:
  currentDate = String(weekDay) + "-" +String(monthDay) + "-" + String(currentMonth) + "-" + String(currentYear) ;
  Serial.print("Current date: ");
  Serial.println(currentDate);
//1
     Serial.print("current Time=");
     Serial.println(formattedTime);
  Blynk.virtualWrite(V12, currentDate);
    Blynk.virtualWrite(V13, formattedTime);
  Blynk.syncAll();      
  }

5กค65


เพิ่มเซ็นเซอร์วัดความชื้นในดิน
ซื้อจากช้อปปี้ ราคาไม่เกิน30บาท

โค้ดที่เกี่ยวข้อง

//A0(analogPin)
//Blynk
float min_soil_moisture = 9999; // init with absurdly high value
float max_soil_moisture =-9999; // init with absurdly low value
unsigned long start_millis_soil_check;
int vegetable_soil_dryness = 0;
float vegetable_soil_dryness_blynk=910;
int analogPin = A0; 
bool soil_dryness_state = 0;//ดินเปียกlow active module  0คือแห้ง  1คือเปียก


BLYNK_WRITE(V25)
{
  vegetable_soil_dryness_blynk = param.asInt(); // assigning incoming value from pin V1 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("vegetable_soil_dryness_blynk: ");
  Serial.println(vegetable_soil_dryness_blynk);
//  periodMinevening_watering = pin2Value;
}

void setup()
{
  Blynk.begin(auth, ssid, password);  
   Blynk.virtualWrite(V25,vegetable_soil_dryness_blynk);

}
void loop() 
{
   check_soil_dryness();
}
void check_soil_dryness()
{
    vegetable_soil_dryness = analogRead(analogPin);
    Blynk.virtualWrite(V2,vegetable_soil_dryness);
  if (vegetable_soil_dryness > vegetable_soil_dryness_blynk) 
      {
       soil_dryness_state = 0;//ดินแห้ง low active module
      }
  else
  {
       soil_dryness_state = 1;//ดินเปียก low active module
      }

  if ((millis()-start_millis_soil_check)<86400000)// ในวันเดียวกัน 86400000=1d;
    { 
    if (max_soil_moisture<vegetable_soil_dryness)   
      {
        max_soil_moisture=vegetable_soil_dryness;
      Blynk.virtualWrite(V24, String(max_soil_moisture)+",เวลา("+String(currentHour)+"/"+String(currentMinute)+")");
      }
    if (min_soil_moisture>vegetable_soil_dryness) 
        { 
        min_soil_moisture=vegetable_soil_dryness;
      Blynk.virtualWrite(V23, String(min_soil_moisture)+",เวลา("+String(currentHour)+"/"+String(currentMinute)+")");
        } // record new min value

      }
  else // วันใหม่
      {
        max_soil_moisture = -9999;
        min_soil_moisture = 9999;
      
       start_millis_soil_check = millis();
       }
   Blynk.virtualWrite(V3,soil_dryness_state);//low active module
}



ถ้าผิดพลาดประการใด ขออภัย และช่วยชี้แนะด้วยครับ ขอบคุณครับ

1 Likes

7กค65
เรื่องรดน้ำผัก เรื่องโค้ดตั้งเวลารดน้ำอัตโนมัติ น่าจะเวอร์กแล้วครับ
วันนี้ลองต่อท่อไมโคร ออกจากโซลินอยด์วาล์วขนาด4หุน
แต่ปริมาณน้ำที่ผมใช้ท่อไมโคร เส้นผ่าศก.เพียง 8มม.เส้นเดียว รดต้นถั่วฝักยาว ประมาณ 30ต้น ไม่พอครับ
และแหล่งน้ำออกจากประปา ผ่านโซลีนอยด์วาล์ว4หุน และวันนี้ประปาไม่ค่อยไหลด้วย
เพื่อนๆใช้ท่อแบบไหนบ้าง เป็นครั้งแรกของผมครับ

ผมกำลังคิดว่า ถ้าใช้ที่ไมโคร แต่ใช้เวลาที่นานขึ้น หรือ เป็นท่อ PVC หรือ ท่อPE แน่นอน โซลินอยด์วาล์ว4หุนคงไม่พอ
อาจต้องใช้ปั๊มน้ำต่างหาก…
8กค65
ได้ซื้อ ท่อPE 20มม.ยาว50ม.

อยากถามเพื่อนๆว่า เวลากำหนดpin D6 ให้เป็าinput_pullup ต้องต่อตัวต้านทาน ระหว่างpinD6กับ5Vไหมครับ
ผมใช้nodemcu…

โดยปกติต้องต่อครับ ถ้าไม่ต่ออาจเขอ กรณีมันจับสถานะ high low ไม่ได้และมีนจะ on off รั่วๆ ครับ

ขอบคุณ​ครับ​

ตอนแรกผมไม่ต่อ เพราะอ่านจากเว๊บบอกว่าnodemcuมี built-in resisterสำหรับ input_pullup
แต่พอทำจริงให้เซ็นเซอร์ถังไก่บ้าน ส่งค่าผิดบ้างถูกบ้าง หลังจากผมใส่ 10K ohmระหว่างD6กับgnd
ผลออกมาถูกต้องมากเลยครับ
แสดงว่า​builtin resister นั้นให้ignoreหรือไม่ต้องไปสนใจเลยใช่ไหมครับ

9กค.65
เจาะท่อ PE-คลิป

10กค.65
วันนี้เพิ่มโค้ดให้ หลอดไฟทำงานจากหลายเงื่อนไขได้

bool lamp_hen_maxtemp=1;
bool lamp_hen_blynkV8=1;

void loop()
  ..
  ..
  digitalWrite(lamp_hen, lamp_hen_maxtemp);
  digitalWrite(lamp_hen, lamp_hen_blynkV8);
  .. 

อันแรกทำงานเมื่อ ถ้าอุณหภูมิตอนกลางวันสูงเกินไป ไก่จะกินอาหารน้อย,กินน้ำมาก ในตอนค่ำให้เปิดหลอดไฟ18.00-21.00น.เพื่อจะให้ไก่กินอาหารนานขึ้น
อันที่2 ให้เปิดไฟเมื่อกดปุ่มจากblynk
11กค65
ทำที่เกาะยึดต้นถั่วฝักยาว ต้นถั่วอายุ14วัน


หาท่อนไม้เก่าๆ ใช้ได้ครับ

มาวางตามแนวแถวต้นที่ปลูก

ใช้เชือกฟางประหยัดดีครับ

มาผูกโยงเป็นรูปสามเหลี่ยมดังรูป (เครดิตจากพี่ๆในยูทูปครับ)

1 Likes

10กค65
วันนี้จะทำเรื่องการช่วยบรรเทาอากาศร้อนของเล้าไก่
โดยอาศัย ปั๊มน้ำ12v แบบจุ่ม,

และตัวพ่นฝอยน้ำในโรงเรือน,และปล่อยน้ำบนหลังคาสังกะสี
โดยใช้ node2 ทำงานเรื่องนี้
11กค65


ต่อท่อยาง5หุนเข้ากับปั๊ม

จากนั้น ผมแยกออกทางท่อไมโคร ได้3เส้น เพื่อทำเป็นน้ำฝอย โดยใช้กาว2ตันอุดช่องว่างที่ปลาย

หวังว่าคงไม่รั่วนะครับ

15กค.65
วันนี้ได้เพิ่มลูกเล่นเกี่ยวกับ โปรเจคนี้คือ Voltage Meter Sensor
elecCapture
คาดหวัง
ผมอยากรู้ว่า โวลต์ที่เลี้ยง nodemcu เป็นอย่างไร ทำไมชอบ ออฟไลน์บ่อย ส่วนหนึ่ง แรงดันอาจไฟตกในขณะนั้นก็เป็นไปได้

ผมได้ลอง sketch up ตามตัวอย่างหลายแบบ ผมเอามาดัดแปลงไม่เป็น แต่ค่าไม่ได้ที่ตามต้องการ
เดี๋ยวว่างๆจะถามเพื่อนๆภายหลัง
วันนี้ แก้ขัดไปก่อน แบบบ้านๆไปก่อน 555
เช่น อ่านค่าจาก analogread ได้ 321 แล้วผมวัด โวลต์ที่ แบตได้ 4.69โวลต์
เลยทำสูตรเองให้เลยได้ ตามข้างล่างครับ
**ลองใช้ฟังก์ชั่น map() แล้ว ผลออกเป็นจำนวนเต็ม เช่น 4.66V จะแสดง เป็น 4
แต่เราอยากทราบทศนิยมด้วย เลยต้องทำสูตรดังกล่าวครับ

float vcc_voltage; 
const int  analogPin = A0; 

void setup() 
{   
 Serial.begin(9600);   
} 
void loop() 
{       
    int a=analogRead(A0);
 Serial.println(a);          

 Serial.print("vcc_voltage=");  
         
    vcc_voltage = (4.69/321)*(a);
//  vcc_voltage = analogRead(A0);
 Serial.println(vcc_voltage);          
 delay(1000); 
}    

///

ผลที่ได้แบบนี้ครับ
elec2Capture

เดี๋ยวถ้าได้แบบมาตรฐานเมื่อไหร่จะทับตัวนี้ครับ

1 Likes

มีเก็บแบบฐานขอมูลไหมครับ อย่าลืมว่าเวลารีเซตค่ามันก็จะหายไป ควรเก็บค่าไว้ใน eeprom ทุกๆ กี่นาทีก็ว่าไป หรือส่งขึ้นกราฟ blynk ก็ได้ มันจะเห็นเทรนว่าก่อนหน้านี้เท่าไหร่

หรือว่าตัวนี้ต่อ mcu แยกออกมาจากตัวหลัก

ขอบคุณครับ
-Voltage Meter Sensorนี้ต่อเข้าตัว node1 เพราะ A0ยังว่างครับ
-ยังไมเก็บในฐานข้อมูลเลยครับ
-คงทำเป็นกราฟที่แอดมินแนะนำครับ
-เก็บใน eeprom มีตย.ไหมครับ

ลองดูกระทู้นี้ครับ

ตัวอย่างหลักไม่ยากครับ มันเป็นหน่อยความจำที่ไม่ต้องใช้ไฟเลี้ยง เพราะงั้นไฟดับหรือรีเซต ตัวแปรนั้นก็ยังคงอยู่ แค่กำหนดให้เข้าไปอ่านก่อนเริ่มรันในลูปหลัก