Supla + Arduino + influxDB - integracja

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

Post

Wiec wygląda to tak. Sama supla:

Code: Select all

->>> Supla callbackSupla callbackSupla callbackSupla callbackSupla callback
SuplaDevice initialized
->>> iterate - disconnected
Not connected
->>> iterate - not registered
Register in progress
->>> write:
->>> millis(): 4809
->>> SUPLA  
->>> read:
->>> millis(): 5899
->>> SUPLA  
Registered and ready.
->>> write:
->>> millis(): 5904
->>> SUPLA  [1]
->>> iterate - registered
->>> Supla callbackSupla callbackSupla callbackSupla callbackSupla callback
->>> read:
->>> millis(): 5910
->>> SUPLA  [1]
->>> write:
->>> millis(): 5913
->>> SUPLA  
->>> iterate - registered
->>> write:
->>> millis(): 5915
->>> SUPLA  
->>> iterate - registered
->>> iterate - registered
->>> iterate - registered
->>> iterate - registered
->>>  ...
->>> iterate - registered
A to z moim kodem:

Code: Select all

->>> Supla callbackSupla callbackSupla callbackSupla callbackSupla callback
SuplaDevice initialized
->>> iterate - disconnected
Not connected
->>> iterate - not registered
Register in progress
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> freeMemory()=1374
->>> iterate - disconnected
Not connected
Connection fail. Server: **********.com
->>> iterate - disconnected
Not connected
->>> iterate - not registered
Register in progress
->>> freeMemory()=1374
Po dodaniu mojego kodu nie są nigdy wywoływane funkcje odpowiedzialne za wysyłanie i odbieranie danych z sewera. Tak jakby client nie był dostępny?

///btw: nie wspomniałem, ale pracuję na bibliotece Ethernet w wersji 1.05 bo na 2.0 nie kompilowała się supla - wyczytałem na forum, że tak trzeba
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

spróbuj zamienić client na inną nazwę np.

Code: Select all

bool sendToInfluxDB(char* data, int dataSize) { //funkcja wysylajaca dane do bazy InfluxDB
  //first we need to connect to InfluxDB server   
  int conState = clientApi.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
  clientApi.println(F("POST /write?db=starbase&precision=s&u=starsystem&p=xxxxxx HTTP/1.1"));
  clientApi.println(F("Host: starsensor.herrero-net.com"));
  clientApi.println(F("User-Agent: Arduino/1.0"));
  clientApi.println(F("Connection: close"));
  clientApi.println(F("Content-Type: application/x-www-form-urlencoded"));
  clientApi.print(F("Content-Length: "));
  clientApi.println(dataSize);
  clientApi.println();
  clientApi.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(clientApi.available() && (i < 1024)) { //receive string from server
    //Serial.print((char)clientApi.read());
    server_response[i++] = clientApi.read();
  } 
  //Serial.println(server_response); //empty line
  
  uint8_t pointer = strstr(server_response,ack) - server_response;
  if (pointer) DB_save_status = true; 
 
  clientApi.stop();  
  return DB_save_status;
}
https://gui-generic-builder.supla.io/
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

O tego zacząłem, ale to samo wygląda na to, że jest jakiś problem z dostępem do socketa. Próbowałem też tworzyć obiekt w ten sposób:

Code: Select all

EthernetClient clientInfluxDb(2)
Ale również nie śmiga. Najlepsze jest to, że jak mam wspólną instancję client to zapis do bazy działa, a supla się nie łączy...
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Musisz sprawdzić dlaczego nie wchodzi w read
SUPLA.... Nareszcie w domu.
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Wydaje mi się, że jedna instancja EthernetClient odpowiada tylko za jedno połączenie. W momencie, gdy zrobisz dwa razy "connect()" na jednym client, to albo instancja zerwie poprzednie połączenie i nawiąże nowe, albo nie wykona nowego połącznia. Więc wydaje się sensowne, że działa Ci tylko dostęp do jednego serwera ;).

Może problemem jest podwójne wywołanie Ethernet.begin() ? Wywal to z "setup", bo SuplaDevice też to robi.

Tak jeszcze raz na spokojnie myślę sobie, że problemem może być brak pamięci.
W pliku srpc.c w metodzie srpc_queue_push jest wywołany malloc. Dodaj tam po mallocu:

Code: Select all

if (!queue->item[queue->item_count]) {
   Serial.println("malloc failed!");
}
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

