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

ทำไป ถามไปเรื่อง nodemcu-เลี้ยงไก่-ปลูกผัก
ผมใช้ nodemcu ที่เลี้ยงไก่ มาเสริมเรื่องปลูกผักต่อ
เนื้อหาต่อไปนี้ เป็นการฝึกและใช้งานจริง จะมีการลองผิดลองถูกมากมาย ถ้าเพื่อนมีเวลา ถ้าเห็นส่วนไหนไม่ถูก ช่วยชี้แนะด้วยครับ
ถ้าเห็นว่ามีประโยชน์ก็เอาไปต่อยอดได้เลยครับ ขอบคุณครับ
เมื่อวานได้ลองใช้ mcp23017 เพื่อเพิ่มขา digital i/o อีก16ขา จริงๆแล้วเพิ่ม 14 ขาเพราะ ต้องใช้ pin d1ต่อscl,d2ต่อsdaเพื่อมาต่อกับ mcp23017 แบบ i2c แต่ถ้าต่ออีกแบบหนึ่ง ต้องใช้ขาจากnodemcu 4ขา เพิ่มได้12ขา (ถ้าผิดขออภัย)
27มิย65
ผมจะเริ่มทำขา output จาก mcp 1pin เพื่อควบคุมการเปิดปิด โซลินอยด์ วาล์วน้ำ 12vdc และเพิ่ม button,ledโซลินอยด์ใน blynkด้วย
image
ตัวอย่าง
mcp20317_schemss1

1 Likes

ไอเดียดีมากครับ อัพเดทเรื่อยๆ นะครับ รอติดตาม ถ้าติดปัญหาจะได้ช่วยกันยำ 555

มีปัญหาเพียบครับ

จัดไปครับปัญหามีไว้แก้

มีคนมารอตอบแต่เช้าแล้ว… 555
ขอบคุณครับ

นี่คือ sketch ล่าสุด(28มิย.65)


//Digital pins 0—15 can be INPUT, OUTPUT, or INPUT_PULLUP
//
//D0(motor_rhodes- ไก่โร้ดส์- D0/GPIO16,INPUT_PULLDOWN),D1(ต่อmcp230017),D2(ต่อmcp230017),
//D3(rhodes_tank_sensor"ถังอาหารไก่โร้ดส์"D3 = GPIO 0),D4(upper_tank_sensor ถังบนD4 = GPIO 2),
//D5((24 มิย.switch sensor ถังไก่บ้าน)(dht_chick ลูกไก่),D6(local_tank_sensor ไก่บ้านD6 = GPIO 12),D7(ac control),
//D8(motor_local),D9(dht),D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์)
//(24 มิย.)ขอยืม /D5((24 มิย.เปิดปิดไฟsensor ถังไก่บ้าน)sensor dht2,D1((24 มิย.เปิดปิดไฟsensor ถังบน)หลอดไฟลูกเจี๊ยบ เพราะpinไม่พอ(24 มิย.)
//D1((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
//D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
//D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
//
//mcp23017(1,2,3,4,5,6,7,8(solenoid_vegetable),21,22(switch_sensor_upper_tank),23(lamp),24,25,26,27,28)

//ให้ได้อุณหภูมิ32องศา ถ้าเกินให้ดับไฟ
#include <Wire.h>
//-1·แจ้งทางไลน์
#include <TridentTD_LineNotify.h>
#define LINE_TOKEN  "xxxxWnJBe91kZ157DTvY2nyqq1"   //  ใส่ รหัส TOKEN  ตะลุโบะ- xxxxLEHiuRvZQBH95PrycnXYZug7
// HIGH คือ หมด LOW คือมี
//0.ดึงเวลาจากเน็ตมาใช้
#include <NTPClient.h>
#include <time.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
////q
#include <Adafruit_MCP23X17.h>
Adafruit_MCP23X17 mcp;

////-q
//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 motor_rhodes_button_v23(V23);
WidgetLED lampblynk(V9);
WidgetLED lampchickblynk(V10);
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);
 float temperature;
 float humidity;
 String formattedTime;
 String currentDate;
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[]="xxxxOS7h9SyuQUF5p-ggfv";

const char *ssid     = "xxx";
const char *password = "xxxx1";
int a=0;

