Mały, bezprzewodowy czujnik temperatury na radiu

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

dogu18 wrote: Mon Aug 31, 2020 4:39 pm
dogu18 wrote: Wed Aug 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?
Najlepsze suple dla Twojego domu :mrgreen:
dogu18
Posts: 259
Joined: Thu Oct 11, 2018 8:35 pm

Post

klew wrote: Mon Aug 31, 2020 9:33 pm
dogu18 wrote: Mon Aug 31, 2020 4:39 pm
dogu18 wrote: Wed Aug 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
Posts: 259
Joined: Thu Oct 11, 2018 8:35 pm

Post

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

Code: Select all

/*
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
QLQ
Posts: 2512
Joined: Sun Sep 03, 2017 9:13 am

Post

dogu18 wrote: Wed Sep 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

Code: Select all

/*
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
Posts: 259
Joined: Thu Oct 11, 2018 8:35 pm

Post

QLQ wrote: Thu Sep 03, 2020 6:38 pm
dogu18 wrote: Wed Sep 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

Code: Select all

/*
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
QLQ
Posts: 2512
Joined: Sun Sep 03, 2017 9:13 am

Post

dogu18 wrote: Thu Sep 03, 2020 8:50 pm
QLQ wrote: Thu Sep 03, 2020 6:38 pm
dogu18 wrote: Wed Sep 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

Code: Select all

/*
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
jak coś nie działa to włącz zasilanie.....
Pier
Posts: 45
Joined: Wed Feb 26, 2020 10:26 am

Post

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
Posts: 45
Joined: Wed Feb 26, 2020 10:26 am

Post

Temat umarł czy wszyscy na wirusa chorują? Nikt nic nie napisze?
User avatar
Robert Błaszczak
Posts: 5222
Joined: Sat Dec 22, 2018 8:55 pm
Location: Zielona Góra
Has thanked: 37 times
Been thanked: 27 times

Post

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
Posts: 45
Joined: Wed Feb 26, 2020 10:26 am

Post

Robert Błaszczak wrote: Fri Oct 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?

Return to “Projekty użytkowników”