Nie ma problemu. Cudów tam nie ma. Poniżej kod. Program obsługuje do 16 czujników temperatury i wilgotności. Osobiście sukcesywnie wymieniam DHT na SHT (są dużo mniej awaryjne). Oprócz tego status każdego czujnika sygnalizuje dioda NEO WS2812B. Całość wraz ze statusem czujników wrzucana jest do bazy InfluxDB. Aha i jeszcze tam się loguje status zasilacza awaryjnego SATELa - mój system ma buforowe zasilanie. Główną oszczędność pamięci RAM uzyskałem poprzez likwidację/ograniczenie buforów używanych podczas przesyłania danych do bazy. Wcześniej miałem bufor 2048 do, którego drukowałem cały POST i wysyłałem. Teraz bufor ma 40 bajtów, a ja drukuję po kawałku, dodatkowo większość tekstu jest we flashu (makro F()). Może komuś się przyda.
Code: Select all
#include <avr/wdt.h>
#include <string.h>
#include <EEPROM.h>
#include <SPI.h>
#include <Ethernet.h>
//#include <utility/w5100.h>
#include <DHT.h>
#include <SHT1x.h>
#include <Adafruit_NeoPixel.h>
#include <SuplaDevice.h>
#include <MemoryFree.h>
//################## SENSORS - pin definitions #################
#define SENS_PIN_00 A0
#define SENS_PIN_01 A1
#define SENS_PIN_02 A2
#define SENS_PIN_03 A3
#define SENS_PIN_04 A4
#define SENS_PIN_05 A5
#define SENS_PIN_06 A6
#define SENS_PIN_07 A7
#define SENS_PIN_08 A8
#define SENS_PIN_09 A9
#define SENS_PIN_10 A10
#define SENS_PIN_11 A11
#define SENS_PIN_12 A12
#define SENS_PIN_13 A13
//###############################################################
//#################### LEDS - pin definitions ###################
#define RGB_PIN_00 12
#define RGB_PIN_01 11
#define RGB_PIN_02 9
#define RGB_PIN_03 8
#define RGB_PIN_04 7
#define RGB_PIN_05 6
#define RGB_PIN_06 5
#define RGB_PIN_07 3
#define RGB_PIN_08 2
#define RGB_PIN_09 14
#define RGB_PIN_10 15
#define RGB_PIN_11 16
#define RGB_PIN_12 17
#define RGB_PIN_13 22
//###############################################################
//#################### OTHER- pin definitions ###################
#define CLOCK_PIN 42 //pin do zegara dla SHT
#define RGB_POWER_PIN 40 //pin do właczanie zasilania diod RGB
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define BUTTONPIN 18 //pin do przycisku
//#define ETH_STATUS 44 // pin sprawdzajacy podlaczenie kabla sieciowego
#define UPS_AC230V 33 //pin sprawdzajacy obecnosc napiecia 230V
#define UPS_AKU_DISCHARGED 35 //pin sprawdzajacy stan akumulatora
#define UPS_OVERLOAD 37//pin sprawdzajacy przeciazenie zasilacza
//###############################################################
//#################### TYPES definitions ########################
//- port 00 - na zewnatrz
//- port 01 - piwnica pralnia
//- port 02 - piwnica warsztat
//- port 03 - piwnica kotłownia
//- port 04 - piwnica korytarz
//- port 05 - parter wypoczynkowy
//- port 06 - parter kuchnia
//- port 07 - parter korytarz
//- port 08 - parter lazienka
//- port 09 - parter jadalnia
//- port 10 - 1 pietro syp1
//- port 11 - 1 pietro syp2
//- port 12 - 1 pietro korytarz
//- port 13 - 2 pietro korytarz
//DHT dht_00(SENS_PIN_00, DHTTYPE); //czujnik 00
SHT1x sht1x_00(SENS_PIN_00, CLOCK_PIN); // czujnik 00
DHT dht_01(SENS_PIN_01, DHTTYPE); //czujnik 01
DHT dht_02(SENS_PIN_02, DHTTYPE); //czujnik 02
DHT dht_03(SENS_PIN_03, DHTTYPE); //czujnik 03
DHT dht_04(SENS_PIN_04, DHTTYPE); //czujnik 04
DHT dht_05(SENS_PIN_05, DHTTYPE); //czujnik 05
DHT dht_06(SENS_PIN_06, DHTTYPE); //czujnik 06
DHT dht_07(SENS_PIN_07, DHTTYPE); //czujnik 07
DHT dht_08(SENS_PIN_08, DHTTYPE); //czujnik 08
SHT1x sht1x_09(SENS_PIN_09, CLOCK_PIN); // czujnik 11
//DHT dht_09(SENS_PIN_09, DHTTYPE); //czujnik 0
DHT dht_10(SENS_PIN_10, DHTTYPE); //czujnik 10
SHT1x sht1x_11(SENS_PIN_11, CLOCK_PIN); // czujnik 11
//DHT dht_11(SENS_PIN_11, DHTTYPE); //czujnik 11
DHT dht_12(SENS_PIN_12, DHTTYPE); //czujnik 12
SHT1x sht1x_13(SENS_PIN_13, CLOCK_PIN); // czujnik 13
DHT dht_13(SENS_PIN_13, DHTTYPE); //czujnik 13
Adafruit_NeoPixel pixel_00 = Adafruit_NeoPixel(1, RGB_PIN_00, NEO_GRB + NEO_KHZ800); //RGB led 00
Adafruit_NeoPixel pixel_01 = Adafruit_NeoPixel(1, RGB_PIN_01, NEO_GRB + NEO_KHZ800); //RGB led 01
Adafruit_NeoPixel pixel_02 = Adafruit_NeoPixel(1, RGB_PIN_02, NEO_GRB + NEO_KHZ800); //RGB led 02
Adafruit_NeoPixel pixel_03 = Adafruit_NeoPixel(1, RGB_PIN_03, NEO_GRB + NEO_KHZ800); //RGB led 03
Adafruit_NeoPixel pixel_04 = Adafruit_NeoPixel(1, RGB_PIN_04, NEO_GRB + NEO_KHZ800); //RGB led 04
Adafruit_NeoPixel pixel_05 = Adafruit_NeoPixel(1, RGB_PIN_05, NEO_GRB + NEO_KHZ800); //RGB led 05
Adafruit_NeoPixel pixel_06 = Adafruit_NeoPixel(1, RGB_PIN_06, NEO_GRB + NEO_KHZ800); //RGB led 06
Adafruit_NeoPixel pixel_07 = Adafruit_NeoPixel(1, RGB_PIN_07, NEO_GRB + NEO_KHZ800); //RGB led 07
Adafruit_NeoPixel pixel_08 = Adafruit_NeoPixel(1, RGB_PIN_08, NEO_GRB + NEO_KHZ800); //RGB led 08
Adafruit_NeoPixel pixel_09 = Adafruit_NeoPixel(1, RGB_PIN_09, NEO_GRB + NEO_KHZ800); //RGB led 09
Adafruit_NeoPixel pixel_10 = Adafruit_NeoPixel(1, RGB_PIN_10, NEO_GRB + NEO_KHZ800); //RGB led 10
Adafruit_NeoPixel pixel_11 = Adafruit_NeoPixel(1, RGB_PIN_11, NEO_GRB + NEO_KHZ800); //RGB led 11
Adafruit_NeoPixel pixel_12 = Adafruit_NeoPixel(1, RGB_PIN_12, NEO_GRB + NEO_KHZ800); //RGB led 12
Adafruit_NeoPixel pixel_13 = Adafruit_NeoPixel(1, RGB_PIN_13, NEO_GRB + NEO_KHZ800); //RGB led 13
//###############################################################
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x08}; //adres mac karty sieciowej
byte serverInfluxDB[] = { 10, 10, 10, 250 }; // domyslny adres ip serwera
uint16_t portInfluxDB = 8086;
//byte serverInfluxDB[] = { 156, 17, 31, 233 }; // domyslny adres ip serwera
//uint16_t portInfluxDB = 8886;
unsigned long previousMillis30s = 0; //zmienna do przechowywania poprzedniej wartosci millis
unsigned long previousMillisDebug = 0; //zmienna do przechowywania poprzedniej wartosci millis
//float temperature[16] = {-12.7, -0.5, 2.3, 12, 18.2, 27.1, 28.1, 32.3, -22.1, -17.1, -15.1, -6.3, 0.5, 14.5, 18.9, 7.7}; //tabela wynikow
//float humidity[16] = {15.3, 21.3, 44.5, 60.1, 70, 82.8, 55.9, 41.7, 12.4, 7.4, 33.4, 77.9, 88, 69.9, 19.4, 4}; //tabela wynikow
float temperature[16] = {NAN}; //tabela wynikow (16 wynikow pomiaru i ostatni to srednia z piwnicy)
float humidity[16] = {NAN}; //tabela wynikow (16 wynikow pomiaru i ostatni to srednia z piwnicy)
//const int bufferSize = 40; // rozmiar bufora do przetwarzania danych
//char buf[bufferSize] = {'\0'}; // bufor do przetwarzania danych
uint8_t n = 0; //zmienna do odczytu kolejnych czujników
uint8_t sensors = 0; //liczba aktywnych sensorow w sieci
bool STATUS_sendToServer = 0; //status ostatniego podłaczenia do serwera;
uint32_t red = pixel_00.Color(5,0,0); //definicje kolorow
uint32_t blue = pixel_00.Color(0,0,5); //definicje kolorow
uint32_t yellow = pixel_00.Color(5,5,0); //definicje kolorow
uint16_t dhtStatusRegister = 0xFFFF;
EthernetClient clientInfluxDB;
void setup() {
wdt_disable(); //wylaczenie watchdog
Serial.begin(115200);
// Ethernet.begin(mac);
pinMode(UPS_AC230V,INPUT_PULLUP); //pin eth jako wejscie podciagniete do zasilania - obecnosc napiecia 230V
pinMode(UPS_AKU_DISCHARGED,INPUT_PULLUP); //pin eth jako wejscie podciagniete do zasilania - stan akumulatora
pinMode(UPS_OVERLOAD,INPUT_PULLUP); //pin eth jako wejscie podciagniete do zasilania - przeciazenie zasilacza
// pinMode(RGB_POWER_PIN, OUTPUT); //konfiguracja pinu jako wyjscie (pin do wlaczania zasilania led)
// digitalWrite(RGB_POWER_PIN, LOW); //właczenie zasilania diod RGB
//################## SENSORS - pin configuration ################
//dht_00.begin(); //sht nie wymaga inicjalizacji
dht_01.begin();
dht_02.begin();
dht_03.begin();
dht_04.begin();
dht_05.begin();
dht_06.begin();
dht_07.begin();
dht_08.begin();
//dht_09.begin(); //sht nie wymaga inicjalizacji
dht_10.begin();
//dht_11.begin(); //sht nie wymaga inicjalizacji
dht_12.begin();
//dht_13.begin(); //sht nie wymaga inicjalizacji
//###############################################################
//#################### LEDS - pin configuration #################
pixel_00.begin();
pixel_01.begin();
pixel_02.begin();
pixel_03.begin();
pixel_04.begin();
pixel_05.begin();
pixel_06.begin();
pixel_07.begin();
pixel_08.begin();
pixel_09.begin();
pixel_10.begin();
pixel_11.begin();
pixel_12.begin();
pixel_13.begin();
//###############################################################
wdt_enable(WDTO_8S); ///wlaczenie watchdog 8s
//####################### SUPLA configuration ###################
// Replace the falowing GUID
char GUID[SUPLA_GUID_SIZE] = {0x93,0x49,0xDC,0x32,0x77,0x7A,0xE6,0xE4,0xD5,0x44,0x90,0x4B,0x64,0x7F,0x14,0xD7};
// with GUID that you can retrieve from https://www.supla.org/arduino/get-guid
// Set temperature/humidity callback
SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
SuplaDevice.addDHT22(); //na zewnatrz
SuplaDevice.addDHT22(); //piwnica
SuplaDevice.addDHT22(); //parter
SuplaDevice.addDHT22(); //1-sze pietro
SuplaDevice.addDHT22(); //2-gie pietro
// CHANNEL0 - SENSORS BACKLIGHT
SuplaDevice.addRelay(RGB_POWER_PIN,true); // 44 - Pin number where the relay is connected
// Call SuplaDevice.addRelay(44, true) with an extra "true" parameter
// to enable "port value inversion"
// where HIGH == LOW, and LOW == HIGH
SuplaDevice.setName("starsensors"); // zmiana nazwy mdułu w supla
SuplaDevice.begin(GUID, // Global Unique Identifier
mac, // Ethernet MAC address
"suplacloud.herrero-net.com", // SUPLA server address
X, // Location ID
"XXXX"); // Location Password
//###############################################################
}
void loop() {
wdt_reset(); //reset watchdog
SuplaDevice.iterate();
timer30s();
// unsigned long currentMillisDebug = millis();
// if ((unsigned long)(currentMillisDebug - previousMillisDebug) >= 3000) {
// previousMillisDebug = currentMillisDebug;
// Serial.print(F("freeMemory()="));
// Serial.println(freeMemory());
//
// }
}
//zadania do wykonania co 30s
void timer30s(){
unsigned long currentMillis30s = millis();
if ((unsigned long)(currentMillis30s - previousMillis30s) >= 30000) {
previousMillis30s = currentMillis30s;
//########################## SATEL - USP ########################
//wysyłanie statusu UPS co 60s
if (n % 2) sendToInfluxDB(2); //gdy nieparzyste n
//###############################################################
//##################### OBSŁUGA CZUJNIKÓW #######################
readSensor(n);
n++;
if (n == 16) {
STATUS_sendToServer = sendToInfluxDB(1); //zapis do bazy influxDB
n = 0; //zerowanie licznika odczytu czujników
} //koniec if n == 16
//poczatek petli zliczajacej czujniki
uint16_t value = dhtStatusRegister;
sensors = 16;
while (value) {
sensors--;
value = (value - 1) & value;
} //koniec petli zliczajacej czujniki
//###############################################################
//######################## OBSŁUGA LED ##########################
if(!client.connected() && !(n % 2)){ //jeśłi rozłączony z serwera supla to co 30s gas diody
red = 0;
blue = 0;
yellow = 0;
}
else{
red = pixel_00.Color(5,0,0); //definicje kolorow
blue = pixel_00.Color(0,0,5); //definicje kolorow
yellow = pixel_00.Color(5,5,0); //definicje kolorow
}
for(uint8_t y = 0; y < 16; y++) //petla zaswiecajaca diody
{
setColorLed(y); //zapalenie diody, zmiana koloru
} //koniec petli zaswiecajacej diody
//###############################################################
}
}
// Supla callback
void get_temperature_and_humidity(int channelNumber, double *temp, double *humi) {
uint8_t average_counter = 0;
float temperature_tmp = 0;
float humidity_tmp = 0;
switch(channelNumber) {
// temperatura na zewnatrz
case 0:
*temp = temperature[0];
*humi = humidity[0];
break;
// srednia temperatura - piwnica
case 1:
for(uint8_t u = 1; u < 5; u++)
{
if (!isnan(temperature[u]))
{
temperature_tmp = temperature_tmp + temperature[u];
humidity_tmp = humidity_tmp + humidity[u];
average_counter++;
}
}
*temp = temperature_tmp/average_counter;
*humi = humidity_tmp/average_counter;
break;
// srednia temperatura - parter
case 2:
for(uint8_t u = 5; u < 10; u++)
{
if (!isnan(temperature[u]) && (u != 8))
{
temperature_tmp = temperature_tmp + temperature[u];
humidity_tmp = humidity_tmp + humidity[u];
average_counter++;
}
}
*temp = temperature_tmp/average_counter;
*humi = humidity_tmp/average_counter;
break;
// srednia temperatura - 1-sze pietro
case 3:
for(uint8_t u = 10; u < 13; u++)
{
if (!isnan(temperature[u]))
{
temperature_tmp = temperature_tmp + temperature[u];
humidity_tmp = humidity_tmp + humidity[u];
average_counter++;
}
}
*temp = temperature_tmp/average_counter;
*humi = humidity_tmp/average_counter;
break;
// srednia temperatura - 2-gie pietro
case 4:
*temp = temperature[13];
*humi = humidity[13];
break;
}
if ( isnan(*temp) || isnan(*humi) ) {
*temp = -275;
*humi = -1;
}
}
void setColorLed(uint8_t ledNumber){
switch (ledNumber){
case 0:
if (dhtStatusRegister & 0x0001) pixel_00.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_00.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_00.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_00.show();
break;
case 1:
if (dhtStatusRegister & (1 << ledNumber)) pixel_01.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_01.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_01.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_01.show();
break;
case 2:
if (dhtStatusRegister & (1 << ledNumber)) pixel_02.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_02.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_02.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_02.show();
break;
case 3:
if (dhtStatusRegister & (1 << ledNumber)) pixel_03.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_03.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_03.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_03.show();
break;
case 4:
if (dhtStatusRegister & (1 << ledNumber)) pixel_04.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_04.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_04.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_04.show();
break;
case 5:
if (dhtStatusRegister & (1 << ledNumber)) pixel_05.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_05.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_05.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_05.show();
break;
case 6:
if (dhtStatusRegister & (1 << ledNumber)) pixel_06.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_06.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_06.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_06.show();
break;
case 7:
if (dhtStatusRegister & (1 << ledNumber)) pixel_07.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_07.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_07.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_07.show();
break;
case 8:
if (dhtStatusRegister & (1 << ledNumber)) pixel_08.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_08.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_08.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_08.show();
break;
case 9:
if (dhtStatusRegister & (1 << ledNumber)) pixel_09.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_09.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_09.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_09.show();
break;
case 10:
if (dhtStatusRegister & (1 << ledNumber)) pixel_10.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_10.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_10.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_10.show();
break;
case 11:
if (dhtStatusRegister & (1 << ledNumber)) pixel_11.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_11.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_11.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_11.show();
break;
case 12:
if (dhtStatusRegister & (1 << ledNumber)) pixel_12.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_12.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_12.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_12.show();
break;
case 13:
if (dhtStatusRegister & (1 << ledNumber)) pixel_13.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_13.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_13.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_13.show();
break;
default:
break;
}
}
void readSensor(uint8_t sensorNumber){
switch (sensorNumber){
case 0:
humidity[sensorNumber] = sht1x_00.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = sht1x_00.readTemperatureC(); //odczyt temperatury
if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN
break;
case 1:
humidity[sensorNumber] = dht_01.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_01.readTemperature(); //odczyt temperatury
break;
case 2:
humidity[sensorNumber] = dht_02.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_02.readTemperature(); //odczyt temperatury
break;
case 3:
humidity[sensorNumber] = dht_03.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_03.readTemperature(); //odczyt temperatury
break;
case 4:
humidity[sensorNumber] = dht_04.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_04.readTemperature(); //odczyt temperatury
break;
case 5:
humidity[sensorNumber] = dht_05.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_05.readTemperature(); //odczyt temperatury
break;
case 6:
humidity[sensorNumber] = dht_06.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_06.readTemperature(); //odczyt temperatury
break;
case 7:
humidity[sensorNumber] = dht_07.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_07.readTemperature(); //odczyt temperatury
break;
case 8:
humidity[sensorNumber] = dht_08.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_08.readTemperature(); //odczyt temperatury
break;
case 9:
humidity[sensorNumber] = sht1x_09.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = sht1x_09.readTemperatureC(); //odczyt temperatury
if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN
//humidity[sensorNumber] = dht_09.readHumidity(); //odczyt wilgotnosci
//temperature[sensorNumber] = dht_09.readTemperature(); //odczyt temperatury
break;
case 10:
humidity[sensorNumber] = dht_10.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_10.readTemperature(); //odczyt temperatury
break;
case 11:
humidity[sensorNumber] = sht1x_11.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = sht1x_11.readTemperatureC(); //odczyt temperatury
if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN
//humidity[sensorNumber] = dht_11.readHumidity(); //odczyt wilgotnosci
//temperature[sensorNumber] = dht_11.readTemperature(); //odczyt temperatury
break;
case 12:
humidity[sensorNumber] = dht_12.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_12.readTemperature(); //odczyt temperatury
break;
case 13:
humidity[sensorNumber] = sht1x_13.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = sht1x_13.readTemperatureC(); //odczyt temperatury
if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN
//humidity[sensorNumber] = dht_13.readHumidity(); //odczyt wilgotnosci
//temperature[sensorNumber] = dht_13.readTemperature(); //odczyt temperatury
break;
default:
humidity[sensorNumber] = NAN;
temperature[sensorNumber] = NAN;
break;
}
//zapis statusu czujników
if (isnan(temperature[n]) || isnan(humidity[n])) { //blad odczytu
if(n == 0) dhtStatusRegister = dhtStatusRegister | (uint16_t)(1);
else dhtStatusRegister = dhtStatusRegister | (uint16_t)(1 << n); //zapis numeru blednego czujnika
//Serial.println("Failed to read from DHT sensor!");
}
else { //odczyt ok
if(n == 0) dhtStatusRegister = dhtStatusRegister & (~(uint16_t)(1));
else dhtStatusRegister = dhtStatusRegister & (~(uint16_t)(1 << n)); //zapis statusu dobrego czujnika
}
}
int8_t sendToInfluxDB(uint8_t mode){ //funkcja formatujaca dane z czujnikow w buforze
const uint8_t bufferSize = 40; // rozmiar bufora do przetwarzania danych
char buf[bufferSize] = {'\0'}; // bufor do przetwarzania danych
uint8_t numChars = 0;
int numCharsTotal = 0; //this will be number of chars written to buffer, return value of sprintf
int8_t conState = 0;
for(uint8_t noTest = 0; noTest < 2; noTest++) { //jak 0 to testuje rozmiar, jak 1 to wysyła
//unsigned long tic = millis();
if(noTest){//wysyłanie na serwer przy drugim wystapieniu petli
conState = clientInfluxDB.connect(serverInfluxDB, portInfluxDB);
//Send HTTP header and buffer
clientInfluxDB.println(F("POST /write?db=starbase&precision=s&u=XXXUSERXXX&p=XXXPASSXXX HTTP/1.1"));
clientInfluxDB.println(F("Host: starsensor.herrero-net.com"));
clientInfluxDB.println(F("User-Agent: Arduino/1.0"));
clientInfluxDB.println(F("Connection: close"));
clientInfluxDB.println(F("Content-Type: application/x-www-form-urlencoded"));
clientInfluxDB.print(F("Content-Length: "));
clientInfluxDB.println(numCharsTotal);
clientInfluxDB.println();
}
switch (mode){
case 1: //zapis danych z czujnikow
for(uint8_t i = 0; i < 16; i++) { //pomiary_test,sensor=T0 value=22.5 unix_timestamp
int16_t temp_integer = 0, temp_fractional = 0, humi_integer = 0, humi_fractional = 0, temp = 0;
temp_integer = temperature[i];
temp = (temperature[i] - temp_integer) * 100;
if (temp < 0) temp = temp*-1;
if ((temp % 10) > 5) temp_fractional = (temp + 1)/10; //zaokrąglanie
else temp_fractional = temp/10;
if(noTest) clientInfluxDB.print(F("temp_humi,sensor="));
numCharsTotal += 17;
if ((temperature[i] > - 1) && (temperature[i] < 0)) numChars += sprintf(&buf[numChars], "T%d value=-%d.%1d\n", i, temp_integer, temp_fractional);
else numChars += sprintf(&buf[numChars], "T%d value=%d.%1d\n", i, temp_integer, temp_fractional);
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
humi_integer = humidity[i];
temp = (humidity[i] - humi_integer)*100;
if ((temp % 10) > 5) humi_fractional = (temp + 1)/10; //zaokraglenie
else humi_fractional = temp/10;
if(noTest) clientInfluxDB.print(F("temp_humi,sensor="));
numCharsTotal += 17;
numChars += sprintf(&buf[numChars], "H%d value=%d.%1d\n", i, humi_integer, humi_fractional);
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//zapis logow
if (i == 15) {
if(noTest) clientInfluxDB.print(F("temp_humi,sensor=sens_num value="));
numCharsTotal += 32;
numChars += sprintf(&buf[numChars], "%d\n", sensors);
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
if(noTest) clientInfluxDB.print(F("temp_humi,sensor=sens_stat value="));
numCharsTotal += 33;
numChars += sprintf(&buf[numChars], "%u", dhtStatusRegister);
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
}
// temp_integer = temperature[i];
// temp = (temperature[i] - temp_integer) * 100;
// if (temp < 0) temp = temp*-1;
// if ((temp % 10) > 5) temp_fractional = (temp + 1)/10; //zaokrąglanie
// else temp_fractional = temp/10;
// numChars += sprintf(&buf[numChars], "temp_humi,");
// if ((temperature[i] > - 1) && (temperature[i] < 0)) numChars += sprintf(&buf[numChars], "sensor=T%d value=-%d.%1d\n", i, temp_integer, temp_fractional);
// else numChars += sprintf(&buf[numChars], "sensor=T%d value=%d.%1d\n", i, temp_integer, temp_fractional);
//
// if(noTest) clientInfluxDB.print(buf);
// numCharsTotal += numChars;
// numChars = 0;
// memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//
// humi_integer = humidity[i];
// temp = (humidity[i] - humi_integer)*100;
// if ((temp % 10) > 5) humi_fractional = (temp + 1)/10; //zaokraglenie
// else humi_fractional = temp/10;
// numChars += sprintf(&buf[numChars], "temp_humi,");
// numChars += sprintf(&buf[numChars], "sensor=H%d value=%d.%1d\n", i, humi_integer, humi_fractional);
//
// if(noTest) clientInfluxDB.print(buf);
// numCharsTotal += numChars;
// numChars = 0;
// memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//
// //zapis logow
// if (i == 15) {
// numChars += sprintf(&buf[numChars], "temp_humi,");
// numChars += sprintf(&buf[numChars], "sensor=sens_num value=%d\n", sensors);
// if(noTest) clientInfluxDB.print(buf);
// numCharsTotal += numChars;
// numChars = 0;
// memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//
// numChars += sprintf(&buf[numChars], "temp_humi,");
// numChars += sprintf(&buf[numChars], "sensor=sens_stat value=%u", dhtStatusRegister);
// if(noTest) clientInfluxDB.print(buf);
// numCharsTotal += numChars;
// numChars = 0;
// memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
// }
}
//Serial.print("liczba znakow total: ");
//Serial.println(numCharsTotal);
//numCharsTotal = 0;
break;
case 2: //zapis danych z UPS satela
numCharsTotal = 109; //zakomentowano prawidłową implementację; 109 jest wyliczone na podstawie poprzedniego rozwiązania
if(noTest) {
clientInfluxDB.print(F("satel_ups,sensor=ups_ac_err value="));
clientInfluxDB.print(digitalRead(UPS_AC230V));
clientInfluxDB.print(F("\nsatel_ups,sensor=ups_aku_err value="));
clientInfluxDB.print(digitalRead(UPS_AKU_DISCHARGED));
clientInfluxDB.print(F("\nsatel_ups,sensor=ups_ovr_err value="));
clientInfluxDB.print(digitalRead(UPS_OVERLOAD));
}
/*
numChars += sprintf(&buf[numChars], "satel_ups,");
numChars += sprintf(&buf[numChars], "sensor=ups_ac_err value=%u\n", digitalRead(UPS_AC230V));
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
numChars += sprintf(&buf[numChars], "satel_ups,");
numChars += sprintf(&buf[numChars], "sensor=ups_aku_err value=%u\n", digitalRead(UPS_AKU_DISCHARGED));
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
numChars += sprintf(&buf[numChars], "satel_ups,");
numChars += sprintf(&buf[numChars], "sensor=ups_ovr_err value=%u", digitalRead(UPS_OVERLOAD));
if(noTest) clientInfluxDB.print(buf);
numCharsTotal += numChars;
numChars = 0;
memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
*/
//Serial.print("liczba znakow total: ");
//Serial.println(numCharsTotal);
//numCharsTotal = 0;
break;
}
if(noTest){//wysyłanie na serwer przy drugim wystapieniu petli
// delay(1000); //wait for server to process data
//
// //Now we read what server has replied and then we close the connection
// while(clientInfluxDB.available()) { //receive string from server
// Serial.print((char)clientInfluxDB.read());
// }
clientInfluxDB.stop();
}
//Serial.print("czas przetwarzania: ");
//Serial.println(millis()-tic);
}
return conState;
}