/////////
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
int currentHour = 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;
#define switch_sensor_upper_tank  22
//int switch_sensor_upper_tank = 22//D1;
//int lamp_chick = D1;// 24มิย65
//D1((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;
#define lamp 23     // MCP23XXX pin LED is attached to
//int lamp = 23//D2;
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;
////w
float maxtemp = -9999; // init with absurdly low value
float mintemp = 9999; // init with absurdly high value

////-w
float currenttemp=0;
unsigned long startMillisTemp;                        
unsigned long currentMillisTemp;                      
unsigned long startMillisReadData;                    
unsigned long currentMillisReadData;                  
const unsigned long periodReadData = 1000;            
int ResetEnergy = 0;                                  
unsigned long startMillis1; 
BlynkTimer timer;
//0  ตรวจสอบอุณหภูมิ
#include "DHT.h"
DHT dht;
//DHT dht_chick;24 มิย. 65
// เก็บข้อมูลอุณหภูมิ ทุกครึ่งชั่วโมง
///ผัก///
#define solenoid_vegetable 8
WidgetLED solenoid_vegetable_led_blynk_v21(V21);
//button solenoid_vegetable_button_blynk_v22
///-ผัก///
 
void setup()
{
  //while (!Serial);
  Serial.println("MCP23xxx Button Test!");
   mcp.digitalWrite(solenoid_vegetable, 0);//active low 24 มิย. 65
   solenoid_vegetable_led_blynk_v21.on();

  // uncomment appropriate mcp.begin
  if (!mcp.begin_I2C()) {
  //if (!mcp.begin_SPI(CS_PIN)) {
    Serial.println("Error.");
    while (1);
  }
    startMillis1 = millis();
         Serial.begin(9600);
     //dht11
     dht.setup(D9); // ขาD9
//24 มิย. 65     dht_chick.setup(D5); // ขาD5
//    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();
//     lampblynk.off();
//     lampchickblynk.off();


     //-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);
     mcp.pinMode(switch_sensor_upper_tank, OUTPUT);
      //int switch_sensor_upper_tank = D1;
      //D1((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
      mcp.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 "ถังอาหารไก่โร้ดส์: "   //แทนpinMode(infrared3, INPUT);
 
      //3.ถังอาหารที่3 คือถังที่ให้อาหารไก่บ้านกิน
     pinMode(local_tank_sensor, INPUT_PULLUP);// กำหนดขาทำหน้าที่ให้ขา D6 เป็น INPUT รับค่าจากเซ็นเซอิร์local_tank_sensor    //แทนpinMode(infrared3, INPUT);

     
     digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์
     digitalWrite(motor_local, 1);//ปิดมอเตอร์
     pinMode(ac_control, OUTPUT); //ควบคุมไฟ AC 
     mcp.pinMode(lamp, OUTPUT);
     mcp.digitalWrite(lamp, 1);//active low
     //pinMode(lamp_chick, OUTPUT);//D1(lamp_chick)  24 มิย. 65
     //digitalWrite(lamp_chick, 1);//active low 24 มิย. 65
     digitalWrite(ac_control, 0);//ปิดไฟ AC
     ///ผัก///
     mcp.pinMode(solenoid_vegetable, OUTPUT);
     mcp.digitalWrite(solenoid_vegetable, 1);//active low 24 มิย. 65
     solenoid_vegetable_led_blynk_v21.off();
     ///-ผัก///
//    timer.setInterval(180000L, Temptask);
    timer.setInterval(12000000L, lamptask);
    timer.setInterval(180000L, Temptask);
    timer.setInterval(120000L, check_sensortask);
//    timer.setInterval(30000L, Tempchicktask);24 มิย. 65
//    timer.setInterval(12000000L, lamptask);//20 นาที

  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_local_tank, 0);//active low 24 มิย. 65
       mcp.digitalWrite(switch_sensor_upper_tank, 0);//active low 24 มิย. 65
  delay(100);
  upper_tank_sensor_duration = pulseIn(upper_tank_sensor, HIGH,2000);
  Serial.println(upper_tank_sensor_duration);
