Supla + Arduino + influxDB - integracja

User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

Mam system czujników obsługiwanych przez Arduino mega. Dane są wrzucane do bazy influxDB. Chciałem to zintegrować z supla poprzez modyfikacje callbacka i w ten sposób wrzucać swoje dane. Niestety mam problem, bo po połączeniu z moim kodem nie łączy się z serwerem supla. Jak wyremuje funkcję timer30s to się łączy. Z kolei jak tylko wyremuje linie odpowiedzialne za wysyłanie do bazy to mam: "ssrpc_in_queue_push error Iterate fail". Podejrzewam, że problemem jest obiekt client, który jest wspólny. Pytanie, czy może być wspólny? Czy supladevice potrzebuje swój obiekt klasy Ethernet? Czy supladevice cały czas utrzymuje połączenie z serwerem? Poniżej kod do wglądu:

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;
}
Last edited by Herrero on Wed Oct 16, 2019 11:59 am, edited 1 time in total.
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Prawdopodobnie trafiłeś na problem ze zbyt małą kolejką wiadomości wysyłanych przez SuplaDevice. Możliwe też, że brakuje pamięci na Arduino (albo obie rzeczy na raz).
Spróbuj zrobić drobne poprawki do biblioteki opisane tutaj viewtopic.php?p=49585#p49585
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

Sprawdziłem, freememory pokazuje 900...
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

A sprawdzisz ile było wolnej pamięci przed dołożeniem SuplaDevice?
Obecnie to nie ruszy, bo jeden element na kolejce zajmuje 1 kB. Będę to w najbliższym czasie optymalizował
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

update:
szkic bez supla: 2966
szkic z supla jeden obiekt EthernetClient: 1115
szkic z supla dwa obiekty EthernetClient: 900

Czy wiesz jak to jest z tymi klientami? Czy połączenie z serwerem supla jest utrzymywane cały czas? Czy trzeba dwa obiekty EthernetClient? Mówisz, że 1kB potrzebuje? Czemu mi się nie łaczy z serwerem? Jest inicjaliacja supla, próba połączenia a potem po jakiejś minucie nieudane połączenie... Co chcesz optymalizować? Może ja powalczę ze swoim kodem i zużyciem pamięci?
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Połączenie utrzymywane jest cały czas.
Możesz współdzielić instancję obiektu Ethenret ale musisz przerobić.
https://github.com/SUPLA/arduino/blob/m ... lper._cpp_
SUPLA.... Nareszcie w domu.
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Herrero wrote: Thu Oct 03, 2019 7:10 am update:
szkic bez supla: 2966
szkic z supla jeden obiekt EthernetClient: 1115
szkic z supla dwa obiekty EthernetClient: 900

Czy wiesz jak to jest z tymi klientami? Czy połączenie z serwerem supla jest utrzymywane cały czas? Czy trzeba dwa obiekty EthernetClient? Mówisz, że 1kB potrzebuje? Czemu mi się nie łaczy z serwerem? Jest inicjaliacja supla, próba połączenia a potem po jakiejś minucie nieudane połączenie... Co chcesz optymalizować? Może ja powalczę ze swoim kodem i zużyciem pamięci?
Aktualnie implementacja komunikacji z serwerem supli jest zrobiona w pliku srpc.c. Tam są dwie kolejki: pakiety wysyłane i pakiety odbierane. Jeden element na kolejce allokuje ponad 1 kB. Do tego największy pakiet leci w momencie rejestracji urządzenia w cloud, bo supla wysyła dane rejestracyjne oraz informacje o wszystkich kanałach w jednej wiadomości.

Twój szkic bez Supli zjada już dość dużo pamięci. Możesz spróbować go okroić, ale tak na moje oko musiałbyś zwolnić około 1,5 kB.

Ja będę optymalizował bibliotekę tak, aby w sumie zjadała nie więcej niż 2 kB i aby też w tym limicie zmieścić się ze wszystkimi potrzebami pamięci w trakcie pracy.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

