Occasionaly -127 value from DS18B20

Luk on 12 Dec 2022
Latest activity Reply by Christopher Stapels on 6 Jan 2023

Hello, I have a some problem with my OneWire communication and ThingSpeak (ESP8266). Quiet often I have got -127 value, but everything with connections should be OK. I have a free license a TS and two channels in my account. I think that this piece of code may be problem:
void loop()
{
readKWHMeterPC();
readKWHMeterHeat();
read3WayValve();
digitalWrite(POWER_LED, LOW);
if ((millis() - lastTimeLoop) >= DELAY_TIME_LOOP){
readTemperatures();
calcenergyPC();
calcenergyHeat();
avgpowerPC(); // nie liczy w pierwszym przebiegu pracy dokładnie i w ostatnim, bo niekoniecznie jest załączenie/wył. równą minutę przed wysłaniem na TS -> w efekcie liczy moc z mniejszej ilości impulsów niż normalnie w ciągu minuty jest przy stałym obciążeniu
avgpowerHeat();
write2TSDataCH1( CH1channelID , CH1dataFieldOne , valveState , CH1dataFieldTwo , meterPulsesPC, CH1dataFieldThree, energyPC, CH1dataFieldFour, meterPulsesHeat , CH1dataFieldFive ,energyHeat, CH1dataFieldSix , powerPC, CH1dataFieldSeven, powerHeat );
write2TSDataCH2( CH2channelID , CH2dataFieldOne , tempC1 , CH2dataFieldTwo , tempC2, CH2dataFieldThree, tempC3 );
lastTimeLoop = millis();
}
Can I send data to TS to 2 channels in the same time or not?
Luk
Luk on 12 Dec 2022
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ThingSpeak.h>
#define ONE_WIRE_BUS 5 // D1
#define THREE_WAY_VALVE_PIN D2 //sprzężenie zwrotne z przekaźniczka od zaworu 3-drogowego
#define KWH_METER_PC D8 // hardware'owo w ESP pulldown
#define KWH_METER_HEAT D7 // nie zapomnieć dodać zewn. R do GND! przy odczycie początkowym robi wtedy impuls "-1", można na upartego zerować to wtedy ifem w setupie (if<0 to zeruj)
#define JOULE_METER D6 // joue'lomierz
#define POWER_LED D4
#define TIMEOUT 5000 // Timeout for server response.
#define ORNO_CONST 800
// Zmienne do ustalania czasu wysyłania danych do TS
unsigned long lastTimeLoop = 0;
#define DELAY_TIME_LOOP 60000 // wysyłanie danych do TS co 1 min
// Zmienne do ustalania czasu debounce dla sygnału zaworu
unsigned long lastTimeValve = 0;
#define DELAY_TIME_VALVE 500
bool pulseEdgePC = 0; //zbocze narastające dla odczytu impulsów z licznika energii
bool pulseEdgeHeat = 0;
//Zmienne dla licznika ORNO od pompy ciepła
int meterPulsesPC = 0; //zmienna do TS
int readMeterPC = 0; // zmienna - odczyt stanu pinu
float energyPC = 0;
float lastenergyPC = 0;
float powerPC = 0;
//Zmienne dla licznika ORNO od defrost
int meterPulsesHeat = 0; //zmienna do TS
int readMeterHeat = 0; // zmienna - odczyt stanu pinu
float energyHeat = 0;
float lastenergyHeat = 0;
float powerHeat = 0;
//Zmienne dla licznika GJ
int meterPulsesGJ = 0; //zmienna do TS
int readMeterGJ = 0; // zmienna - odczyt stanu pinu
float energyGJ = 0;
float lastenergyGJ = 0;
float powerGJ = 0;
//Zmienne dla zaworu 3-drogowego
int valveState; // aktualny stan zaworu 3-drogowego, zmienna do TS
int lastvalveState; // zmienna - ostatni stan pinu
int readValve ; // zmienna - odczyt stanu pinu
//Zmienne dla temperatur
int numberOfDevices;
DeviceAddress tempDeviceAddress;
float tempC1; //zmienna dla odczytu temperatury #1 - do TS
float tempC2; //zmienna dla odczytu temperatury #2 - do TS
float tempC3; //zmienna dla odczytu temperatury #3 - do TS
//Zmienne dla TS - kanał "cyfrowy"
unsigned long CH1channelID = xxxxxx;
const char* CH1writeAPIKey = "xxxxx"; // Enter your Write API key from ThingSpeak
const char* CH1readAPIKey = "xxxxxx";
unsigned int CH1dataFieldOne = 1; // Field to write temperature data
unsigned int CH1dataFieldTwo = 2; // Field to write temperature data
unsigned int CH1dataFieldThree = 3;
unsigned int CH1dataFieldFour = 4;
unsigned int CH1dataFieldFive = 5;
unsigned int CH1dataFieldSix = 6;
unsigned int CH1dataFieldSeven = 7;
unsigned int CH1dataFieldEight = 8;
//Zmienne dla TS - kanał "temperaturowy"
unsigned long CH2channelID = xxxxxxx;
const char* CH2writeAPIKey = "xxxxxxxxxxxxxx"; // Enter your Write API key from ThingSpeak
const char* CH2readAPIKey = "xxxxxxx";
unsigned int CH2dataFieldOne = 1; // Field to write temperature data
unsigned int CH2dataFieldTwo = 2; // Field to write temperature data
unsigned int CH2dataFieldThree = 3;
unsigned int CH2dataFieldFour = 4;
unsigned int CH2dataFieldFive = 5;
unsigned int CH2dataFieldSix = 6;
unsigned int CH2dataFieldSeven = 7;
unsigned int CH2dataFieldEight = 8;
const char *ssid = "xxxxx"; // Replace with your wifi ssid and WPA2 key
const char *pass = "xxxxxxxxxxxxxx";
const char* server = "api.thingspeak.com";
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature sensor
WiFiClient client;
// Use this function if you want to write multiple fields simultaneously.
//https://www.mathworks.com/help/thingspeak/read-and-post-temperature-data.html
//https://github.com/mathworks/thingspeak-arduino
int write2TSDataCH1(long TSChannel, unsigned int TSField1, int field1Data, unsigned int TSField2, int field2Data, unsigned int TSField3, float field3Data,unsigned int TSField4, int field4Data,unsigned int TSField5, float field5Data, unsigned int TSField6, float field6Data, unsigned int TSField7, float field7Data){
ThingSpeak.setField( TSField1, field1Data );
ThingSpeak.setField( TSField2, field2Data );
ThingSpeak.setField( TSField3, field3Data );
ThingSpeak.setField( TSField4, field4Data );
ThingSpeak.setField( TSField5, field5Data );
ThingSpeak.setField( TSField6, field6Data );
ThingSpeak.setField( TSField7, field7Data );
int writeSuccess = ThingSpeak.writeFields( TSChannel, CH1writeAPIKey );
return writeSuccess;
}
int write2TSDataCH2( long TSChannel, unsigned int TSField1, float field1Data, unsigned int TSField2, float field2Data, unsigned int TSField3, float field3Data){
ThingSpeak.setField( TSField1, field1Data );
ThingSpeak.setField( TSField2, field2Data );
ThingSpeak.setField( TSField3, field3Data );
int writeSuccess = ThingSpeak.writeFields( TSChannel, CH2writeAPIKey );
return writeSuccess;
}
int readTSDataCH1( long TSChannel,unsigned int TSField ){
int data = ThingSpeak.readIntField( TSChannel, TSField, CH1readAPIKey );
return data;
}
float readTSDataFloatCH1( long TSChannel,unsigned int TSField ){
float data = ThingSpeak.readFloatField( TSChannel, TSField, CH1readAPIKey );
return data;
}
void readTemperatures(){
sensors.requestTemperatures();
tempC1 = sensors.getTempCByIndex(0);
tempC2 = sensors.getTempCByIndex(1);
tempC3 = sensors.getTempCByIndex(2);
}
void read3WayValve(){
readValve = digitalRead(THREE_WAY_VALVE_PIN);
if (readValve != lastvalveState){
lastTimeValve = millis();
}
if ((millis()-lastTimeValve) > DELAY_TIME_VALVE){
if (readValve != valveState){
valveState = readValve;
}
}
lastvalveState = readValve;
}
void readKWHMeterPC(){
readMeterPC = digitalRead(KWH_METER_PC);
if (readMeterPC == HIGH && pulseEdgePC == 0) {
meterPulsesPC = meterPulsesPC+1;
pulseEdgePC = 1;
}
if (readMeterPC == LOW){
pulseEdgePC=0;
}
Serial.println("Impulsy PC:" + String(meterPulsesPC));
}
void readKWHMeterHeat(){
readMeterHeat = digitalRead(KWH_METER_HEAT);
if (readMeterHeat == HIGH && pulseEdgeHeat == 0) {
meterPulsesHeat = meterPulsesHeat+1;
pulseEdgeHeat = 1;
}
if (readMeterHeat == LOW){
pulseEdgeHeat=0;
}
Serial.println("Impulsy grzałek:" + String(meterPulsesHeat));
}
void calcenergyPC(){
energyPC = float(meterPulsesPC)/ORNO_CONST;
}
void avgpowerPC(){
powerPC = (energyPC-lastenergyPC)/(60.0/3600.0);
lastenergyPC = energyPC;
//Serial.println(powerPC);
}
void calcenergyHeat(){
energyHeat = float(meterPulsesHeat)/ORNO_CONST;
}
void avgpowerHeat(){
powerHeat = (energyHeat-lastenergyHeat)/(60.0/3600.0);
lastenergyHeat = energyHeat;
}
void setup()
{
Serial.begin(9600);
delay(10);
sensors.begin();
pinMode(THREE_WAY_VALVE_PIN,INPUT_PULLUP);
pinMode(KWH_METER_PC,INPUT);
pinMode(KWH_METER_HEAT,INPUT);
pinMode(POWER_LED,OUTPUT);
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
ThingSpeak.begin(client);
meterPulsesPC = readTSDataCH1( CH1channelID, CH1dataFieldTwo );
energyPC = readTSDataFloatCH1( CH1channelID, CH1dataFieldThree );
lastenergyPC = energyPC;
meterPulsesHeat = readTSDataCH1( CH1channelID, CH1dataFieldFour );
energyHeat = readTSDataFloatCH1( CH1channelID, CH1dataFieldFive );
lastenergyHeat = energyHeat;
}
void loop()
{
readKWHMeterPC();
readKWHMeterHeat();
read3WayValve();
digitalWrite(POWER_LED, LOW);
if ((millis() - lastTimeLoop) >= DELAY_TIME_LOOP){
readTemperatures();
calcenergyPC();
calcenergyHeat();
avgpowerPC(); // nie liczy w pierwszym przebiegu pracy dokładnie i w ostatnim, bo niekoniecznie jest załączenie/wył. równą minutę przed wysłaniem na TS -> w efekcie liczy moc z mniejszej ilości impulsów niż normalnie w ciągu minuty jest przy stałym obciążeniu
avgpowerHeat();
write2TSDataCH1( CH1channelID , CH1dataFieldOne , valveState , CH1dataFieldTwo , meterPulsesPC, CH1dataFieldThree, energyPC, CH1dataFieldFour, meterPulsesHeat , CH1dataFieldFive ,energyHeat, CH1dataFieldSix , powerPC, CH1dataFieldSeven, powerHeat );
write2TSDataCH2( CH2channelID , CH2dataFieldOne , tempC1 , CH2dataFieldTwo , tempC2, CH2dataFieldThree, tempC3 );
lastTimeLoop = millis();
}
}
All of the code above. I am testing now onewire on a separate ESP and now everything is okay. Yes, I know about serial monitor, but ESP is far away from me and a person who have it is not technician ;) But if everything in code is OK, I will try to do this (serial monitor).
Christopher Stapels
Christopher Stapels on 6 Jan 2023
I dont see anything obvious wrong in the code. There isnt any reason ThingSpeak would record a value of -127 unless you sent it exactly that value. Which field values are getting the '-127' value?
Christopher Stapels
Christopher Stapels on 12 Dec 2022
It is fine to call two channels sequentially without waiting, provided CH1channelID !=CH2channelID.
I would consider outputting the data to the serial monitor so you can check it.
Also, you will need to show us the write2TSDataCH1 function for us to help you debug this.
Luk
1
Post
1
Reply

Tags

No tags entered yet.