//   Blynk.virtualWrite(V18, upper_tank_sensor_duration);
   if(upper_tank_sensor_duration!=0)
     {
     mcp.digitalWrite(switch_sensor_upper_tank, 1);//active low 24 มิย. 65
     upper_tank_sensor_val_high_blynkled_v15.on();
     }
     else
     {
     upper_tank_sensor_val_high_blynkled_v15.off(); 
      }
  digitalWrite(switch_sensor_rhodes_tank, 0);//active low 24 มิย. 65
  delay(100);
  rhodes_tank_sensor_duration = pulseIn(rhodes_tank_sensor, HIGH,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 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง. แจ้งให้เต็มก่อนมิฉะนั้นมอเตอร์จะหมุน
     rhodes_tank_sensor_val_high_blynkled_v16.on();
     }
     else
     {
     rhodes_tank_sensor_val_high_blynkled_v16.off(); 
      }
  digitalWrite(switch_sensor_local_tank, 0);//active low 24 มิย. 65
  delay(100);
  local_tank_sensor_duration = pulseIn(local_tank_sensor, HIGH,2000);
  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();
     }
     else
     {
     local_tank_sensor_val_high_blynkled_v17.off(); 
      }
    Blynk.syncAll();          
  }


void Temptask(){
     delay(dht.getMinimumSamplingPeriod());
  float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
  Serial.print("อุณหภูมิ");
  Serial.println(temperature, 1);
  currenttemp = temperature;
    Blynk.virtualWrite(V4, temperature);
  Blynk.virtualWrite(V5, humidity);

  currentMillisTemp = millis();
  if ((currentMillisTemp-startMillis1)<86400)// ในวันเดียวกัน 
  { if (currenttemp>maxtemp)   {maxtemp=currenttemp;}//if (value > maxval) { maxval = value; } // record new max value
    if (currenttemp<mintemp) { mintemp = currenttemp; } // record new min value

   }
  
  else // วันใหม่
  {maxtemp = currenttemp;
  startMillis1 = currentMillisTemp;
    }
    
    Blynk.virtualWrite(V6, maxtemp);
    Blynk.syncAll();      
    }

//24 มิย. 65
//void Tempchicktask()
//    {
//     delay(dht_chick.getMinimumSamplingPeriod());
//    float temperature2 = dht_chick.getTemperature(); // ดึงค่าอุณหภูมิ
//    Serial.print("อุณหภูมิรังลูกไก่");
//    Serial.println(temperature2, 1);
//    Blynk.virtualWrite(V11, temperature2);
//  //ให้ได้อุณหภูมิ32องศา ถ้าเกิน35ให้ดับไฟ
//   if (temperature2<=31)//
//    { 
//  //เปิดหลอดไฟ
//      digitalWrite(lamp_chick, 0);//active low
//     Serial.println("เปิดไฟรังลูกไก่");
//      lampchickblynk.on();
//     }
//   if (temperature2>=35)// 
//    { 
//  //ปิดหลอดไฟ
//      digitalWrite(lamp_chick, 1);//active low
//     Serial.println("ปิดไฟรังลูกไก่");
//      lampchickblynk.off();
//     }
//    
//  
//   }
//  



void lamptask()
{
if((maxtemp > 33) &&( currentHour>18) && ( currentHour<21))
{mcp.digitalWrite(lamp, 0);//เปิด active low}
}
else
{
  mcp.digitalWrite(lamp, 1);// ปิด active low
  }
}


void loop() {

     ///
     check_temp();
     check_time();
     
     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);
  //lamptask();
    Blynk.run();
  Blynk.syncAll();          
     timer.run();
       
}

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

BLYNK_WRITE(V23) 
{
if (param.asInt()==1) {
   digitalWrite(ac_control, 0);//เปิดไฟ AC
   digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเเข็ม , active low
   digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
   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
  Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
  }
}

