Temperaturę i wilgotność odczytuje prawidłowo lecz trzeci parametr którym jest wilgotność gleby nie udaje mi się odczytać. Co robie źle?
Poniżej program:
Kod: Zaznacz cały
#include <RFM69_ATC.h> //Pobierz z: https://github.com/lowpowerlab/rfm69
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define OLED_RESET -1 // GPIO0
Adafruit_SSD1306 display(OLED_RESET);
#define NODEID 1 //Unikalny numer bramki (1 - 254).
#define NETWORKID 100 //Numer sieci (1 - 254) w której działą bramka SUPLA oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define FREQUENCY RF69_433MHZ //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "sampleEncryptKey" //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce SUPLA i we wszystkich transmiterach.
#define ENABLE_ATC //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).
#define SERIAL_BAUD 115200 //Prędkość transmisji portu szeregowego.
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#define SUPLA_SERVER "svr4.supla.org"
#define LOCATION_ID 86
#define LOCATION_PASSWORD "8477"
// pobierz identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadź go poniżej
#define GUID {0xE2,0x49,0x08,0x88,0x5D,0x77,0xB0,0x62,0x91,0x04,0xB2,0x1C,0x26,0x1D,0x20,0xD8}
RFM69_ATC radio(D3, D8, false);
bool promiscuousMode = false;
byte LED = 2;
const unsigned long period = 2400000; //Czas (40 minut) po którym bramka uznaje brak odczytu z transmitera i ustawia wartości wysyłane do Supla Cloud na 0.
double temperature = 0.0;
double humidity = 0.0;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long RFNodesCount = 0;
double wartosc;
typedef struct {
int nodeid;
int channelNumber;
double temperature;
double humidity;
double batteryLevel;
unsigned long lastContact;
} RF_TemperatureandHumidityNode;
RF_TemperatureandHumidityNode RFNodes[6];
void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {
for (int i = 0; i < RFNodesCount; i++)
if (RFNodes[i].channelNumber == channelNumber)
{
*temp = RFNodes[i].temperature;
*humidity = RFNodes[i].humidity;
}
}
double get_temperature(int channelNumber, double last_val) { //TA CZĘŚĆ PROGRMU NIE DZIAŁA PRAWIDŁOWO
for (int i = 0; i < RFNodesCount; i++)
if (RFNodes[i].channelNumber == channelNumber)
{
return RFNodes[i].batteryLevel;
}
}
#if (SSD1306_LCDHEIGHT != 48)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(SERIAL_BAUD);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000);
// Clear the buffer.
display.clearDisplay();
SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
SuplaDevice.setTemperatureCallback(&get_temperature);
SuplaDevice.addDHT22();
SuplaDevice.addDHT22();
SuplaDevice.addDS18B20Thermometer();
SuplaDevice.addDS18B20Thermometer();
char guid[SUPLA_GUID_SIZE] = GUID;
uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
SuplaDevice.setName("BRAMKA SMMS-1");
SuplaDevice.begin(guid, mac, SUPLA_SERVER, LOCATION_ID, LOCATION_PASSWORD);
radio.initialize(FREQUENCY,NODEID,NETWORKID);
#ifdef IS_RFM69HW_HCW
radio.setHighPower();
#endif
radio.encrypt(ENCRYPTKEY);
//radio.promiscuous(promiscuousMode);
char buff[65];
sprintf(buff, "BRAMKA RB-10G. Start komunikacji radiowej na częstotliwości %d MHz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
Serial.println(buff);
}
byte ackCount = 0;
uint32_t packetCount = 0;
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i + 1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
void readRadioData() {
String value = "";
if (radio.receiveDone())
{
int foundIdx = -1;
for (int i = 0; i < RFNodesCount; i++)
if (RFNodes[i].nodeid == radio.SENDERID)
{
foundIdx = i;
break;
}
Serial.println("Odbieram dane...");
if (foundIdx == -1)
{
if (RFNodesCount < 6)
{
Serial.println("Znalazłem nowy transmiter. Dodaję go do SUPLA Cloud");
RFNodes[RFNodesCount].nodeid = radio.SENDERID;
RFNodes[RFNodesCount].lastContact = millis();
RFNodes[RFNodesCount].channelNumber = radio.SENDERID - 1;
RFNodes[RFNodesCount].temperature = 0.0;
RFNodes[RFNodesCount].humidity = 0.0;
RFNodes[RFNodesCount].batteryLevel = 0;
foundIdx = RFNodesCount;
RFNodesCount++;
} else {
Serial.println("Maksymalna ilość transmiterów przekroczona!");
foundIdx = 0;
}
} else
{
RFNodes[foundIdx].temperature = 0.0;
}
Serial.print("#[");
Serial.print(++packetCount);
Serial.print(']');
Serial.print('['); Serial.print(radio.SENDERID, DEC); Serial.print("] ");
value = "";
for (byte i = 0; i < radio.DATALEN; i++)
if (radio.DATA[i] != ' ')
value += (char)radio.DATA[i];
Serial.println(value);
String tempStr = getValue(value, '|', 0);
String humStr = getValue(value, '|', 1);
String battLevelStr = getValue(value, '|', 2);
wartosc = battLevelStr.toFloat();
Serial.print("Temperatura: ");
Serial.println(tempStr);
Serial.print("Wilgotność: ");
Serial.println(humStr);
Serial.print("Poziom baterii: ");
Serial.println(battLevelStr);
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.print("Temp:" + tempStr + "C");
display.setCursor(0, 12);
display.print("Hum: " + humStr + "%");
display.setCursor(0, 24);
display.print("Gleba:");
display.setCursor(38, 24);
display.print(battLevelStr + "%");
display.setCursor(0, 36);
display.print("RSSI:");
display.setCursor(30, 36);
display.print(radio.RSSI);
display.setCursor(48, 36);
display.print("dB");
display.display();
RFNodes[foundIdx].temperature = tempStr.toFloat();
RFNodes[foundIdx].humidity = humStr.toFloat();
RFNodes[foundIdx].batteryLevel = battLevelStr.toFloat();
RFNodes[foundIdx].lastContact = millis();
Serial.print("Poziom sygnału transmitera [RX_RSSI]:"); Serial.print(radio.RSSI); Serial.print(" dBm");
if (radio.ACKRequested())
{
byte theNodeID = radio.SENDERID;
radio.sendACK();
if (ackCount++ % 3 == 0)
{
Serial.print(" ACK TEST - Transmiter ");
Serial.print(theNodeID);
delay(5);
radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0);
}
}
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
delay(60);
digitalWrite(LED, HIGH);
}
for (int i = 0; i < RFNodesCount; i++)
{
if (millis() - RFNodes[i].lastContact >= period)
{
RFNodes[i].temperature = 0.0;
RFNodes[i].humidity = 0.0;
RFNodes[i].batteryLevel = 0;
Serial.print("Brak odczytu z czujnika ");
Serial.println (RFNodes[i].nodeid);
};
}
}
void loop() {
readRadioData();
SuplaDevice.iterate();
}