klew wrote: Wed Oct 02, 2019 9:34 pm 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
Po długich bojach śmiga aż miło. Rzeczywiście była zbyt małą kolejką i brakiem pamięci. Wszedłem na wyżyny oszczędzania pamięci i teraz mam:
- setup: 2.5kB,
- Supla logowanie: 1.4kB,
- praca w pętli loop: 3.5kB.
Ciekawe, że ilość powolnej pamięci wzrasta stopniowo od tych 1.4 do 3.5kB.

Wszystkim dziękuję za pomoc.
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Super, że ruszyło :)

Podzielisz się finalnym kodem? Gdzie udało się pamięć zaoszczędzić?
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Herrero
Posts: 26
Joined: Wed Sep 25, 2019 7:29 am
Location: Wrocław

Post

Nie ma problemu. Cudów tam nie ma. Poniżej kod. Program obsługuje do 16 czujników temperatury i wilgotności. Osobiście sukcesywnie wymieniam DHT na SHT (są dużo mniej awaryjne). Oprócz tego status każdego czujnika sygnalizuje dioda NEO WS2812B. Całość wraz ze statusem czujników wrzucana jest do bazy InfluxDB. Aha i jeszcze tam się loguje status zasilacza awaryjnego SATELa - mój system ma buforowe zasilanie. Główną oszczędność pamięci RAM uzyskałem poprzez likwidację/ograniczenie buforów używanych podczas przesyłania danych do bazy. Wcześniej miałem bufor 2048 do, którego drukowałem cały POST i wysyłałem. Teraz bufor ma 40 bajtów, a ja drukuję po kawałku, dodatkowo większość tekstu jest we flashu (makro F()). Może komuś się przyda.

Code: Select all

#include <avr/wdt.h>
#include <string.h>
#include <EEPROM.h>
#include <SPI.h>
#include <Ethernet.h>
//#include <utility/w5100.h>
#include <DHT.h>
#include <SHT1x.h>
#include <Adafruit_NeoPixel.h>
#include <SuplaDevice.h>
#include <MemoryFree.h>

//################## SENSORS - pin definitions #################

#define SENS_PIN_00 A0
#define SENS_PIN_01 A1
#define SENS_PIN_02 A2
#define SENS_PIN_03 A3
#define SENS_PIN_04 A4
#define SENS_PIN_05 A5
#define SENS_PIN_06 A6
#define SENS_PIN_07 A7
#define SENS_PIN_08 A8
#define SENS_PIN_09 A9
#define SENS_PIN_10 A10
#define SENS_PIN_11 A11
#define SENS_PIN_12 A12
#define SENS_PIN_13 A13

//###############################################################

//#################### LEDS - pin definitions ###################

#define RGB_PIN_00 12
#define RGB_PIN_01 11
#define RGB_PIN_02 9
#define RGB_PIN_03 8
#define RGB_PIN_04 7
#define RGB_PIN_05 6
#define RGB_PIN_06 5
#define RGB_PIN_07 3
#define RGB_PIN_08 2
#define RGB_PIN_09 14
#define RGB_PIN_10 15
#define RGB_PIN_11 16
#define RGB_PIN_12 17
#define RGB_PIN_13 22

//###############################################################

//#################### OTHER- pin definitions ###################

#define CLOCK_PIN 42 //pin do zegara dla SHT
#define RGB_POWER_PIN 40 //pin do właczanie zasilania diod RGB
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define BUTTONPIN 18 //pin do przycisku
//#define ETH_STATUS 44 // pin sprawdzajacy podlaczenie kabla sieciowego
#define UPS_AC230V 33 //pin sprawdzajacy obecnosc napiecia 230V
#define UPS_AKU_DISCHARGED 35 //pin sprawdzajacy stan akumulatora
#define UPS_OVERLOAD 37//pin sprawdzajacy przeciazenie zasilacza

//###############################################################

//#################### TYPES definitions ########################

//- port 00 - na zewnatrz
//- port 01 - piwnica pralnia
//- port 02 - piwnica warsztat
//- port 03 - piwnica kotłownia
//- port 04 - piwnica korytarz
//- port 05 - parter wypoczynkowy
//- port 06 - parter kuchnia
//- port 07 - parter korytarz
//- port 08 - parter lazienka
//- port 09 - parter jadalnia
//- port 10 - 1 pietro syp1
//- port 11 - 1 pietro syp2
//- port 12 - 1 pietro korytarz
//- port 13 - 2 pietro korytarz