pzygmunt wrote: Thu Oct 03, 2019 7:36 am Połączenie utrzymywane jest cały czas.
Możesz współdzielić instancję obiektu Ethenret ale musisz przerobić.
https://github.com/SUPLA/arduino/blob/m ... lper._cpp_
A mógłbyś pomóc z tą przeróbką?
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Z przyjemnością bym Ci pomógł ale czasowo nie mam kiedy się tym zająć.
SUPLA.... Nareszcie w domu.
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

Staram się to rozgryźć. Na razie odchudziłem program i Arduino IDE pokazuje, że mam pod 4kB wolnego RAMu. Nie wiem czemu freememory() pokazuje około 900B. Jednak dalej mam problem z równoczesną pracą dwóch klientów. Stworzyłem własny obiekt do komunikacji do z bazą influxDB (clientInfluxDB). Działa sam jak i w połączeniu z suplą (ona pracuje na obiekcie client). Natomiast supla tylko, gdy jest sama. Czy mógłby mnie ktoś naprowadzić dlaczego tak się dzieje? Supla się inicjalizuje, ale potem jest błąd połączenia z serwerem.

Przeglądałem bibliotekę Ethernet i zobaczyłem, że przy konstruktorze klasy Client jest możliwość zmiany socindex. Może trzeba odpalić dwa klienty na różnych socketach?

Code: Select all

EthernetClient() : sockindex(MAX_SOCK_NUM), _timeout(1000) { }
	EthernetClient(uint8_t s) : sockindex(s), _timeout(1000) { }
I mój zmodyfikowany kod:

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
#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 ########################

//- 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
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 serverInfluxDB[] = { 10, 10, 10, 250 }; // domyslny adres ip serwera
uint16_t portInfluxDB = 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 = 1100; // Size of the buffer for HTTP content 
char buf[bufferSize] = {'\0'}; // An character array filled with null terminate chars
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;
EthernetClient clientInfluxDB;

void setup() {
  wdt_disable(); //wylaczenie watchdog
  //W5100.setRetransmissionTime(2000); //2000ms
  //W5100.setRetransmissionCount(2); //3 próby po 200ms  

  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
  //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  

  //###############################################################
  Serial.print("clientInfluxDB socket: ");
  Serial.println(clientInfluxDB.getSocketNumber());
  Serial.print("client socket: ");
  Serial.println(client.getSocketNumber());  
}

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) >= 3000) {
    previousMillis30s = currentMillis30s;
    unsigned long tic = millis();
    Serial.print("freeMemory()=");
    Serial.println(freeMemory());

  //########################## 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

  //############################################################### 
     unsigned long toc = millis() - tic;
  Serial.print("timer30s: ");
  Serial.println(toc);  
  }
}

// Supla callback
void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {
Serial.print("Supla callback");
  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);
  Serial.print(F("buff counter: ")); //empty line
  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 = clientInfluxDB.connect(serverInfluxDB, portInfluxDB);
  bool DB_save_status = false;
 
  if(conState <= 0) { //check if connection to server is stablished
    //Serial.print("Could not connect to InfluxDB Server, Error #");
    //Serial.println(conState);
    return DB_save_status;
  }
  
  //Send HTTP header and buffer
  clientInfluxDB.println(F("POST /write?db=starbase&precision=s&u=starsystem&p=xxxxxx 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(dataSize);
  clientInfluxDB.println();
  clientInfluxDB.println(data);

  //we have to reset the buffer
  memset(data, '\0', dataSize);
 
  delay(1000); //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";
  uint16_t i = 0, k = 0;
  //Serial.println("Reply from InfluxDB");
  while(clientInfluxDB.available() && (i < 1024)) { //receive string from server
    //Serial.print((char)clientInfluxDB.read());
    data[i++] = clientInfluxDB.read();
  } 
  Serial.println(data); //empty line
  Serial.print(F("server_response counter: ")); //empty line
  Serial.println(i);
  
  uint8_t pointer = strstr(data,ack) - data;
  if (pointer) DB_save_status = true; 
 
  clientInfluxDB.stop();  
  return DB_save_status;
}
Last edited by Herrero on Wed Oct 16, 2019 12:00 pm, edited 1 time in total.

Return to “Pomoc”