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>
//################## 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
#define SENS_PIN_14 A14
#define SENS_PIN_15 A15
#define SENS_PIN_16 38
#define SENS_PIN_17 36
#define SENS_PIN_18 34
//###############################################################
//#################### 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
#define RGB_PIN_14 24
#define RGB_PIN_15 26
#define RGB_PIN_16 28
#define RGB_PIN_17 30
#define RGB_PIN_18 32
//###############################################################
//#################### 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 ########################
//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
DHT dht_14(SENS_PIN_14, DHTTYPE); //czujnik 14
DHT dht_15(SENS_PIN_15, DHTTYPE); //czujnik 15
DHT dht_16(SENS_PIN_16, DHTTYPE); //czujnik 16
DHT dht_17(SENS_PIN_17, DHTTYPE); //czujnik 17
DHT dht_18(SENS_PIN_18, DHTTYPE); //czujnik 18
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
Adafruit_NeoPixel pixel_14 = Adafruit_NeoPixel(1, RGB_PIN_14, NEO_GRB + NEO_KHZ800); //RGB led 14
Adafruit_NeoPixel pixel_15 = Adafruit_NeoPixel(1, RGB_PIN_15, NEO_GRB + NEO_KHZ800); //RGB led 15
Adafruit_NeoPixel pixel_16 = Adafruit_NeoPixel(1, RGB_PIN_16, NEO_GRB + NEO_KHZ800); //RGB led 16
Adafruit_NeoPixel pixel_17 = Adafruit_NeoPixel(1, RGB_PIN_17, NEO_GRB + NEO_KHZ800); //RGB led 17
Adafruit_NeoPixel pixel_18 = Adafruit_NeoPixel(1, RGB_PIN_18, NEO_GRB + NEO_KHZ800); //RGB led 18
//###############################################################
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}; //adres mac karty sieciowej
byte server[] = { 10, 10, 10, 250 }; // domyslny adres ip serwera
uint16_t server_port = 8086;
unsigned long previousMillis30s = 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[20] = {NAN}; //tabela wynikow (16 wynikow pomiaru i ostatni to srednia z piwnicy)
float humidity[20] = {NAN}; //tabela wynikow (16 wynikow pomiaru i ostatni to srednia z piwnicy)
float temperature_buffer[16] = {NAN}; //bufor wynikow do wyslania na serwer
float humidity_buffer[16] = {NAN}; //bufor wynikow do wyslania na serwer
char line[60]; //zmienna wykorzystywana przy wyswietlaniu danych na lcd i nie tylko
const int bufferSize = 2048; // Size of the buffer for HTTP content
char buf[bufferSize] = {'\0'}; // An character array filled with null terminate chars
const uint8_t InfluxBufferSize = 21;
char InfluxDB_response[InfluxBufferSize] = {'\0'}; //bufor odpowidzi serwera influx
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;
const uint32_t red = pixel_00.Color(5,0,0); //definicje kolorow
const uint32_t blue = pixel_00.Color(0,0,5); //definicje kolorow
const uint32_t yellow = pixel_00.Color(5,5,0); //definicje kolorow
uint16_t dhtStatusRegister = 0xFFFF;
void setup() {
wdt_disable(); //wylaczenie watchdog
//W5100.setRetransmissionTime(2000); //2000ms
//W5100.setRetransmissionCount(2); //3 próby po 200ms
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
dht_14.begin();
dht_15.begin();
dht_16.begin();
dht_17.begin();
dht_18.begin();
//###############################################################
//#################### 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();
pixel_14.begin();
pixel_15.begin();
pixel_16.begin();
pixel_17.begin();
pixel_18.begin();
//###############################################################
Serial.begin(115200);
Serial.println("setup");
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
"XXX"); // Location Password
//###############################################################
}
void loop() {
wdt_reset(); //reset watchdog
SuplaDevice.iterate();
timer30s();
}
//zadania do wykonania co 30s
void timer30s(){
unsigned long currentMillis30s = millis();
if ((unsigned long)(currentMillis30s - previousMillis30s) >= 30000) {
previousMillis30s = currentMillis30s;
Serial.println(".");
//########################## SATEL - USP ########################
//wysyłanie statusu UPS co 60s
if (n % 2) saveUpsStateToInfluxDB(); //gdy nieparzyste n
//###############################################################
//##################### OBSŁUGA CZUJNIKÓW #######################
readSensor(n);
n++;
if (n == 16) {
for (uint8_t bb = 0; bb < 16;bb++){ //kopia tablicy wynikow do bufora wykorzystywanego do wyslania na serwer
temperature_buffer[bb] = temperature[bb];
humidity_buffer[bb] = humidity[bb];
} //koniec petli robiacej kopie tablicy wynikow,
STATUS_sendToServer = saveToInfluxDB(); //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 ##########################
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 *humidity) {
switch(channelNumber) {
// temperatura na zewnatrz
case 0: {
*temp = temperature_buffer[0];
*humidity = humidity_buffer[0];
if ( isnan(*temp) || isnan(*humidity) ) {
*temp = -275;
*humidity = -1;
}
break;
}
// srednia temperatura - piwnica
case 1: {
uint8_t average_counter = 0;
float temperature_tmp = NAN;
float humidity_tmp = NAN;
for(uint8_t u = 1; u < 5; u++)
{
if (!isnan(temperature_buffer[u]))
{
temperature_tmp = temperature_tmp + temperature_buffer[u];
humidity_tmp = humidity_tmp + humidity_buffer[u];
average_counter++;
}
}
*temp = temperature_tmp/average_counter;
*humidity = humidity_tmp/average_counter;
if ( isnan(*temp) || isnan(*humidity) ) {
*temp = -275;
*humidity = -1;
}
break;
}
// srednia temperatura - parter
case 2: {
uint8_t average_counter = 0;
float temperature_tmp = NAN;
float humidity_tmp = NAN;
for(uint8_t u = 5; u < 10; u++)
{
if (!isnan(temperature_buffer[u]) || (u != 8))
{
temperature_tmp = temperature_tmp + temperature_buffer[u];
humidity_tmp = humidity_tmp + humidity_buffer[u];
average_counter++;
}
}
*temp = temperature_tmp/average_counter;
*humidity = humidity_tmp/average_counter;
if ( isnan(*temp) || isnan(*humidity) ) {
*temp = -275;
*humidity = -1;
}
break;
}
// srednia temperatura - 1-sze pietro
case 3: {
uint8_t average_counter = 0;
float temperature_tmp = NAN;
float humidity_tmp = NAN;
for(uint8_t u = 10; u < 13; u++)
{
if (!isnan(temperature_buffer[u]))
{
temperature_tmp = temperature_tmp + temperature_buffer[u];
humidity_tmp = humidity_tmp + humidity_buffer[u];
average_counter++;
}
}
*temp = temperature_tmp/average_counter;
*humidity = humidity_tmp/average_counter;
if ( isnan(*temp) || isnan(*humidity) ) {
*temp = -275;
*humidity = -1;
}
break;
}
// srednia temperatura - 2-gie pietro
case 4: {
*temp = temperature_buffer[13];
*humidity = humidity_buffer[13];
if ( isnan(*temp) || isnan(*humidity) ) {
*temp = -275;
*humidity = -1;
}
break;
}
}
}
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;
case 14:
if (dhtStatusRegister & (1 << ledNumber)) pixel_14.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_14.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_14.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_14.show();
break;
case 15:
if (dhtStatusRegister & (1 << ledNumber)) pixel_15.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_15.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_15.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_15.show();
break;
case 16:
if (dhtStatusRegister & (1 << ledNumber)) pixel_16.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_16.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_16.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_16.show();
break;
case 17:
if (dhtStatusRegister & (1 << ledNumber)) pixel_17.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_17.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_17.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_17.show();
break;
case 18:
if (dhtStatusRegister & (1 << ledNumber)) pixel_18.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
else if (STATUS_sendToServer == 0) pixel_18.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
else pixel_18.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko
pixel_18.show();
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;
case 14:
humidity[sensorNumber] = dht_14.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_14.readTemperature(); //odczyt temperatury
break;
case 15:
humidity[sensorNumber] = dht_15.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_15.readTemperature(); //odczyt temperatury
break;
case 16:
humidity[sensorNumber] = dht_16.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_16.readTemperature(); //odczyt temperatury
break;
case 17:
humidity[sensorNumber] = dht_17.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_17.readTemperature(); //odczyt temperatury
break;
case 18:
humidity[sensorNumber] = dht_18.readHumidity(); //odczyt wilgotnosci
temperature[sensorNumber] = dht_18.readTemperature(); //odczyt temperatury
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
}
}
void stringTempHumi_json(uint8_t wynik_nr){ //funkcja generuje string zawierajcy sformatowany wynik pomiaru temp i wilg
int16_t temp_integer = 0, humi_integer = 0, temp_fractional = 0, humi_fractional = 0, temp = 0;
temp_integer = temperature_buffer[wynik_nr];
temp = (temperature_buffer[wynik_nr] - 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;
humi_integer = humidity_buffer[wynik_nr];
temp = (humidity_buffer[wynik_nr] - humi_integer)*100;
if ((temp % 10) > 5) humi_fractional = (temp + 1)/10; //zaokrąglanie
else humi_fractional = temp/10;
if ((temperature_buffer[wynik_nr] > - 1) && (temperature_buffer[wynik_nr] < 0)) sprintf(line, "\"%02d\":{\"T\": -%1d.%1d,\"H\":%2d.%1d}", wynik_nr, temp_integer, temp_fractional, humi_integer, humi_fractional);
else sprintf(line, "\"%02d\":{\"T\":% 3d.%1d,\"H\":%2d.%1d}", wynik_nr, temp_integer, temp_fractional, humi_integer, humi_fractional); //to jest dla wyjatku, gdy wynik jest z przedzialu -1 do 0, bo wowczas czesc dziesietna jest dodatnia
}
bool saveToInfluxDB(){ //funkcja formatujaca dane z czujnikow w buforze
//this will be number of chars written to buffer, return value of sprintf
int numChars = 0;
for(int i = 0; i < 16 ; i++) { //pomiary_test,sensor=T0 value=22.5 unix_timestamp
int16_t temp_integer = 0, humi_integer = 0, temp_fractional = 0, humi_fractional = 0, temp = 0;
temp_integer = temperature_buffer[i];
temp = (temperature_buffer[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_buffer[i] > - 1) && (temperature_buffer[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);
humi_integer = humidity_buffer[i];
temp = (humidity_buffer[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,");
//if (i == 15) numChars += sprintf(&buf[numChars], "sensor=H%d value=%d.%1d", i, humi_integer, humi_fractional);
//else numChars += sprintf(&buf[numChars], "sensor=H%d value=%d.%1d\n", i, humi_integer, humi_fractional);
numChars += sprintf(&buf[numChars], "sensor=H%d value=%d.%1d\n", i, humi_integer, humi_fractional);
//zapis logow
if (i == 15) {
numChars += sprintf(&buf[numChars], "temp_humi,");
numChars += sprintf(&buf[numChars], "sensor=sens_num value=%d\n", sensors);
numChars += sprintf(&buf[numChars], "temp_humi,");
numChars += sprintf(&buf[numChars], "sensor=sens_stat value=%u", dhtStatusRegister);
}
}
//Print the buffer on the serial line to see how it looks
//Serial.print("Sending following dataset to InfluxDB: ");
//Serial.println(buf);
//Serial.println(numChars);
//send to InfluxDB
bool sendToInfluxDB_status = sendToInfluxDB(buf, numChars);
//we have to reset the buffer at the end of loop
memset(buf, '\0', bufferSize);
delay(100); //some small delay!
return sendToInfluxDB_status;
}
bool saveUpsStateToInfluxDB(){ //funkcja formatujaca dane z czujnikow w buforze
//this will be number of chars written to buffer, return value of sprintf
int numChars = 0;
numChars += sprintf(&buf[numChars], "satel_ups,");
numChars += sprintf(&buf[numChars], "sensor=ups_ac_err value=%u\n", digitalRead(UPS_AC230V));
numChars += sprintf(&buf[numChars], "satel_ups,");
numChars += sprintf(&buf[numChars], "sensor=ups_aku_err value=%u\n", digitalRead(UPS_AKU_DISCHARGED));
numChars += sprintf(&buf[numChars], "satel_ups,");
numChars += sprintf(&buf[numChars], "sensor=ups_ovr_err value=%u", digitalRead(UPS_OVERLOAD));
//Print the buffer on the serial line to see how it looks
//Serial.print("Sending following dataset to InfluxDB: ");
//Serial.println(buf);
//Serial.println(numChars);
//send to InfluxDB
bool sendToInfluxDB_status = sendToInfluxDB(buf, numChars);
//we have to reset the buffer at the end of loop
memset(buf, '\0', bufferSize);
delay(100); //some small delay!
return sendToInfluxDB_status;
}
bool sendToInfluxDB(char* data, int dataSize) { //funkcja wysylajaca dane do bazy InfluxDB
//first we need to connect to InfluxDB server
int conState = client.connect(server, server_port);
bool DB_save_status = false;
memset(InfluxDB_response, '\0', InfluxBufferSize); //czyszcenie bufora odpowiedzi serwera
if(conState <= 0) { //check if connection to server is stablished
//Serial.print("Could not connect to InfluxDB Server, Error #");
//Serial.println(conState);
strcpy(InfluxDB_response, "connection error ");
return DB_save_status;
}
//Send HTTP header and buffer
client.println(F("POST /write?db=starbase&precision=s&u=starsystem&p=xxxxxx HTTP/1.1"));
client.println(F("Host: starsensor.herrero-net.com"));
client.println(F("User-Agent: Arduino/1.0"));
client.println(F("Connection: close"));
client.println(F("Content-Type: application/x-www-form-urlencoded"));
client.print(F("Content-Length: "));
client.println(dataSize);
client.println();
client.println(data);
delay(3000); //wait for server to process data
//Now we read what server has replied and then we close the connection
const char ack[] = "204 No Content";
char server_response[1024] = {'\0'};
uint16_t i = 0, k = 0;
//Serial.println("Reply from InfluxDB");
while(client.available() && (i < 1024)) { //receive string from server
//Serial.print((char)client.read());
server_response[i++] = client.read();
}
//Serial.println(server_response); //empty line
uint8_t pointer = strstr(server_response,ack) - server_response;
if (pointer) DB_save_status = true;
client.stop();
return DB_save_status;
}