Mały, bezprzewodowy czujnik temperatury na radiu

Awatar użytkownika
klew
Posty: 8178
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

dogu18 pisze: pn sie 31, 2020 4:39 pm
dogu18 pisze: śr sie 05, 2020 4:10 pm Witam
Czy ktoś podjął się przepisania softu bramki na nowe SuplaDevice?? fajnie by było jak od razu było z "flagami"

Pozdrawiam :)
Rozumiem ze projekt umarł... może ktoś pomorze to napisać??
Masz na myśli to pole informacyjne przy kanale? Np. ze stanem baterii?
Widzimy się na Supla Offline Party vol. 2 :!:
dogu18
Posty: 257
Rejestracja: czw paź 11, 2018 8:35 pm

klew pisze: pn sie 31, 2020 9:33 pm
dogu18 pisze: pn sie 31, 2020 4:39 pm
dogu18 pisze: śr sie 05, 2020 4:10 pm Witam
Czy ktoś podjął się przepisania softu bramki na nowe SuplaDevice?? fajnie by było jak od razu było z "flagami"

Pozdrawiam :)
Rozumiem ze projekt umarł... może ktoś pomorze to napisać??
Masz na myśli to pole informacyjne przy kanale? Np. ze stanem baterii?
Ogólne przepisanie czujników pod nowe biblioteki. Te pole przy okazji 🙂
Pozdrawiam
Grzegorz Labudda
dogu18
Posty: 257
Rejestracja: czw paź 11, 2018 8:35 pm

Mam jeszcze jeden problem. czujnik natężenia światła w nocy pokazuje mi 3 luxy a powinno być 0 (chyba)
używam czujnika bh1750 z kopułka.
Problem mam też z wilgotnością po często pokazuje 100% ale to chyba wina czujnika

to jest kod wgrany do bramki

Kod: Zaznacz cały

/*
Bramka RB-10G
Copyright (C) 2019 Robert Błaszczak

Niniejszy program jest wolnym oprogramowaniem; możesz go 
rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundację Wolnego
Oprogramowania - według wersji 2-giej tej Licencji lub którejś
z późniejszych wersji. 
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on 
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej 
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH 
ZASTOSOWAŃ. W celu uzyskania bliższych informacji - Powszechna 
Licencja Publiczna GNU. 
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz 
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
*/

#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69

#define NODEID 1                          //Unikalny numer bramki (1 - 254).
#define NETWORKID 100                     //Numer sieci (1 - 254) w której działą bramka SUPLA oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define FREQUENCY RF69_868MHZ             //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW                  //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "qwertyuiopasdfgh"     //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce SUPLA i we wszystkich transmiterach.
#define ENABLE_ATC                        //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).

#define SERIAL_BAUD 115200                //Prędkość transmisji portu szeregowego.

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

#define SUPLA_SERVER "svrx.supla.org"
#define LOCATION_ID xxxx
#define LOCATION_PASSWORD "xxxx"
// pobierz identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadź go poniżej
#define GUID {0x4E,0x20,0xAA,0x53,0xCE,0x09,0x1E,0xC1,0xB1,0x8D,0x9C,0x8B,0x59,0xDB,0x78,0x46};

RFM69_ATC radio(D8, D2, false);
bool promiscuousMode = false;

const unsigned long period = 600000;      //Czas (10 minut) po którym bramka uznaje brak odczytu z transmitera i ustawia wartości wysyłane do Supla Cloud na 0.
double temperature = 0.0;
double humidity = 0.0;
double pressure = 0.0;
double lux = 0.0;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long RFNodesCount = 0;

typedef struct {
  int nodeid;
  int channelNumber;
  double temperature;
  double humidity;
  double pressure;
  double lux;
  double batteryLevel;
  unsigned long lastContact;
} RF_TemperatureandHumidityNode;

RF_TemperatureandHumidityNode RFNodes[6];


void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == channelNumber)
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2 )
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}

