Sensor I2C พบว่าเมื่อเอาไปใส่ code new Blynk 2.0 แล้วไม่อ่านค่า sensor

ขอความช่วยเหลือครับ ผม run code soil moisture บน esp8266 + Chirp (I2C soil moisture) ได้ค่าออกมา ดีครับแปรผันตามความชื้นที่เราทดลอง ตามรูปครับ



ค่าที่ได้

แต่ พอลอง รวม code กับ blynk new 2.0 แล้ว ไม่สามารอ่านค่าได้ครับ ทั้งที่ไช้วงจรเดิม
ค่าที่ได้ ไม่เปลี่ยนแปลงและส่งมาเร็วมาก

สำหรับ code ที่ทำงานปกติตอนยังไม่รวมกับ blynk

/*
Chirp - arduino example

Connection 
Chirp pin 1 - no connection
Chirp pin 2 - Arduino VCC
Chirp pin 3 - Arduino A5
Chirp pin 4 - Arduino A4
Chirp pin 5 - Arduino pin 2
Chirp pin 6 - Arduino GND
*/

#include <Wire.h>

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(1100);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
}

void setup() {
  Wire.begin();
  Serial.begin(9600);

  pinMode(2, OUTPUT);
  digitalWrite(2, LOW); //Reset the Chirp
  delay(1);
  digitalWrite(2, HIGH); //Go out from reset
  writeI2CRegister8bit(0x20, 3); //send something on the I2C bus
  delay(1000); //allow chirp to boot
}

void loop() {
  Serial.print("Soil Moisture Capacitance: ");
  Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
  delay(500);
}

และ code ที่รวมกับ blynk แล้ว error


// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "TMPLvsXDEA6l"
#define BLYNK_DEVICE_NAME "Smart Farm"
#define BLYNK_FIRMWARE_VERSION        "0.6.9"
/* read data from I2C soil moiusture */

#define BLYNK_PRINT Serial
#define APP_DEBUG

#include "BlynkEdgent.h"
#include <Wire.h>

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(1100);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
}

void setup()
{
  Wire.begin();
  Serial.begin(9600);

  pinMode(2, OUTPUT);
  digitalWrite(2, LOW); //Reset the Chirp
  delay(1);
  digitalWrite(2, HIGH); //Go out from reset
  writeI2CRegister8bit(0x20, 3); //send something on the I2C bus
  delay(1000); //allow chirp to boot
  BlynkEdgent.begin();
}

void loop() {
 Serial.print("Soil Moisture Capacitance: ");
  Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
  delay(500);
  BlynkEdgent.run();
}

ผมสามารถแก้ตรงไหนได้ครับ

1.อันดับแรกเพิ่มหรือลด delay ตรงนี้ดู เนื่องจากว่าเราเพิ่ม blynk เข้าไปทำให้ จังหวะที่ i2c มันอ่านได้จะไม่ตรงกับของเดิม
2.ไม่งั้นอาจจะต้องวนอ่านจนกว่าจะได้ค่าแล้วค่อยออกมา แต่ก็ไม่รู้ว่า Blynk จะดับไปก่อนรึป่าว

ขอบคุณครับ
ผมลอง แก้ 2000 -->9000 ตามกระทู้เก่าของ แอดมิน และ 2000–>1000 ก็ยังไม่แสดงค่าครับ
แต่มีจุดสังเกตคือถ้าผม กด ปุ่ม reset จะทำให้ LED บอร์ด sensor ติด-ดับ และ จะมีการส่งค่ามาชั่วขณะแล้วไม่นานจะกลับไปนิ่งไม่ส่งค่าอะไรเหมือนเดิม
เดี๋ยวผมส่ง วิดีโอให้ดูครับ

1 Likes

video 13 M วางไม่ได้ครับเดี๋ยวกำลังหาวิธีวางนะครับ

ทางเลือกที่ 2 เอาโค้ตนี้ไปแทนใน void loop ()



while (readI2CRegister16bit(0x20, 0) == 4294967295) {
   Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
 }
  BlynkEdgent.run();

ยังไม่ได้ครับ อาการจะเหมือนเดิม และถ้าปุ่ม reset ถูกกดจะ เหมือนกระตุ้นให้ส่งค่า แล้วก็ดับไปซะงั้น


// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "TMPLvsXDEA6l"
#define BLYNK_DEVICE_NAME "Smart Farm"
#define BLYNK_FIRMWARE_VERSION        "0.7.2"
/* read data from I2C soil moiusture */

#define BLYNK_PRINT Serial
#define APP_DEBUG

#include "BlynkEdgent.h"
#include <Wire.h>

void setup()
{
  BlynkEdgent.begin();
  Wire.begin();
  Serial.begin(9600);
}

 void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(1100);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
  
}

void loop() {
  while (readI2CRegister16bit(0x20, 0) == 4294967295) {
   Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
 }
  BlynkEdgent.run();
}