BLYNK_WRITE(V14) 
{
if (param.asInt()==1) {
   digitalWrite(ac_control, 0);//เปิดไฟ AC
   mcp.digitalWrite(lamp, 0);//เปิด active low}
   lampblynk.on();
   Blynk.setProperty(V14,"color","#FF4000");// สีแดง
  }
else
  {
   digitalWrite(ac_control, 1);//ปิดไฟ AC
   //  delay(5000);
   mcp.digitalWrite(lamp, 1);//เปิด active low}
   lampblynk.off();
   Blynk.setProperty(V14,"color","#2EFE2E");// สีเขียว
  
  }
}
/// ผัก///
BLYNK_WRITE(V22) 
{
if (param.asInt()==1) {
   digitalWrite(ac_control, 0);//เปิดไฟ AC
   mcp.digitalWrite(solenoid_vegetable, 0);//active low 24 มิย. 65
   solenoid_vegetable_led_blynk_v21.on();
  }
else
  {
   digitalWrite(ac_control, 1);//ปิดไฟ AC
   mcp.digitalWrite(solenoid_vegetable, 1);//active low 24 มิย. 65
   solenoid_vegetable_led_blynk_v21.off();
  
  }
}
///-ผัก///
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
   digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
   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
       digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
       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
      digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเข็ม , active low
      Blynk.setProperty(V7,"color","#FF4000");// สีแดง
      delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
      digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
      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
       digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
       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
      digitalWrite(motor_local, 0);//เปิดมอเตอร์ทวนเข็ม , active low
      Blynk.setProperty(V7,"color","#FF4000");// สีแดง
      delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
      digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
      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
 digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
 //ให้มอเตอร์ทำงานได้ แต่ต้องเช็คว่าอาหารถัง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
    digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
    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
         digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
         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
         digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเข็ม , active low,motor_rhodes=motor_rhode
         Blynk.setProperty(V7,"color","#FF4000");// สีแดง
         //motor3=20;
         delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
         digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
         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_temp()
  {
           //0  ตรวจสอบอุณหภูมิ
     delay(dht.getMinimumSamplingPeriod());
//    float motor3 = 0;
  float humidity = dht.getHumidity(); // ดึงค่าความชื้น
  float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
  Serial.print("ความชื้น");
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t");
  Serial.print("อุณหภูมิ");
  Serial.println(temperature, 1);
  Blynk.virtualWrite(V4, temperature);
  Blynk.virtualWrite(V5, humidity);
  Blynk.syncAll();      
  }

  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();
  
  String formattedTime = timeClient.getFormattedTime();
  Serial.print("Formatted Time: ");
  Serial.println(formattedTime);  

  currentHour = timeClient.getHours();// int currentHour อยู่ด้านบนแล้ว เพื่อประกาศเป็น global var
  Serial.print("Hour: ");
  Serial.println(currentHour);  
  int 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); 

  int monthDay = ptm->tm_mday;
  Serial.print("Month day: ");
  Serial.println(monthDay);

  int 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);
//1
     Serial.print("current Time=");
     Serial.println(formattedTime);
  Blynk.virtualWrite(V12, currentDate);
    Blynk.virtualWrite(V13, formattedTime);
  Blynk.syncAll();      
  }

ปัญหา
1.เซ็นเซอร์อาหารหลักไม่สว่าง แต่เซ็นเซอร์อาหารไก่บ้านและไก่โร้ดส์ สว่าง
ลำดับการทำงาน ย้อนหลัง เซ็นเซอร์ <-รีเลย์<-arduino
ที่ต้องเช็ค
อาหารในถังบนหมดอาหารเต็ม
เซ็นเซอร์ ปกติ เวลาผมต่อตรง bypass รีเลย์ เซ็นเซอร์สว่าง
รีเลย์ ปกติ เป็น low active relay , ลองต่อ gnd เข้าin จะปล่อยไฟเข้าเซ็นเซอร์
วัดโวลต์ ระหว่าง gnd กับ in ได้ 3.9v
เจอปัญหา คือ arduino ไม่ปล่อยไฟ gnd เข้าin
mcp Text

1 Likes

มีภาพประกอบด้วยจะดีมากครับ จะเข้าใจปัญหาร่วมได้มากขึ้น


#define switch_sensor_upper_tank  22

     mcp.pinMode(switch_sensor_upper_tank, OUTPUT);
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_local_tank, 0);//active low 24 มิย. 65
       mcp.digitalWrite(switch_sensor_upper_tank, 0);//active low 24 มิย. 65
  delay(100);
  upper_tank_sensor_duration = pulseIn(upper_tank_sensor, HIGH,2000);
  Serial.println(upper_tank_sensor_duration);