void setup() {
  Serial.begin(SERIAL_BAUD);
  
   SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   
   
   
  char guid[SUPLA_GUID_SIZE] = GUID;
  uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
  SuplaDevice.setName("BRAMKA RB-10G");
  SuplaDevice.begin(guid, mac, SUPLA_SERVER, LOCATION_ID, LOCATION_PASSWORD);
  
  radio.initialize(FREQUENCY,NODEID,NETWORKID);

#ifdef IS_RFM69HW_HCW
  radio.setHighPower();
#endif

  radio.encrypt(ENCRYPTKEY);
  radio.promiscuous(promiscuousMode);

  char buff[105];
  sprintf(buff, "BRAMKA RB-10G. Start komunikacji radiowej na częstotliwości %d MHz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  Serial.println(buff);
}

byte ackCount = 0;
uint32_t packetCount = 0;

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void readRadioData() {

  String value = "";
  if (radio.receiveDone())
  {
    int foundIdx = -1;

    for (int i = 0; i < RFNodesCount; i++)
      if (RFNodes[i].nodeid == radio.SENDERID)
      {
        foundIdx = i;
        break;
      }

    Serial.println("Odbieram dane...");
    if (foundIdx == -1)
    {
      if (RFNodesCount < 6)
      {
        Serial.println("Znalazłem nowy transmiter. Dodaję go do SUPLA Cloud");
        RFNodes[RFNodesCount].nodeid = radio.SENDERID;
        RFNodes[RFNodesCount].lastContact = millis();
        RFNodes[RFNodesCount].channelNumber = radio.SENDERID - 1;
        RFNodes[RFNodesCount].temperature = 0.0;
        RFNodes[RFNodesCount].humidity = 0.0;
        RFNodes[RFNodesCount].pressure = 0.0;
        RFNodes[RFNodesCount].lux = 0.0;
        RFNodes[RFNodesCount].batteryLevel = 0;
        
        foundIdx = RFNodesCount;
        RFNodesCount++;
      } else {
        Serial.println("Maksymalna ilość transmiterów przekroczona!");
        foundIdx = 0;
      }
    } else
    {
      RFNodes[foundIdx].temperature = 0.0;
    }

    Serial.print("#[");
    Serial.print(++packetCount);
    Serial.print(']');
    Serial.print('['); Serial.print(radio.SENDERID, DEC); Serial.print("] ");

    value = "";
    for (byte i = 0; i < radio.DATALEN; i++)
      if (radio.DATA[i] != ' ')
        value += (char)radio.DATA[i];

    Serial.println(value);

    String tempStr = getValue(value, '|', 0);
    String humStr = getValue(value, '|', 1);
    String presStr = getValue(value, '|', 2);
    String luxStr = getValue(value, '|', 3);
    String battLevelStr = getValue(value, '|', 4);

    Serial.print("Temperatura: ");
    Serial.println(tempStr);
    Serial.print("Wilgotność: ");
    Serial.println(humStr);
    Serial.print("Ciśnienie: ");
    Serial.println(presStr);
    Serial.print("Natężenie światła: ");
    Serial.println(luxStr);
    Serial.print("Poziom baterii: ");
    Serial.println(battLevelStr);

    RFNodes[foundIdx].temperature = tempStr.toFloat();
    RFNodes[foundIdx].humidity = humStr.toFloat();
    RFNodes[foundIdx].pressure = presStr.toFloat();
    RFNodes[foundIdx].lux = luxStr.toFloat();
    RFNodes[foundIdx].batteryLevel = battLevelStr.toFloat();
    RFNodes[foundIdx].lastContact = millis();

    Serial.print("Poziom sygnału transmitera [RX_RSSI]:"); Serial.print(radio.RSSI); Serial.print(" dBm");

    if (radio.ACKRequested())
    {
      byte theNodeID = radio.SENDERID;
      radio.sendACK();
      
      if (ackCount++ % 3 == 0)
      {
        Serial.print(" ACK TEST - Transmiter ");
        Serial.print(theNodeID);
        delay(5);
        radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0);
      }
    }
    Blink(LED_BUILTIN, 100);
    Serial.println();
    Serial.println();
  }

  for (int i = 0; i < RFNodesCount; i++)
  {
    if (millis() - RFNodes[i].lastContact >= period)
    {
      RFNodes[i].temperature = -375;
      RFNodes[i].humidity = -1;
      RFNodes[i].pressure = -10;
      RFNodes[i].lux = 0;
      RFNodes[i].batteryLevel = 0;
      Serial.print("Brak odczytu z czujnika ");
      Serial.println (RFNodes[i].nodeid);
    };
  }
}

void Blink(byte PIN, int DELAY_MS)
{
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN,LOW);
  delay(DELAY_MS);
  digitalWrite(PIN,HIGH);
}

void loop() {
  readRadioData();
  SuplaDevice.iterate();
}
Pozdrawiam
Grzegorz Labudda
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