//DHT dht_00(SENS_PIN_00, DHTTYPE); //czujnik 00
SHT1x sht1x_00(SENS_PIN_00, CLOCK_PIN); // czujnik 00
DHT dht_01(SENS_PIN_01, DHTTYPE); //czujnik 01
DHT dht_02(SENS_PIN_02, DHTTYPE); //czujnik 02
DHT dht_03(SENS_PIN_03, DHTTYPE); //czujnik 03
DHT dht_04(SENS_PIN_04, DHTTYPE); //czujnik 04
DHT dht_05(SENS_PIN_05, DHTTYPE); //czujnik 05
DHT dht_06(SENS_PIN_06, DHTTYPE); //czujnik 06
DHT dht_07(SENS_PIN_07, DHTTYPE); //czujnik 07
DHT dht_08(SENS_PIN_08, DHTTYPE); //czujnik 08
SHT1x sht1x_09(SENS_PIN_09, CLOCK_PIN); // czujnik 11
//DHT dht_09(SENS_PIN_09, DHTTYPE); //czujnik 0
DHT dht_10(SENS_PIN_10, DHTTYPE); //czujnik 10
SHT1x sht1x_11(SENS_PIN_11, CLOCK_PIN); // czujnik 11
//DHT dht_11(SENS_PIN_11, DHTTYPE); //czujnik 11
DHT dht_12(SENS_PIN_12, DHTTYPE); //czujnik 12
SHT1x sht1x_13(SENS_PIN_13, CLOCK_PIN); // czujnik 13
DHT dht_13(SENS_PIN_13, DHTTYPE); //czujnik 13


Adafruit_NeoPixel pixel_00 = Adafruit_NeoPixel(1, RGB_PIN_00, NEO_GRB + NEO_KHZ800); //RGB led 00
Adafruit_NeoPixel pixel_01 = Adafruit_NeoPixel(1, RGB_PIN_01, NEO_GRB + NEO_KHZ800); //RGB led 01
Adafruit_NeoPixel pixel_02 = Adafruit_NeoPixel(1, RGB_PIN_02, NEO_GRB + NEO_KHZ800); //RGB led 02
Adafruit_NeoPixel pixel_03 = Adafruit_NeoPixel(1, RGB_PIN_03, NEO_GRB + NEO_KHZ800); //RGB led 03
Adafruit_NeoPixel pixel_04 = Adafruit_NeoPixel(1, RGB_PIN_04, NEO_GRB + NEO_KHZ800); //RGB led 04
Adafruit_NeoPixel pixel_05 = Adafruit_NeoPixel(1, RGB_PIN_05, NEO_GRB + NEO_KHZ800); //RGB led 05
Adafruit_NeoPixel pixel_06 = Adafruit_NeoPixel(1, RGB_PIN_06, NEO_GRB + NEO_KHZ800); //RGB led 06
Adafruit_NeoPixel pixel_07 = Adafruit_NeoPixel(1, RGB_PIN_07, NEO_GRB + NEO_KHZ800); //RGB led 07
Adafruit_NeoPixel pixel_08 = Adafruit_NeoPixel(1, RGB_PIN_08, NEO_GRB + NEO_KHZ800); //RGB led 08
Adafruit_NeoPixel pixel_09 = Adafruit_NeoPixel(1, RGB_PIN_09, NEO_GRB + NEO_KHZ800); //RGB led 09
Adafruit_NeoPixel pixel_10 = Adafruit_NeoPixel(1, RGB_PIN_10, NEO_GRB + NEO_KHZ800); //RGB led 10
Adafruit_NeoPixel pixel_11 = Adafruit_NeoPixel(1, RGB_PIN_11, NEO_GRB + NEO_KHZ800); //RGB led 11
Adafruit_NeoPixel pixel_12 = Adafruit_NeoPixel(1, RGB_PIN_12, NEO_GRB + NEO_KHZ800); //RGB led 12
Adafruit_NeoPixel pixel_13 = Adafruit_NeoPixel(1, RGB_PIN_13, NEO_GRB + NEO_KHZ800); //RGB led 13


//###############################################################

byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x08}; //adres mac karty sieciowej
byte serverInfluxDB[] = { 10, 10, 10, 250 }; // domyslny adres ip serwera
uint16_t portInfluxDB = 8086;
//byte serverInfluxDB[] = { 156, 17, 31, 233 }; // domyslny adres ip serwera
//uint16_t portInfluxDB = 8886;
unsigned long previousMillis30s = 0; //zmienna do przechowywania poprzedniej wartosci millis
unsigned long previousMillisDebug = 0; //zmienna do przechowywania poprzedniej wartosci millis
//float temperature[16] = {-12.7, -0.5, 2.3, 12, 18.2, 27.1, 28.1, 32.3, -22.1, -17.1, -15.1, -6.3, 0.5, 14.5, 18.9, 7.7}; //tabela wynikow
//float humidity[16] = {15.3, 21.3, 44.5, 60.1, 70, 82.8, 55.9, 41.7, 12.4, 7.4, 33.4, 77.9, 88, 69.9, 19.4, 4}; //tabela wynikow
float temperature[16] = {NAN}; //tabela wynikow (16 wynikow pomiaru i ostatni to srednia z piwnicy)
float humidity[16] = {NAN}; //tabela wynikow (16 wynikow pomiaru i ostatni to srednia z piwnicy)
//const int bufferSize = 40; // rozmiar bufora do przetwarzania danych
//char buf[bufferSize] = {'\0'}; // bufor do przetwarzania danych
uint8_t n = 0; //zmienna do odczytu kolejnych czujników
uint8_t sensors = 0; //liczba aktywnych sensorow w sieci
bool STATUS_sendToServer = 0; //status ostatniego podłaczenia do serwera;
uint32_t red = pixel_00.Color(5,0,0); //definicje kolorow
uint32_t blue = pixel_00.Color(0,0,5); //definicje kolorow
uint32_t yellow = pixel_00.Color(5,5,0); //definicje kolorow
uint16_t dhtStatusRegister = 0xFFFF;
EthernetClient clientInfluxDB;

void setup() {
  wdt_disable(); //wylaczenie watchdog
  Serial.begin(115200);  

//  Ethernet.begin(mac);

  pinMode(UPS_AC230V,INPUT_PULLUP); //pin eth jako wejscie podciagniete do zasilania - obecnosc napiecia 230V
  pinMode(UPS_AKU_DISCHARGED,INPUT_PULLUP); //pin eth jako wejscie podciagniete do zasilania - stan akumulatora
  pinMode(UPS_OVERLOAD,INPUT_PULLUP); //pin eth jako wejscie podciagniete do zasilania - przeciazenie zasilacza  

//  pinMode(RGB_POWER_PIN, OUTPUT); //konfiguracja pinu jako wyjscie (pin do wlaczania zasilania led)
//  digitalWrite(RGB_POWER_PIN, LOW); //właczenie zasilania diod RGB  

  //################## SENSORS - pin configuration ################

  //dht_00.begin(); //sht nie wymaga inicjalizacji
  dht_01.begin();
  dht_02.begin();
  dht_03.begin();
  dht_04.begin();
  dht_05.begin();
  dht_06.begin();
  dht_07.begin();
  dht_08.begin();
  //dht_09.begin(); //sht nie wymaga inicjalizacji
  dht_10.begin(); 
  //dht_11.begin(); //sht nie wymaga inicjalizacji
  dht_12.begin();
  //dht_13.begin(); //sht nie wymaga inicjalizacji

  
  //###############################################################

  //#################### LEDS - pin configuration #################

  pixel_00.begin();
  pixel_01.begin();
  pixel_02.begin();
  pixel_03.begin();
  pixel_04.begin();
  pixel_05.begin();
  pixel_06.begin();
  pixel_07.begin();
  pixel_08.begin();
  pixel_09.begin();
  pixel_10.begin();
  pixel_11.begin();
  pixel_12.begin();
  pixel_13.begin();

  //###############################################################

  
  wdt_enable(WDTO_8S); ///wlaczenie watchdog 8s

  //####################### SUPLA configuration ###################
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x93,0x49,0xDC,0x32,0x77,0x7A,0xE6,0xE4,0xD5,0x44,0x90,0x4B,0x64,0x7F,0x14,0xD7};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Set temperature/humidity callback
  SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
  
  SuplaDevice.addDHT22();  //na zewnatrz
  SuplaDevice.addDHT22();  //piwnica
  SuplaDevice.addDHT22();  //parter
  SuplaDevice.addDHT22();  //1-sze pietro  
  SuplaDevice.addDHT22();  //2-gie pietro

  // CHANNEL0 - SENSORS BACKLIGHT
  SuplaDevice.addRelay(RGB_POWER_PIN,true);         // 44 - Pin number where the relay is connected      
                                                    // Call SuplaDevice.addRelay(44, true) with an extra "true" parameter 
                                                    // to enable "port value inversion"
                                                    // where HIGH == LOW, and LOW == HIGH  
   
  SuplaDevice.setName("starsensors");               // zmiana nazwy mdułu w supla
  SuplaDevice.begin(GUID,                           // Global Unique Identifier 
                    mac,                            // Ethernet MAC address
                    "suplacloud.herrero-net.com",   // SUPLA server address
                    X,                              // Location ID 
                    "XXXX");                        // Location Password  

  //############################################################### 
}

