ส่ง Data จาก Arduino Uno ไป ESP32 ไม่ตรงกันครับ

ผมส่งข้อมูลจาก UNO ไป ESP32 แล้วได้ค่าถูกสลับไม่ถูก เลยลองปริ้นค่า Receiver.available() มาเช็ค แล้วเห็นว่ารอบที่ถูกเมื่อมีข้อมูลส่งมาReceiver.available()จะมีค่ามากกว่า0 แต่พอเป็นรอบที่ไม่ถูกทั้งๆที่ข้อมูลยังไม่ส่งมาแต่Receiver.available() กลับมีค่ามากกว่า 0 ด้วย



ESP32 code

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

HardwareSerial Receiver(2);

#define Receiver_Txd_pin 16
#define Receiver_Rxd_pin 17


char auth[] = "auth token blynk";
char ssid[] = "wifi";
char pass[] = "password wifi";


const int Relay1 = 26;
const int RelayA = 32;
const int RelayB = 2;
const int RelayUp = 25;
const int RelayDown = 33;
int State = LOW;
int selectmode;
bool Auto = false;

WidgetLED led_A(V3), led_B(V4), led_Up(V5), led_Down(V6), led(V7), led_Pump(V8);

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V13);
  Blynk.syncVirtual(V28);
}

BLYNK_WRITE(V28)
{
  State = param.asInt();
  if (State == LOW)
  {
    digitalWrite(Relay1, State);
    led.off();

  }
  else if (State == HIGH)
  {
    digitalWrite(Relay1, State);
    led.on();
  }
}


BLYNK_WRITE(V13)
{
  selectmode = param.asInt();
  if(selectmode==1)
  {
    bool Auto = true;
  }
  else
  {
    bool Auto = false;
    }
}


void setup()
{
  Serial.begin(115200);
  pinMode(Relay1, OUTPUT);
  pinMode(RelayA, OUTPUT);
  pinMode(RelayB, OUTPUT);
  pinMode(RelayUp, OUTPUT);
  pinMode(RelayDown, OUTPUT);
  Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
  Receiver.begin(115200, SERIAL_8N1, Receiver_Txd_pin, Receiver_Rxd_pin);
}


void loop()
{ 
  Serial.print("Rece1 = ");
  Serial.println(Receiver.available());
 while(Receiver.available()>0 )
 {
  Serial.print("Rece3 = ");
  Serial.println(Receiver.available());
  int EC = Receiver.parseInt() ;
  Serial.print("EC= ");
  Serial.println(EC);
  
  int Humidity  = Receiver.parseInt();
  Serial.print("Humidity= ");
  Serial.println(Humidity);

  int WaterSensor = Receiver.parseInt();                             
  Serial.print("waterlevel= ");
  Serial.println(WaterSensor);

  int Light = Receiver.parseInt(); 
  Serial.print("light =  ");
  Serial.println(Light);
  
  float pH = Receiver.parseFloat();
  Serial.print("ph= ");
  Serial.println(pH);
  
  float WaterTemp = Receiver.parseFloat();
  Serial.print("waterTemp= ");
  Serial.println(WaterTemp);
  
  float AirTemp = Receiver.parseFloat();
  Serial.print("AirTemp= ");
  Serial.println(AirTemp);
    
  Blynk.virtualWrite(V9, pH);
  Blynk.virtualWrite(V10, EC );
  Blynk.virtualWrite(V11, Humidity );
  Blynk.virtualWrite(V12, Humidity );
  Blynk.virtualWrite(V14, WaterTemp );
  Blynk.virtualWrite(V15, WaterTemp);
  Blynk.virtualWrite(V17, AirTemp);
  Blynk.virtualWrite(V18, AirTemp);
  Blynk.virtualWrite(V16, WaterSensor);
  Blynk.virtualWrite(V23, WaterSensor);
 }
 delay(5000);
Blynk.run();
}

UNO code

#include "DHT.h"
#include <OneWire.h>
#include <SoftwareSerial.h>
#include "DFRobot_EC.h"
#include <EEPROM.h>
#include <DallasTemperature.h>
#include<Wire.h>
#include "TSL2561.h"

#define DHTPIN 2     
#define DHTTYPE DHT11  

#define POWER_PIN  7
#define SIGNAL_PIN A5

#define StartConvert 0
#define ReadTemperature 1

#define EC_PIN A1

#define ONE_WIRE_BUS 4

TSL2561 tsl(TSL2561_ADDR_FLOAT);

SoftwareSerial linkserial1(0, 1);

DFRobot_EC ec;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int analogInPin = A2;
int WaterSensor  = 0;
int sensorPin = A0;  
int sensorValue = 0;  
float ad7 = 325;     
float ad4 = 50;
float voltage,ecValue;