dogu18 pisze: śr wrz 02, 2020 9:18 pm Mam jeszcze jeden problem. czujnik natężenia światła w nocy pokazuje mi 3 luxy a powinno być 0 (chyba)
używam czujnika bh1750 z kopułka.
Problem mam też z wilgotnością po często pokazuje 100% ale to chyba wina czujnika

to jest kod wgrany do bramki

Kod: Zaznacz cały

/*
Bramka RB-10G
Copyright (C) 2019 Robert Błaszczak

Niniejszy program jest wolnym oprogramowaniem; możesz go 
rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundację Wolnego
Oprogramowania - według wersji 2-giej tej Licencji lub którejś
z późniejszych wersji. 
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on 
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej 
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH 
ZASTOSOWAŃ. W celu uzyskania bliższych informacji - Powszechna 
Licencja Publiczna GNU. 
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz 
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
*/

#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69

#define NODEID 1                          //Unikalny numer bramki (1 - 254).
#define NETWORKID 100                     //Numer sieci (1 - 254) w której działą bramka SUPLA oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define FREQUENCY RF69_868MHZ             //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW                  //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "qwertyuiopasdfgh"     //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce SUPLA i we wszystkich transmiterach.
#define ENABLE_ATC                        //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).

#define SERIAL_BAUD 115200                //Prędkość transmisji portu szeregowego.

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

#define SUPLA_SERVER "svrx.supla.org"
#define LOCATION_ID xxxx
#define LOCATION_PASSWORD "xxxx"
// pobierz identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadź go poniżej
#define GUID {0x4E,0x20,0xAA,0x53,0xCE,0x09,0x1E,0xC1,0xB1,0x8D,0x9C,0x8B,0x59,0xDB,0x78,0x46};

RFM69_ATC radio(D8, D2, false);
bool promiscuousMode = false;

const unsigned long period = 600000;      //Czas (10 minut) po którym bramka uznaje brak odczytu z transmitera i ustawia wartości wysyłane do Supla Cloud na 0.
double temperature = 0.0;
double humidity = 0.0;
double pressure = 0.0;
double lux = 0.0;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long RFNodesCount = 0;

typedef struct {
  int nodeid;
  int channelNumber;
  double temperature;
  double humidity;
  double pressure;
  double lux;
  double batteryLevel;
  unsigned long lastContact;
} RF_TemperatureandHumidityNode;

RF_TemperatureandHumidityNode RFNodes[6];


void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == channelNumber)
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2 )
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}