void loop() {
  wdt_reset(); //reset watchdog
  SuplaDevice.iterate();
  timer30s();
  
//  unsigned long currentMillisDebug = millis();
//  if ((unsigned long)(currentMillisDebug - previousMillisDebug) >= 3000) {
//    previousMillisDebug = currentMillisDebug;
//	Serial.print(F("freeMemory()="));
//    Serial.println(freeMemory());
//    
//  }
}

//zadania do wykonania co 30s
void timer30s(){
  unsigned long currentMillis30s = millis();
  if ((unsigned long)(currentMillis30s - previousMillis30s) >= 30000) {
    previousMillis30s = currentMillis30s;

  //########################## SATEL - USP ########################
  
    //wysyłanie statusu UPS co 60s
    if (n % 2) sendToInfluxDB(2); //gdy nieparzyste n

  //###############################################################    


  //##################### OBSŁUGA CZUJNIKÓW #######################
  
    readSensor(n);
    n++;  
    
    if (n == 16) { 
      STATUS_sendToServer = sendToInfluxDB(1); //zapis do bazy influxDB
      n = 0; //zerowanie licznika odczytu czujników
    } //koniec if n == 16

    //poczatek petli zliczajacej czujniki 
    uint16_t value = dhtStatusRegister;
    sensors = 16;
    while (value) {
      sensors--;
      value = (value - 1) & value;
    } //koniec petli zliczajacej czujniki

  //############################################################### 

  //######################## OBSŁUGA LED ##########################  

    if(!client.connected() && !(n % 2)){ //jeśłi rozłączony z serwera supla to co 30s gas diody 
      red = 0;
      blue = 0;
      yellow = 0;
    }
    else{
      red = pixel_00.Color(5,0,0); //definicje kolorow
      blue = pixel_00.Color(0,0,5); //definicje kolorow
      yellow = pixel_00.Color(5,5,0); //definicje kolorow
    }

    for(uint8_t y = 0; y < 16; y++) //petla zaswiecajaca diody
    {
      setColorLed(y); //zapalenie diody, zmiana koloru 
    } //koniec petli zaswiecajacej diody

  //############################################################### 
  }
}

// Supla callback
void get_temperature_and_humidity(int channelNumber, double *temp, double *humi) {

  uint8_t average_counter = 0;
  float temperature_tmp = 0;
  float humidity_tmp = 0;

  switch(channelNumber) {
// temperatura na zewnatrz
   case 0: 
    *temp = temperature[0];
    *humi = humidity[0];   
    break;
 
// srednia temperatura - piwnica
   case 1:     
    for(uint8_t u = 1; u < 5; u++)
    {

      if (!isnan(temperature[u]))
      {
        temperature_tmp = temperature_tmp + temperature[u];
        humidity_tmp = humidity_tmp + humidity[u];
        average_counter++;
      }
    }    
    *temp = temperature_tmp/average_counter;
    *humi = humidity_tmp/average_counter;   
    break;    

// srednia temperatura - parter   
   case 2:     
    for(uint8_t u = 5; u < 10; u++)
    {
      if (!isnan(temperature[u]) && (u != 8))
      {
        temperature_tmp = temperature_tmp + temperature[u];
        humidity_tmp = humidity_tmp + humidity[u];      
        average_counter++; 
      }
    }     
    *temp = temperature_tmp/average_counter;
    *humi = humidity_tmp/average_counter;

    break;    

// srednia temperatura - 1-sze pietro   
   case 3:    
    for(uint8_t u = 10; u < 13; u++)
    {
      if (!isnan(temperature[u]))
      {
        temperature_tmp = temperature_tmp + temperature[u];
        humidity_tmp = humidity_tmp + humidity[u];
        average_counter++;
      }
    }    
    *temp = temperature_tmp/average_counter;
    *humi = humidity_tmp/average_counter;   
    break;    
 
    // srednia temperatura - 2-gie pietro   
   case 4:     
    *temp = temperature[13];
    *humi = humidity[13];   
    break;     
 }
 
 if ( isnan(*temp) || isnan(*humi) ) {
  *temp = -275;
  *humi = -1;
  }
}