//   Blynk.virtualWrite(V18, upper_tank_sensor_duration);
   if(upper_tank_sensor_duration!=0)
     {
     mcp.digitalWrite(switch_sensor_upper_tank, 1);//active low 24 มิย. 65
     upper_tank_sensor_val_high_blynkled_v15.on();
     }
     else
     {
     upper_tank_sensor_val_high_blynkled_v15.off(); 
      }
  digitalWrite(switch_sensor_rhodes_tank, 0);//active low 24 มิย. 65
  delay(100);
  rhodes_tank_sensor_duration = pulseIn(rhodes_tank_sensor, HIGH,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 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง. แจ้งให้เต็มก่อนมิฉะนั้นมอเตอร์จะหมุน
     rhodes_tank_sensor_val_high_blynkled_v16.on();
     }
     else
     {
     rhodes_tank_sensor_val_high_blynkled_v16.off(); 
      }
  digitalWrite(switch_sensor_local_tank, 0);//active low 24 มิย. 65
  delay(100);
  local_tank_sensor_duration = pulseIn(local_tank_sensor, HIGH,2000);
  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();
     }
     else
     {
     local_tank_sensor_val_high_blynkled_v17.off(); 
      }
    Blynk.syncAll();          
  }

upper_tank_sensor_duration = pulseIn(upper_tank_sensor, HIGH,2000); สั่ง pin mcp
สงสัยตัวนี้ครับ
แต่ทำไม
rhodes_tank_sensor_duration = pulseIn(rhodes_tank_sensor, HIGH,2000);สั่ง pin nodemcu
local_tank_sensor_duration = pulseIn(local_tank_sensor, HIGH,2000);สั่ง pin nodemcu
ให้ค่าอีกแบบหนึ่ง ต่างจากที่สั่งขาpin เท่านั้นเอง
ผมวัดโวลต์ gnd vs ขา22 (mcp) ได้3.1v
gnd vs ขาd10 (node) ได้0.1v

ครับ



1 Likes

เจอปัญหาที่ mcp23017 ครับ
ผมลองสั่ง ทางblynk ขา21 โวลต์ไม่เปลี่ยนเลยครับ โดยสั่งเป็น digital write 0
ไม่รู้ว่าเป็นจาก software หรือ hardware ไปต่อไม่ถูกแล้วครับ 555

หรือว่า เปลี่ยนมาใช้ บอร์ด esp32 แทน nodemcu ดีไหมครับ พอดีซื้อมาเก็บไว้ 3 อัน แต่ mcp ซื้อมาแค่อันเดียว ไม่มีที่จะลองเปลี่ยน
แต่ต้องเริ่มเขียนโค้ดใหม่ ต่อสายใหม่อีก

ผมลองเสิร์ชดู ที่นี่ ,และที่นี่

เกินความรู้ของผมแล้วครับ
มีการใส่10k ohm for pullup ด้วย มันจะช่วยในเคสผมไหมครับ

แหล่งที่ผมซื้อ mcp จากที่นี่
libraryที่คนขายแนะนำ ลองแล้ว verifyไม่ผ่าน แต่ผมใช้อันปัจจุบัน verifyผ่าน

ผมลองupload code จาก example

// Blinks an LED attached to a MCP23XXX pin.

// ok to include only the one needed
// both included here to make things simple for example
//#include <Adafruit_MCP23X08.h>
#include <Adafruit_MCP23X17.h>

#define LED_PIN 23     // MCP23XXX pin LED is attached to

// only used for SPI
//#define CS_PIN 23

// uncomment appropriate line
//Adafruit_MCP23X08 mcp;
Adafruit_MCP23X17 mcp;

void setup() {
  Serial.begin(9600);
  //while (!Serial);
  Serial.println("MCP23xxx Blink Test!");

  // uncomment appropriate mcp.begin
  if (!mcp.begin_I2C()) {
  //if (!mcp.begin_SPI(CS_PIN)) {
    Serial.println("Error.");
    while (1);
  }

  // configure pin for output
  mcp.pinMode(LED_PIN, OUTPUT);

  Serial.println("Looping...");
}