มันอ่านได้อะไรขอดูหน่อย

ค่านี้ครับ

4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295
4294967295 , Light: 4294967295

ศึกษากระทู้นี้

ลองทำ timer ไป version ก่อนหน้า แล้วครับ แต่ผลก็ยังเหมือนเดิม


// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "TMPLvsXDEA6l"
#define BLYNK_DEVICE_NAME "Smart Farm"
#define BLYNK_FIRMWARE_VERSION        "0.6.8"
/* read data from I2C soil moiusture */

#define BLYNK_PRINT Serial
#define APP_DEBUG

#include "BlynkEdgent.h"
#include <Wire.h>

BlynkTimer timer;

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(1100);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
  }
void myTimerEvent(){
  Serial.print("Soil Moisture Capacitance: ");
  Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
  delay(500);
}
void setup()
{
  Wire.begin();
  BlynkEdgent.begin();
  Serial.begin(9600);

  pinMode(D4, OUTPUT);
  digitalWrite(D4, LOW); //Reset the Chirp
  delay(1100);
  digitalWrite(D4, HIGH); //Go out from reset
  writeI2CRegister8bit(0x20, 3); //send something on the I2C bus
  delay(1000); //allow chirp to boot
  timer.setInterval(10000L, myTimerEvent);
  
}

void loop() {

  BlynkEdgent.run();
  timer.run(); 
}
void myTimerEvent(){
  Serial.print("Soil Moisture Capacitance: ");
  Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
  delay(2000);
}

ลองดู

ตอนนี้ Blynk OTA update ไม่ได้เดี๋ยวผมมาอัพเดทให้นะครับ

ผลการรัน ครับ ยังไม่มีอะไรเปลี่ยน

Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295

ส่วนของโค๊ด


// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "TMPLvsXDEA6l"
#define BLYNK_DEVICE_NAME "Smart Farm"
#define BLYNK_FIRMWARE_VERSION        "0.7.3"
/* read data from I2C soil moiusture */

#define BLYNK_PRINT Serial
#define APP_DEBUG

#include "BlynkEdgent.h"
#include <Wire.h>

BlynkTimer timer;

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(1100);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
  }
  void myTimerEvent(){
  Serial.print("Soil Moisture Capacitance: ");
  Serial.print(readI2CRegister16bit(0x20, 0)); //read capacitance register
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  delay(2000);                   //this can take a while
  Serial.print(" , ");
  Serial.print("Light: ");
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register
  delay(2000);
}

void setup()
{
  Wire.begin();
  BlynkEdgent.begin();
  Serial.begin(9600);

  pinMode(D4, OUTPUT);
  digitalWrite(D4, LOW); //Reset the Chirp
  delay(1100);
  digitalWrite(D4, HIGH); //Go out from reset
  writeI2CRegister8bit(0x20, 3); //send something on the I2C bus
  delay(1000); //allow chirp to boot
  timer.setInterval(10000L, myTimerEvent);
  
}

void loop() {

  BlynkEdgent.run();
  timer.run(); 
}

อุ๊ย แอดครับ เหมือนจะ เวริกนะครับ
เด๊๋ยวผมขอมอนิเตอรยาว

[7952] Hold the button for 10 seconds to reset configuration...
[10330] Using Dynamic IP: 192.168.176.201
[10330] CONNECTING_NET => CONNECTING_CLOUD
[10442] Current time: Fri Dec 24 11:08:06 2021
[10442] Connecting to blynk.cloud:443
[11606] Ready (ping: 11ms).
[11711] CONNECTING_CLOUD => RUNNING
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 514 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 514 , Light: 514
Soil Moisture Capacitance: 513 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 185
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 512
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 47362 , Light: 514
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 511
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture Capacitance: 4294967295 , Light: 4294967295
Soil Moisture ดCapacitance: 4294967295 , Light: 4294967295

โค้ตไหนครับ

Code ที่ แอดให้แก้ค่า delay(2000); ครับ แต่เหมือนจะต้องมีปรับปรุงเพราะเมื่อกี้ sensor จู่ๆดับ เดี๋ยวผมขอ run หลายๆรอบแล้วมาสรุปให้นะครับ /ขอบคุณแอดมากกก เลยครับ

ที่ผมใช้จะใส่ไว้ 2 ช่วงครับไม่งั้นมันก็จะหาไม่เจอ

ถ้าจะเอาชัวๆ เลยว่าเจอแน่ๆ อาจจะต้องใช้ millis ในการจับเวลาระหว่างช่วงที่มันหาเจอว่าห่างกันกี่ ms แล้วเอาค่ามาใส่ อันนี้ผมก็ไม่เคยลองเหมือนกัน พึ่งนึกออกสด ๆ กันเลยทีเดียว

เคสนี้เป็นไงบ้างครับ อัพเดทกันหน่อยนะ