void setColorLed(uint8_t ledNumber){
  switch (ledNumber){
    case 0:
      if (dhtStatusRegister & 0x0001) pixel_00.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_00.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_00.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_00.show();   
      break;
    case 1:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_01.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_01.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_01.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_01.show();   
      break;   
    case 2:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_02.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_02.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_02.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_02.show();   
      break; 
    case 3:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_03.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_03.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_03.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_03.show();   
      break; 
    case 4:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_04.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_04.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_04.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_04.show();   
      break; 
    case 5:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_05.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_05.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_05.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_05.show();   
      break; 
    case 6:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_06.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_06.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_06.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_06.show();   
      break; 
    case 7:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_07.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_07.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_07.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_07.show();   
      break; 
    case 8:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_08.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_08.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_08.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_08.show();   
      break; 
    case 9:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_09.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_09.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_09.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_09.show();   
      break; 
    case 10:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_10.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_10.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_10.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_10.show();   
      break; 
    case 11:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_11.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_11.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_11.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_11.show();   
      break; 
    case 12:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_12.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_12.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_12.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_12.show();   
      break; 
    case 13:
      if (dhtStatusRegister & (1 << ledNumber)) pixel_13.setPixelColor(0,red); //jeśli bład odczytu zapal led na czerwono
      else if (STATUS_sendToServer == 0) pixel_13.setPixelColor(0,yellow); //jesli był problem z DHCP lub połącznieniem z serwerem zaswiec diody na pomaranczowo
      else pixel_13.setPixelColor(0,blue); //wszystko OK, zapal na niebiesko 
      pixel_13.show();   
      break; 
    default:
      break;                                                                                                        
  }
}