void setup() {
  Serial.begin(SERIAL_BAUD);
  
   SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   
   
   
  char guid[SUPLA_GUID_SIZE] = GUID;
  uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
  SuplaDevice.setName("BRAMKA RB-10G");
  SuplaDevice.begin(guid, mac, SUPLA_SERVER, LOCATION_ID, LOCATION_PASSWORD);
  
  radio.initialize(FREQUENCY,NODEID,NETWORKID);

#ifdef IS_RFM69HW_HCW
  radio.setHighPower();
#endif

  radio.encrypt(ENCRYPTKEY);
  radio.promiscuous(promiscuousMode);

  char buff[105];
  sprintf(buff, "BRAMKA RB-10G. Start komunikacji radiowej na częstotliwości %d MHz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  Serial.println(buff);
}

byte ackCount = 0;
uint32_t packetCount = 0;

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void readRadioData() {

  String value = "";
  if (radio.receiveDone())
  {
    int foundIdx = -1;

    for (int i = 0; i < RFNodesCount; i++)
      if (RFNodes[i].nodeid == radio.SENDERID)
      {
        foundIdx = i;
        break;
      }

    Serial.println("Odbieram dane...");
    if (foundIdx == -1)
    {
      if (RFNodesCount < 6)
      {
        Serial.println("Znalazłem nowy transmiter. Dodaję go do SUPLA Cloud");
        RFNodes[RFNodesCount].nodeid = radio.SENDERID;
        RFNodes[RFNodesCount].lastContact = millis();
        RFNodes[RFNodesCount].channelNumber = radio.SENDERID - 1;
        RFNodes[RFNodesCount].temperature = 0.0;
        RFNodes[RFNodesCount].humidity = 0.0;
        RFNodes[RFNodesCount].pressure = 0.0;
        RFNodes[RFNodesCount].lux = 0.0;
        RFNodes[RFNodesCount].batteryLevel = 0;
        
        foundIdx = RFNodesCount;
        RFNodesCount++;
      } else {
        Serial.println("Maksymalna ilość transmiterów przekroczona!");
        foundIdx = 0;
      }
    } else
    {
      RFNodes[foundIdx].temperature = 0.0;
    }

    Serial.print("#[");
    Serial.print(++packetCount);
    Serial.print(']');
    Serial.print('['); Serial.print(radio.SENDERID, DEC); Serial.print("] ");

    value = "";
    for (byte i = 0; i < radio.DATALEN; i++)
      if (radio.DATA[i] != ' ')
        value += (char)radio.DATA[i];

    Serial.println(value);

    String tempStr = getValue(value, '|', 0);
    String humStr = getValue(value, '|', 1);
    String presStr = getValue(value, '|', 2);
    String luxStr = getValue(value, '|', 3);
    String battLevelStr = getValue(value, '|', 4);

    Serial.print("Temperatura: ");
    Serial.println(tempStr);
    Serial.print("Wilgotność: ");
    Serial.println(humStr);
    Serial.print("Ciśnienie: ");
    Serial.println(presStr);
    Serial.print("Natężenie światła: ");
    Serial.println(luxStr);
    Serial.print("Poziom baterii: ");
    Serial.println(battLevelStr);

    RFNodes[foundIdx].temperature = tempStr.toFloat();
    RFNodes[foundIdx].humidity = humStr.toFloat();
    RFNodes[foundIdx].pressure = presStr.toFloat();
    RFNodes[foundIdx].lux = luxStr.toFloat();
    RFNodes[foundIdx].batteryLevel = battLevelStr.toFloat();
    RFNodes[foundIdx].lastContact = millis();

    Serial.print("Poziom sygnału transmitera [RX_RSSI]:"); Serial.print(radio.RSSI); Serial.print(" dBm");

    if (radio.ACKRequested())
    {
      byte theNodeID = radio.SENDERID;
      radio.sendACK();
      
      if (ackCount++ % 3 == 0)
      {
        Serial.print(" ACK TEST - Transmiter ");
        Serial.print(theNodeID);
        delay(5);
        radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0);
      }
    }
    Blink(LED_BUILTIN, 100);
    Serial.println();
    Serial.println();
  }

  for (int i = 0; i < RFNodesCount; i++)
  {
    if (millis() - RFNodes[i].lastContact >= period)
    {
      RFNodes[i].temperature = -375;
      RFNodes[i].humidity = -1;
      RFNodes[i].pressure = -10;
      RFNodes[i].lux = 0;
      RFNodes[i].batteryLevel = 0;
      Serial.print("Brak odczytu z czujnika ");
      Serial.println (RFNodes[i].nodeid);
    };
  }
}

void Blink(byte PIN, int DELAY_MS)
{
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN,LOW);
  delay(DELAY_MS);
  digitalWrite(PIN,HIGH);
}

void loop() {
  readRadioData();
  SuplaDevice.iterate();
}
Jak mieszkasz w mieście to te 3lx jak dla mnie ok. Musiałbyś zgasić latarnie w pobliżu Ew zasłonić Ksieżyc :D
jak coś nie działa to włącz zasilanie.....
dogu18
Posty: 257
Rejestracja: czw paź 11, 2018 8:35 pm

QLQ pisze: czw wrz 03, 2020 6:38 pm
dogu18 pisze: śr wrz 02, 2020 9:18 pm Mam jeszcze jeden problem. czujnik natężenia światła w nocy pokazuje mi 3 luxy a powinno być 0 (chyba)
używam czujnika bh1750 z kopułka.
Problem mam też z wilgotnością po często pokazuje 100% ale to chyba wina czujnika

to jest kod wgrany do bramki

Kod: Zaznacz cały

/*
Bramka RB-10G
Copyright (C) 2019 Robert Błaszczak

Niniejszy program jest wolnym oprogramowaniem; możesz go 
rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundację Wolnego
Oprogramowania - według wersji 2-giej tej Licencji lub którejś
z późniejszych wersji. 
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on 
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej 
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH 
ZASTOSOWAŃ. W celu uzyskania bliższych informacji - Powszechna 
Licencja Publiczna GNU. 
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz 
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
*/

#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69