DHT dht(DHTPIN, DHTTYPE);
void Get_pH()
{ 
  int currentValue = 0;
  
  for (int i = 0; i < 10; i++) 
  {
    currentValue += analogRead(sensorPin);
  }
sensorValue =(currentValue / 10);
//Serial.println(sensorValue);
float m =(-2.9/(ad4-ad7));    
float c = 6.86-(m*ad7);
float pH =((m*sensorValue)+c);
Serial.print("PH = ");
Serial.println(pH);
linkserial1.print(pH);
}

void Get_EC()
{
      voltage = analogRead(EC_PIN)/1024.0*5000; 
      ecValue =  ec.readEC(voltage,25);
      int EC = ecValue;
      Serial.print("^C  EC:");
      Serial.print(EC,2);
      Serial.println("ms/cm");
      linkserial1.print(EC);
 
 }

 void Get_WaterTemp() 
 {
  sensors.requestTemperatures();
  Serial.print("Temperature is: ");
  float WaterTemp = sensors.getTempCByIndex(0);
  Serial.print(WaterTemp); 
  Serial.println(" *C");
  linkserial1.print(WaterTemp);
}
void light_TSL2561()
{
  uint32_t lum = tsl.getFullLuminosity();
  uint16_t ir, full0;
  ir = lum >> 16;
  full0 = lum & 0xFFFF;
  int full = full0;
  Serial.print("light: ");
  Serial.println(full);
  linkserial1.print(full);
}
void setup() 
{
  Serial.begin(115200);
  
  dht.begin();
  linkserial1.begin(4800 );
}

void loop() 
{

  Get_EC();
  
  int Humidity = dht.readHumidity();
  Serial.print(F(" Humidity: "));
  Serial.println(Humidity);
  linkserial1.print(Humidity);
  Serial.print(F("C "));
  


  int WaterSensor = analogRead(analogInPin); 
  Serial.print("Water level = " ); 
  Serial.println(WaterSensor);
  linkserial1.print(WaterSensor);   
  light_TSL2561();
   
  Get_pH();
  Get_WaterTemp();
  
  float AirTemp = dht.readTemperature();
  Serial.print(F("%  Air Temperature: "));
  Serial.println(AirTemp);
  linkserial1.print(AirTemp);
    
  light_TSL2561();
  delay(10000);  
}

ค่าที่ผิด
1619874084659
ค่าที่ถูก
1619874060368

GND 2 บอร์ดถึงกันไหมครับ

หมายถึงให้เชื่อม GND สองบอร์ดด้วยกันหรอครับ ไม่ได้เชื่อมครับ

เชื่อมด้วยสิครับ

ในระบบ มันต้องมี 3 เส้นนะ

ลองเสียบ GND แล้วก็ยังเป็นเมือนเดิมครับ

แหล่งจ่ายใช้อะไรจ่ายครับ มาจากที่เดียวกันไหม

อันนี้เราดูตัวอย่างจากไหนครับ มีไหม อันนี้ผมว่าน่าจะเป็นปัญหาว่ามันส่งกับรับ ผิดพลาด จังหว่ะมันไม่ตรงกัน รึป่าว

ทำไม board rate สื่อสาร ตั้งไม่เท่ากันล่ะ ??


1 Like

โอ่วววว ใช่เลยครับพี่ ผมก็เคยเจอเคสนี้ แต่ลืมไปละ

แชร์ ออกมาจาก DecaRoom

1 Like

รู้สึกว่าผมจะแก้ การรับค่าไม่ตรงต่ำแหน่งโดยการเข้ารหัสก่อน แล้วค่อยให้อ่านค่า ที่ส่ง

แต่ถ้าที่ผมเคยเจอบิตเรทไม่ตรงย่านกัน ผลที่ผมเคยเจอคือการรับค่าจะช้ามาาาาาาากครับ

เห็นถามตอนแรกว่าใช้ GND. ร่วมไหม ไม่ได้ใช้ร่วม พอต่อร่วมแล้วยัง Error อยู่ แต่ Error ไปทางไหนไม่ได้บอก
ส่วน board rate ไม่ตรงกัน ก็คุยกันไม่ค่อยรู้เรื่อง ส่ง 10 รับ 4 หรือ ตอบสนองช้า แต่ตอบแล้ว รับค่าช่วงปลายข้อมูล ก็ เอ๋อ ได้ครับ
ต้องค่อยๆแก้ ไปทีละ Error

จริงครับ แนวทางที่ผมให้อาจจะแก้ไม่ได้ อาจจะได้อีกวิธีก็เป็นได้ นั้นก็ทำให้เรารู้ทางแก้ไขเคสแบบนี้เพิ่มมากขึ้น

@Apipon_CHAIWONGNOI ยังไงลองทดสอบได้ผลลัพธ์อย่างไร แคป ผลนั้นมาดูด้วยนะครับ จะได้วิเคราะห์ปัญหากันได้ถูกทาง เช่น คำอธิบาย และ ตัวเลข output ที่ได้