void readSensor(uint8_t sensorNumber){
  switch (sensorNumber){
    case 0:
      humidity[sensorNumber] = sht1x_00.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = sht1x_00.readTemperatureC(); //odczyt temperatury  
      if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
      if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN        
      break;
    case 1:
      humidity[sensorNumber] = dht_01.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_01.readTemperature(); //odczyt temperatury     
      break;
    case 2:
      humidity[sensorNumber] = dht_02.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_02.readTemperature(); //odczyt temperatury     
      break;      
    case 3:
      humidity[sensorNumber] = dht_03.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_03.readTemperature(); //odczyt temperatury     
      break;
    case 4:
      humidity[sensorNumber] = dht_04.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_04.readTemperature(); //odczyt temperatury     
      break;
    case 5:
      humidity[sensorNumber] = dht_05.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_05.readTemperature(); //odczyt temperatury     
      break;
    case 6:
      humidity[sensorNumber] = dht_06.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_06.readTemperature(); //odczyt temperatury     
      break;
    case 7:
      humidity[sensorNumber] = dht_07.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_07.readTemperature(); //odczyt temperatury     
      break;
    case 8:
      humidity[sensorNumber] = dht_08.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_08.readTemperature(); //odczyt temperatury     
      break;
    case 9:
      humidity[sensorNumber] = sht1x_09.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = sht1x_09.readTemperatureC(); //odczyt temperatury  
      if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
      if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN        
      //humidity[sensorNumber] = dht_09.readHumidity(); //odczyt wilgotnosci 
      //temperature[sensorNumber] = dht_09.readTemperature(); //odczyt temperatury     
      break;
    case 10:      
      humidity[sensorNumber] = dht_10.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_10.readTemperature(); //odczyt temperatury     
      break;
    case 11:
      humidity[sensorNumber] = sht1x_11.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = sht1x_11.readTemperatureC(); //odczyt temperatury  
      if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
      if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN     
      //humidity[sensorNumber] = dht_11.readHumidity(); //odczyt wilgotnosci 
      //temperature[sensorNumber] = dht_11.readTemperature(); //odczyt temperatury     
      break;
    case 12:
      humidity[sensorNumber] = dht_12.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = dht_12.readTemperature(); //odczyt temperatury     
      break;
    case 13:
      humidity[sensorNumber] = sht1x_13.readHumidity(); //odczyt wilgotnosci 
      temperature[sensorNumber] = sht1x_13.readTemperatureC(); //odczyt temperatury  
      if ((humidity[sensorNumber] <= 0) || (humidity[sensorNumber] > 99)) humidity[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc mniejsza od zera, wiec ujednalicam z dht wpisujac NAN
      if ((temperature[sensorNumber] <= -40) || (temperature[sensorNumber] > 99)) temperature[n] = NAN; //jesli jest blad odczytu to funcja zwraca wartosc -40, wiec ujednalicam z dht wpisujac NAN     
      //humidity[sensorNumber] = dht_13.readHumidity(); //odczyt wilgotnosci 
      //temperature[sensorNumber] = dht_13.readTemperature(); //odczyt temperatury     
      break; 
    default:
  	  humidity[sensorNumber] = NAN;
  	  temperature[sensorNumber] = NAN;
      break;                                                                                              
  }

  //zapis statusu czujników 
  if (isnan(temperature[n]) || isnan(humidity[n])) { //blad odczytu
    if(n == 0) dhtStatusRegister = dhtStatusRegister | (uint16_t)(1); 
    else dhtStatusRegister = dhtStatusRegister | (uint16_t)(1 << n); //zapis numeru blednego czujnika
    //Serial.println("Failed to read from DHT sensor!");  
  }
  else { //odczyt ok
    if(n == 0) dhtStatusRegister = dhtStatusRegister & (~(uint16_t)(1)); 
    else dhtStatusRegister = dhtStatusRegister & (~(uint16_t)(1 << n)); //zapis statusu dobrego czujnika
  }     
}

int8_t sendToInfluxDB(uint8_t mode){ //funkcja formatujaca dane z czujnikow w buforze

  const uint8_t bufferSize = 40; // rozmiar bufora do przetwarzania danych
  char buf[bufferSize] = {'\0'}; // bufor do przetwarzania danych
  uint8_t numChars = 0; 
  int numCharsTotal = 0; //this will be number of chars written to buffer, return value of sprintf
  int8_t conState = 0;

  for(uint8_t noTest = 0; noTest < 2; noTest++) { //jak 0 to testuje rozmiar, jak 1 to wysyła
    //unsigned long tic = millis();
    if(noTest){//wysyłanie na serwer przy drugim wystapieniu petli
      conState = clientInfluxDB.connect(serverInfluxDB, portInfluxDB);
      //Send HTTP header and buffer
      clientInfluxDB.println(F("POST /write?db=starbase&precision=s&u=XXXUSERXXX&p=XXXPASSXXX HTTP/1.1"));
      clientInfluxDB.println(F("Host: starsensor.herrero-net.com"));
      clientInfluxDB.println(F("User-Agent: Arduino/1.0"));
      clientInfluxDB.println(F("Connection: close"));
      clientInfluxDB.println(F("Content-Type: application/x-www-form-urlencoded"));
      clientInfluxDB.print(F("Content-Length: "));
      clientInfluxDB.println(numCharsTotal);
      clientInfluxDB.println();      
    }
    
    switch (mode){
      case 1: //zapis danych z czujnikow 
        for(uint8_t i = 0; i < 16; i++) { //pomiary_test,sensor=T0 value=22.5 unix_timestamp
      
          int16_t temp_integer = 0, temp_fractional = 0, humi_integer = 0, humi_fractional = 0, temp = 0;

          temp_integer = temperature[i];
          temp = (temperature[i]  - temp_integer) * 100;
          if (temp < 0) temp = temp*-1;
          if ((temp % 10) > 5) temp_fractional = (temp + 1)/10; //zaokrąglanie
          else temp_fractional = temp/10;
          if(noTest) clientInfluxDB.print(F("temp_humi,sensor="));
          numCharsTotal += 17;
          if ((temperature[i] > - 1) && (temperature[i] < 0)) numChars += sprintf(&buf[numChars], "T%d value=-%d.%1d\n", i, temp_integer, temp_fractional);
          else numChars += sprintf(&buf[numChars], "T%d value=%d.%1d\n", i, temp_integer, temp_fractional);
          
          if(noTest) clientInfluxDB.print(buf);        
          numCharsTotal += numChars;
          numChars = 0;
          memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
      
          humi_integer = humidity[i];
          temp = (humidity[i] - humi_integer)*100;
          if ((temp % 10) > 5) humi_fractional = (temp + 1)/10; //zaokraglenie
          else humi_fractional = temp/10;    
          if(noTest) clientInfluxDB.print(F("temp_humi,sensor="));
          numCharsTotal += 17;
          numChars += sprintf(&buf[numChars], "H%d value=%d.%1d\n", i, humi_integer, humi_fractional);
  
          if(noTest) clientInfluxDB.print(buf);         
          numCharsTotal += numChars;
          numChars = 0;
          memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
          
          //zapis logow
          if (i == 15) {
            if(noTest) clientInfluxDB.print(F("temp_humi,sensor=sens_num value="));
            numCharsTotal += 32;
            numChars += sprintf(&buf[numChars], "%d\n", sensors);
            if(noTest) clientInfluxDB.print(buf);           
            numCharsTotal += numChars;
            numChars = 0;
            memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
            
            if(noTest) clientInfluxDB.print(F("temp_humi,sensor=sens_stat value="));
            numCharsTotal += 33;
            numChars += sprintf(&buf[numChars], "%u", dhtStatusRegister);
            if(noTest) clientInfluxDB.print(buf);
            numCharsTotal += numChars;
            numChars = 0;
            memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop          
          }

          
//          temp_integer = temperature[i];
//          temp = (temperature[i]  - temp_integer) * 100;
//          if (temp < 0) temp = temp*-1;
//          if ((temp % 10) > 5) temp_fractional = (temp + 1)/10; //zaokrąglanie
//          else temp_fractional = temp/10;
//          numChars += sprintf(&buf[numChars], "temp_humi,");
//          if ((temperature[i] > - 1) && (temperature[i] < 0)) numChars += sprintf(&buf[numChars], "sensor=T%d value=-%d.%1d\n", i, temp_integer, temp_fractional);
//          else numChars += sprintf(&buf[numChars], "sensor=T%d value=%d.%1d\n", i, temp_integer, temp_fractional);
//          
//          if(noTest) clientInfluxDB.print(buf);        
//          numCharsTotal += numChars;
//          numChars = 0;
//          memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//      
//          humi_integer = humidity[i];
//          temp = (humidity[i] - humi_integer)*100;
//          if ((temp % 10) > 5) humi_fractional = (temp + 1)/10; //zaokraglenie
//          else humi_fractional = temp/10;    
//          numChars += sprintf(&buf[numChars], "temp_humi,");
//          numChars += sprintf(&buf[numChars], "sensor=H%d value=%d.%1d\n", i, humi_integer, humi_fractional);
//  
//          if(noTest) clientInfluxDB.print(buf);         
//          numCharsTotal += numChars;
//          numChars = 0;
//          memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//          
//          //zapis logow
//          if (i == 15) {
//            numChars += sprintf(&buf[numChars], "temp_humi,");
//            numChars += sprintf(&buf[numChars], "sensor=sens_num value=%d\n", sensors);
//            if(noTest) clientInfluxDB.print(buf);           
//            numCharsTotal += numChars;
//            numChars = 0;
//            memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
//            
//            numChars += sprintf(&buf[numChars], "temp_humi,");
//            numChars += sprintf(&buf[numChars], "sensor=sens_stat value=%u", dhtStatusRegister);
//            if(noTest) clientInfluxDB.print(buf);
//            numCharsTotal += numChars;
//            numChars = 0;
//            memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop          
//          }
        }
        //Serial.print("liczba znakow total: ");
        //Serial.println(numCharsTotal);        
        //numCharsTotal = 0;
        break;
      case 2: //zapis danych z UPS satela
        numCharsTotal = 109; //zakomentowano prawidłową implementację; 109 jest wyliczone na podstawie poprzedniego rozwiązania
        if(noTest) {
          clientInfluxDB.print(F("satel_ups,sensor=ups_ac_err value="));
          clientInfluxDB.print(digitalRead(UPS_AC230V));
          clientInfluxDB.print(F("\nsatel_ups,sensor=ups_aku_err value="));
          clientInfluxDB.print(digitalRead(UPS_AKU_DISCHARGED));
          clientInfluxDB.print(F("\nsatel_ups,sensor=ups_ovr_err value="));
          clientInfluxDB.print(digitalRead(UPS_OVERLOAD));
        }
        /*
        numChars += sprintf(&buf[numChars], "satel_ups,");
        numChars += sprintf(&buf[numChars], "sensor=ups_ac_err value=%u\n", digitalRead(UPS_AC230V));
  
        if(noTest) clientInfluxDB.print(buf);
        numCharsTotal += numChars;
        numChars = 0;        
        memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
            
        numChars += sprintf(&buf[numChars], "satel_ups,");
        numChars += sprintf(&buf[numChars], "sensor=ups_aku_err value=%u\n", digitalRead(UPS_AKU_DISCHARGED));
  
        if(noTest) clientInfluxDB.print(buf);
        numCharsTotal += numChars;
        numChars = 0;          
        memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
        
        numChars += sprintf(&buf[numChars], "satel_ups,");
        numChars += sprintf(&buf[numChars], "sensor=ups_ovr_err value=%u", digitalRead(UPS_OVERLOAD));       
  
        if(noTest) clientInfluxDB.print(buf);
        numCharsTotal += numChars;
        numChars = 0;          
        memset(buf, '\0', bufferSize); //we have to reset the buffer at the end of loop
        */
        //Serial.print("liczba znakow total: ");
        //Serial.println(numCharsTotal);
        //numCharsTotal = 0;
        break;
    }
    
    if(noTest){//wysyłanie na serwer przy drugim wystapieniu petli
//      delay(1000); //wait for server to process data
//    
//      //Now we read what server has replied and then we close the connection
//      while(clientInfluxDB.available()) { //receive string from server
//        Serial.print((char)clientInfluxDB.read());
//      } 
      clientInfluxDB.stop();       
    }
    //Serial.print("czas przetwarzania: ");
    //Serial.println(millis()-tic);
  }
  return conState;   
}

Return to “Pomoc”