#define NODEID 1                          //Unikalny numer bramki (1 - 254).
#define NETWORKID 100                     //Numer sieci (1 - 254) w której działą bramka SUPLA oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define FREQUENCY RF69_868MHZ             //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW                  //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "qwertyuiopasdfgh"     //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce SUPLA i we wszystkich transmiterach.
#define ENABLE_ATC                        //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).

#define SERIAL_BAUD 115200                //Prędkość transmisji portu szeregowego.

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

#define SUPLA_SERVER "svrx.supla.org"
#define LOCATION_ID xxxx
#define LOCATION_PASSWORD "xxxx"
// pobierz identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadź go poniżej
#define GUID {0x4E,0x20,0xAA,0x53,0xCE,0x09,0x1E,0xC1,0xB1,0x8D,0x9C,0x8B,0x59,0xDB,0x78,0x46};

RFM69_ATC radio(D8, D2, false);
bool promiscuousMode = false;

const unsigned long period = 600000;      //Czas (10 minut) po którym bramka uznaje brak odczytu z transmitera i ustawia wartości wysyłane do Supla Cloud na 0.
double temperature = 0.0;
double humidity = 0.0;
double pressure = 0.0;
double lux = 0.0;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long RFNodesCount = 0;

typedef struct {
  int nodeid;
  int channelNumber;
  double temperature;
  double humidity;
  double pressure;
  double lux;
  double batteryLevel;
  unsigned long lastContact;
} RF_TemperatureandHumidityNode;

RF_TemperatureandHumidityNode RFNodes[6];


void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == channelNumber)
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2 )
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}

void setup() {
  Serial.begin(SERIAL_BAUD);
  
   SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   
   
   
  char guid[SUPLA_GUID_SIZE] = GUID;
  uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
  SuplaDevice.setName("BRAMKA RB-10G");
  SuplaDevice.begin(guid, mac, SUPLA_SERVER, LOCATION_ID, LOCATION_PASSWORD);
  
  radio.initialize(FREQUENCY,NODEID,NETWORKID);

#ifdef IS_RFM69HW_HCW
  radio.setHighPower();
#endif

  radio.encrypt(ENCRYPTKEY);
  radio.promiscuous(promiscuousMode);

  char buff[105];
  sprintf(buff, "BRAMKA RB-10G. Start komunikacji radiowej na częstotliwości %d MHz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  Serial.println(buff);
}

byte ackCount = 0;
uint32_t packetCount = 0;

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void readRadioData() {

  String value = "";
  if (radio.receiveDone())
  {
    int foundIdx = -1;

    for (int i = 0; i < RFNodesCount; i++)
      if (RFNodes[i].nodeid == radio.SENDERID)
      {
        foundIdx = i;
        break;
      }

    Serial.println("Odbieram dane...");
    if (foundIdx == -1)
    {
      if (RFNodesCount < 6)
      {
        Serial.println("Znalazłem nowy transmiter. Dodaję go do SUPLA Cloud");
        RFNodes[RFNodesCount].nodeid = radio.SENDERID;
        RFNodes[RFNodesCount].lastContact = millis();
        RFNodes[RFNodesCount].channelNumber = radio.SENDERID - 1;
        RFNodes[RFNodesCount].temperature = 0.0;
        RFNodes[RFNodesCount].humidity = 0.0;
        RFNodes[RFNodesCount].pressure = 0.0;
        RFNodes[RFNodesCount].lux = 0.0;
        RFNodes[RFNodesCount].batteryLevel = 0;
        
        foundIdx = RFNodesCount;
        RFNodesCount++;
      } else {
        Serial.println("Maksymalna ilość transmiterów przekroczona!");
        foundIdx = 0;
      }
    } else
    {
      RFNodes[foundIdx].temperature = 0.0;
    }

    Serial.print("#[");
    Serial.print(++packetCount);
    Serial.print(']');
    Serial.print('['); Serial.print(radio.SENDERID, DEC); Serial.print("] ");

    value = "";
    for (byte i = 0; i < radio.DATALEN; i++)
      if (radio.DATA[i] != ' ')
        value += (char)radio.DATA[i];

    Serial.println(value);

    String tempStr = getValue(value, '|', 0);
    String humStr = getValue(value, '|', 1);
    String presStr = getValue(value, '|', 2);
    String luxStr = getValue(value, '|', 3);
    String battLevelStr = getValue(value, '|', 4);

    Serial.print("Temperatura: ");
    Serial.println(tempStr);
    Serial.print("Wilgotność: ");
    Serial.println(humStr);
    Serial.print("Ciśnienie: ");
    Serial.println(presStr);
    Serial.print("Natężenie światła: ");
    Serial.println(luxStr);
    Serial.print("Poziom baterii: ");
    Serial.println(battLevelStr);

    RFNodes[foundIdx].temperature = tempStr.toFloat();
    RFNodes[foundIdx].humidity = humStr.toFloat();
    RFNodes[foundIdx].pressure = presStr.toFloat();
    RFNodes[foundIdx].lux = luxStr.toFloat();
    RFNodes[foundIdx].batteryLevel = battLevelStr.toFloat();
    RFNodes[foundIdx].lastContact = millis();

    Serial.print("Poziom sygnału transmitera [RX_RSSI]:"); Serial.print(radio.RSSI); Serial.print(" dBm");

    if (radio.ACKRequested())
    {
      byte theNodeID = radio.SENDERID;
      radio.sendACK();
      
      if (ackCount++ % 3 == 0)
      {
        Serial.print(" ACK TEST - Transmiter ");
        Serial.print(theNodeID);
        delay(5);
        radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0);
      }
    }
    Blink(LED_BUILTIN, 100);
    Serial.println();
    Serial.println();
  }

  for (int i = 0; i < RFNodesCount; i++)
  {
    if (millis() - RFNodes[i].lastContact >= period)
    {
      RFNodes[i].temperature = -375;
      RFNodes[i].humidity = -1;
      RFNodes[i].pressure = -10;
      RFNodes[i].lux = 0;
      RFNodes[i].batteryLevel = 0;
      Serial.print("Brak odczytu z czujnika ");
      Serial.println (RFNodes[i].nodeid);
    };
  }
}

