Masz na myśli to pole informacyjne przy kanale? Np. ze stanem baterii?
Mały, bezprzewodowy czujnik temperatury na radiu
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
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
Grzegorz Labudda
Jak mieszkasz w mieście to te 3lx jak dla mnie ok. Musiałbyś zgasić latarnie w pobliżu Ew zasłonić Ksieżycdogu18 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 coś nie działa to włącz zasilanie.....
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 3QLQ pisze: ↑czw wrz 03, 2020 6:38 pmJak mieszkasz w mieście to te 3lx jak dla mnie ok. Musiałbyś zgasić latarnie w pobliżu Ew zasłonić Ksieżycdogu18 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(); }
Pozdrawiam
Grzegorz Labudda
Grzegorz Labudda
Moj obecnie pokazuje 0.1. Ale ja mam MAX44009.dogu18 pisze: ↑czw wrz 03, 2020 8:50 pmZrobił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 3QLQ pisze: ↑czw wrz 03, 2020 6:38 pmJak mieszkasz w mieście to te 3lx jak dla mnie ok. Musiałbyś zgasić latarnie w pobliżu Ew zasłonić Ksieżycdogu18 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 coś nie działa to włącz zasilanie.....
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.
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.
- Robert Błaszczak
- Posty: 4008
- 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.
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
Robert Błaszczak
Moja prywatna strona: www.blaszczak.pl
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?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.
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?