void loop() {
  mcp.digitalWrite(LED_PIN, HIGH);
  delay(1000);
  mcp.digitalWrite(LED_PIN, LOW);
  delay(1000);
}

ผมใช้ขา23 ไม่ได้ใช้led แต่ผมวัดโวลต์ที่ pin23 vs gnd ควรได้ค่า 0 และ 5v สลับกัน
จากกันวัด ปรากฎว่า ได้3.5v คงที่ตลอด แบบนี้สรุปว่า icมีปัญหาไหมครับ

ตอนเขียนใน void setup ได้ใส่ pinMode ให้ 21 เป็น output รึยัง

เปลี่ยนมาใช้ได้ก็ดีแต่ต้องโยก library หลายตัวให้รองรับ esp32 ดูว่าอันไหนง่ายกว่ากัน ถ้าเน้นต่อยอดไปเรื่อยๆ ก็เปลี่ยนดีกว่า เพราะ มันเร็วว่า

ไฟเลื่องเราใช้อะไรเลี้ยงครับ ย่านทำงานมัน 3.3 - 5V อยู่แล้ว ต้องเอา led มาเสียบดูก่อนว่ามัน on/off ตามที่สั่งหรือไม่ถ้าได้ก็ปกติ

ถ้า ic เสียมัน upload ไม่ได้แน่ๆ

ใส่แล้วครับ

ตอนนี้ serial monitor ไม่แสดงอะไรออกมาครับ

ถ้าตั้งupload speed ที่9600 จะerror



.error: failed sending 1044 bytes

.error: failed sending 1040 bytes

.error: failed sending 1040 bytes

.error: failed sending 1066 bytes

.error: failed sending 1069 bytes

.error: failed sending 1087 bytes

.error: failed sending 1060 bytes

.error: failed sending 1091 bytes

.error: failed sending 1087 bytes

.error: failed sending 1092 bytes

.error: failed sending 1045 bytes

.error: failed sending 1068 bytes

.error: failed sending 1048 bytes

.error: failed sending 1079 bytes

.error: failed sending 1050 bytes

.error: failed sending 1065 bytes

.error: failed sending 1054 bytes

.error: failed sending 1062 bytes

warning: espcomm_send_command: didn't receive command response

warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed

warning: espcomm_send_command: wrong direction/command: 0x01 0x03, expected 0x01 0x04

error: espcomm_upload_mem failed

error: espcomm_upload_mem failed



Invalid library found in C:\Users\abee\Documents\Arduino\libraries\arduino-library-files-master: no headers files (.h) found in C:\Users\abee\Documents\Arduino\libraries\arduino-library-files-master

Invalid library found in C:\Users\abee\Documents\Arduino\libraries\ArduinoCore-avr-master: no headers files (.h) found in C:\Users\abee\Documents\Arduino\libraries\ArduinoCore-avr-master

Invalid library found in C:\Users\abee\Documents\Arduino\libraries\examples: no headers files (.h) found in C:\Users\abee\Documents\Arduino\libraries\examples

ถ้าตั้ง upload speed 57600 ก็ปกติ
ผมลอง sketch ง่ายๆ เพื่อดูใน serial monitor

unsigned long time1;
void setup() {
  Serial.begin(9600);
}
void loop() {
  time1 = millis();
  Serial.println("Hello World");
  while(millis() < time1+5000);
}

แต่ใน serial monitor ขึ้น


เพราะอะไรครับ

ใช้ไฟจาก Vusb และ GND จาก Base nodemcuครับ
มี capacitor 2200 uF คร่อมด้วย

ขออ้างอิงจากที่เคยทำผ่านมาแล้วครับ


ใช้driver ch340 ครับ
ลงแบบcpxxแล้ว แต่มันจะเลือกใช้ driverนี้ทุกครั้ง
ก่อนหน้านี้ ก็ออกทาง serial ปกติ ครับ
เมื่อกี้ลอง uninstall/install arduino ide ใหม่ก็เหมือนเดิม
serial ขึ้นแบบนี้ครับ

เปลี่ยน baud ความเร็วแล้ว ดีที่สุด ที่ 9600 แต่มันขึ้น ตัวอักษรที่ไม่ต้องการ ด้วย