void Blink(byte PIN, int DELAY_MS)
{
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN,LOW);
  delay(DELAY_MS);
  digitalWrite(PIN,HIGH);
}

void loop() {
  readRadioData();
  SuplaDevice.iterate();
}
Jak mieszkasz w mieście to te 3lx jak dla mnie ok. Musiałbyś zgasić latarnie w pobliżu Ew zasłonić Ksieżyc :D
Zrobiłem test i po całkowitym zaciemnieniu dalej są 3 luxy. nie wiem czy to nie wina innego czujnika bo bh1750 na pcb pokazywał zero a ten z kopułka pokazuje 3
Pozdrawiam
Grzegorz Labudda
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

dogu18 pisze: czw wrz 03, 2020 8:50 pm
QLQ pisze: czw wrz 03, 2020 6:38 pm
dogu18 pisze: śr wrz 02, 2020 9:18 pm Mam jeszcze jeden problem. czujnik natężenia światła w nocy pokazuje mi 3 luxy a powinno być 0 (chyba)
używam czujnika bh1750 z kopułka.
Problem mam też z wilgotnością po często pokazuje 100% ale to chyba wina czujnika

to jest kod wgrany do bramki

Kod: Zaznacz cały

/*
Bramka RB-10G
Copyright (C) 2019 Robert Błaszczak

Niniejszy program jest wolnym oprogramowaniem; możesz go 
rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundację Wolnego
Oprogramowania - według wersji 2-giej tej Licencji lub którejś
z późniejszych wersji. 
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on 
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej 
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH 
ZASTOSOWAŃ. W celu uzyskania bliższych informacji - Powszechna 
Licencja Publiczna GNU. 
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz 
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
*/

#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69

#define NODEID 1                          //Unikalny numer bramki (1 - 254).
#define NETWORKID 100                     //Numer sieci (1 - 254) w której działą bramka SUPLA oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define FREQUENCY RF69_868MHZ             //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW                  //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "qwertyuiopasdfgh"     //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce SUPLA i we wszystkich transmiterach.
#define ENABLE_ATC                        //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).

#define SERIAL_BAUD 115200                //Prędkość transmisji portu szeregowego.

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

#define SUPLA_SERVER "svrx.supla.org"
#define LOCATION_ID xxxx
#define LOCATION_PASSWORD "xxxx"
// pobierz identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadź go poniżej
#define GUID {0x4E,0x20,0xAA,0x53,0xCE,0x09,0x1E,0xC1,0xB1,0x8D,0x9C,0x8B,0x59,0xDB,0x78,0x46};

RFM69_ATC radio(D8, D2, false);
bool promiscuousMode = false;

const unsigned long period = 600000;      //Czas (10 minut) po którym bramka uznaje brak odczytu z transmitera i ustawia wartości wysyłane do Supla Cloud na 0.
double temperature = 0.0;
double humidity = 0.0;
double pressure = 0.0;
double lux = 0.0;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long RFNodesCount = 0;

typedef struct {
  int nodeid;
  int channelNumber;
  double temperature;
  double humidity;
  double pressure;
  double lux;
  double batteryLevel;
  unsigned long lastContact;
} RF_TemperatureandHumidityNode;

RF_TemperatureandHumidityNode RFNodes[6];


void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == channelNumber)
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2 )
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}

void setup() {
  Serial.begin(SERIAL_BAUD);
  
   SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   
   
   
  char guid[SUPLA_GUID_SIZE] = GUID;
  uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
  SuplaDevice.setName("BRAMKA RB-10G");
  SuplaDevice.begin(guid, mac, SUPLA_SERVER, LOCATION_ID, LOCATION_PASSWORD);
  
  radio.initialize(FREQUENCY,NODEID,NETWORKID);

#ifdef IS_RFM69HW_HCW
  radio.setHighPower();
#endif

  radio.encrypt(ENCRYPTKEY);
  radio.promiscuous(promiscuousMode);

  char buff[105];
  sprintf(buff, "BRAMKA RB-10G. Start komunikacji radiowej na częstotliwości %d MHz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  Serial.println(buff);
}

byte ackCount = 0;
uint32_t packetCount = 0;

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void readRadioData() {

  String value = "";
  if (radio.receiveDone())
  {
    int foundIdx = -1;

    for (int i = 0; i < RFNodesCount; i++)
      if (RFNodes[i].nodeid == radio.SENDERID)
      {
        foundIdx = i;
        break;
      }

    Serial.println("Odbieram dane...");
    if (foundIdx == -1)
    {
      if (RFNodesCount < 6)
      {
        Serial.println("Znalazłem nowy transmiter. Dodaję go do SUPLA Cloud");
        RFNodes[RFNodesCount].nodeid = radio.SENDERID;
        RFNodes[RFNodesCount].lastContact = millis();
        RFNodes[RFNodesCount].channelNumber = radio.SENDERID - 1;
        RFNodes[RFNodesCount].temperature = 0.0;
        RFNodes[RFNodesCount].humidity = 0.0;
        RFNodes[RFNodesCount].pressure = 0.0;
        RFNodes[RFNodesCount].lux = 0.0;
        RFNodes[RFNodesCount].batteryLevel = 0;
        
        foundIdx = RFNodesCount;
        RFNodesCount++;
      } else {
        Serial.println("Maksymalna ilość transmiterów przekroczona!");
        foundIdx = 0;
      }
    } else
    {
      RFNodes[foundIdx].temperature = 0.0;
    }

    Serial.print("#[");
    Serial.print(++packetCount);
    Serial.print(']');
    Serial.print('['); Serial.print(radio.SENDERID, DEC); Serial.print("] ");

    value = "";
    for (byte i = 0; i < radio.DATALEN; i++)
      if (radio.DATA[i] != ' ')
        value += (char)radio.DATA[i];

    Serial.println(value);

    String tempStr = getValue(value, '|', 0);
    String humStr = getValue(value, '|', 1);
    String presStr = getValue(value, '|', 2);
    String luxStr = getValue(value, '|', 3);
    String battLevelStr = getValue(value, '|', 4);

    Serial.print("Temperatura: ");
    Serial.println(tempStr);
    Serial.print("Wilgotność: ");
    Serial.println(humStr);
    Serial.print("Ciśnienie: ");
    Serial.println(presStr);
    Serial.print("Natężenie światła: ");
    Serial.println(luxStr);
    Serial.print("Poziom baterii: ");
    Serial.println(battLevelStr);

    RFNodes[foundIdx].temperature = tempStr.toFloat();
    RFNodes[foundIdx].humidity = humStr.toFloat();
    RFNodes[foundIdx].pressure = presStr.toFloat();
    RFNodes[foundIdx].lux = luxStr.toFloat();
    RFNodes[foundIdx].batteryLevel = battLevelStr.toFloat();
    RFNodes[foundIdx].lastContact = millis();

    Serial.print("Poziom sygnału transmitera [RX_RSSI]:"); Serial.print(radio.RSSI); Serial.print(" dBm");

    if (radio.ACKRequested())
    {
      byte theNodeID = radio.SENDERID;
      radio.sendACK();
      
      if (ackCount++ % 3 == 0)
      {
        Serial.print(" ACK TEST - Transmiter ");
        Serial.print(theNodeID);
        delay(5);
        radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0);
      }
    }
    Blink(LED_BUILTIN, 100);
    Serial.println();
    Serial.println();
  }

  for (int i = 0; i < RFNodesCount; i++)
  {
    if (millis() - RFNodes[i].lastContact >= period)
    {
      RFNodes[i].temperature = -375;
      RFNodes[i].humidity = -1;
      RFNodes[i].pressure = -10;
      RFNodes[i].lux = 0;
      RFNodes[i].batteryLevel = 0;
      Serial.print("Brak odczytu z czujnika ");
      Serial.println (RFNodes[i].nodeid);
    };
  }
}

void Blink(byte PIN, int DELAY_MS)
{
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN,LOW);
  delay(DELAY_MS);
  digitalWrite(PIN,HIGH);
}

void loop() {
  readRadioData();
  SuplaDevice.iterate();
}
Jak mieszkasz w mieście to te 3lx jak dla mnie ok. Musiałbyś zgasić latarnie w pobliżu Ew zasłonić Ksieżyc :D
Zrobiłem test i po całkowitym zaciemnieniu dalej są 3 luxy. nie wiem czy to nie wina innego czujnika bo bh1750 na pcb pokazywał zero a ten z kopułka pokazuje 3
Moj obecnie pokazuje 0.1. Ale ja mam MAX44009.
20200903_232049.jpg
20200903_232049.jpg (36.45 KiB) Przejrzano 2120 razy
jak coś nie działa to włącz zasilanie.....
Pier
Posty: 45
Rejestracja: śr lut 26, 2020 10:26 am

Cześć.
Jam mniemam urządzonka popracowały już trochę u Was a więc jest czas na podsumowania.
Jak jest u Was z wytrzymałością baterii? Jak zachowuje się pomiar baterii? No i jak u Was wygląda pomiar wilgotności?
Ja mam takie spostrzeżenia.
Dwie baterie padły bez ostrzeżenia. Jedna po ok 4 miesiącach druga po ok 6. Nie wiem czy skończyły się w naturalnym procesie czy coś innego się stało. Pomiar baterii w tych dwóch przypadkach nic nie wskazywał, cały czas był poziom maksymalny. No może ostatni pomiar spadł na 2 później już zgon baterii. Tak więc coś jest nie teges z pomiarem.
Pomiar wilgotności przez Si7021 porażka. No może to nie jego wina bo nadaje się tylko do 80%. Jeśli złapie wartość powyżej to wskazuje dużo zawyżone wartości. Zresztą blisko 80% zawyża pomiary o ok 10%. Ogólnie słabo się sprawuje. Temperatura zdaje się być ok.
Pier
Posty: 45
Rejestracja: śr lut 26, 2020 10:26 am

Temat umarł czy wszyscy na wirusa chorują? Nikt nic nie napisze?
Awatar użytkownika
Robert Błaszczak
Posty: 3942
Rejestracja: sob gru 22, 2018 8:55 pm
Lokalizacja: Zielona Góra
Kontakt:

Piszę za siebie ale myślę że inni postąpili podobnie.
Ja zrezygnowałem z tego rozwiązania ze względu na zdecydowanie tańsze Xiaomi LYWSD03MMC.
Pozdrawiam
Robert Błaszczak


Moja prywatna strona: www.blaszczak.pl
Pier
Posty: 45
Rejestracja: śr lut 26, 2020 10:26 am

Robert Błaszczak pisze: pt paź 23, 2020 5:35 am Piszę za siebie ale myślę że inni postąpili podobnie.
Ja zrezygnowałem z tego rozwiązania ze względu na zdecydowanie tańsze Xiaomi LYWSD03MMC.
No to jak? Zrobiłeś RB-10 Stwierdziłeś że drogo wyszło Wyrzuciłeś do kosza i Kupiłeś Xiaomi? To chyba nie jest tańsze rozwiązanie?

Ja zrobiłem 5 transmiterów i używam, ale jak pisałem największą ich bolączką jest ten felerny pomiar baterii. Z wilgotnością sobie poradzę bo już zamówiłem HTU21d.
Może Doradzisz coś w kwestii pomiaru baterii?
ODPOWIEDZ

Wróć do „Projekty użytkowników”