Mały, bezprzewodowy czujnik temperatury na radiu
-
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
Ja mam aktualnie cztery kanały T/H. Kod pisany jest na 6 transmiterów, ale modyfikację bibliotek SuplaDevice [#define SRPC_QUEUE_SIZE 10]zrobiłem na 10 urządzeń.
Pozdrawiam
Robert Błaszczak
Moja prywatna strona: www.blaszczak.pl
Robert Błaszczak
Moja prywatna strona: www.blaszczak.pl
-
krycha88
- Posts: 5575
- Joined: Fri Nov 16, 2018 7:25 am
- Been thanked: 5 times
Dzięki, jest to bardzo dobra dla mnie wiadomośćRobert Błaszczak wrote: Tue Oct 08, 2019 7:19 am Ja mam aktualnie cztery kanały T/H. Kod pisany jest na 6 transmiterów, ale modyfikację bibliotek SuplaDevice [#define SRPC_QUEUE_SIZE 10]zrobiłem na 10 urządzeń.
https://gui-generic-builder.supla.io/
-
klew
- Posts: 13908
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 134 times
- Been thanked: 137 times
Bardzo fajny projekt i wykonanie.
Odnośnie kodu, to zmieniłbym tylko wartość temperatury w przypadku braku czujnika na -275 . Taka wartość jest używana jako "błąd odczytu". Wartość "0" może być czasami myląca
.
Wypadałoby też wilgotność zainicjalizować na "-1" przy braku czujnika.
To samo można wrzucić we fragmencie kodu z "brakiem odczytu czujnika"
Odnośnie ilości urządzeń, to ogólnie nie ma problemu, aby zrobić tutaj więcej niż 10.
Odnośnie kodu, to zmieniłbym tylko wartość temperatury w przypadku braku czujnika na -275 . Taka wartość jest używana jako "błąd odczytu". Wartość "0" może być czasami myląca
Wypadałoby też wilgotność zainicjalizować na "-1" przy braku czujnika.
To samo można wrzucić we fragmencie kodu z "brakiem odczytu czujnika"
Odnośnie ilości urządzeń, to ogólnie nie ma problemu, aby zrobić tutaj więcej niż 10.
Najlepsze suple dla Twojego domu 
-
QLQ
- Posts: 2512
- Joined: Sun Sep 03, 2017 9:13 am
Tak sobie myślę , że ta bramka powinna jak już powstała być uniwersalna dla innych urządzeń typu np kontrakton czy inny element bezprzewodowy systemu Supla. Kierunek jest dobry. Jeszcze raz GRATULUJĘ i zazdraszczam
wykoniania @Robert
jak coś nie działa to włącz zasilanie.....
-
QLQ
- Posts: 2512
- Joined: Sun Sep 03, 2017 9:13 am
Hej !Robert Błaszczak wrote: Tue Oct 08, 2019 7:19 am Ja mam aktualnie cztery kanały T/H. Kod pisany jest na 6 transmiterów, ale modyfikację bibliotek SuplaDevice [#define SRPC_QUEUE_SIZE 10]zrobiłem na 10 urządzeń.
Pozwoliłem sobie podłączyć BME280 oraz BH1750 zamiast Si7021. Działa. Wieżyczka radiacyjna stacji pogodowej będzie na sprzęcie Made in @Robert Błaszczak bezprzewodowo
Szkoda , że nikt nie podjął rękawicy i nie rozwija tej bramki dalej
Na razie wersja robocza z T, H, P, LUX z bme280 i BH1750:
PLIK z kodem nadajnika ino: .
Wieczorem(czyt.: w nocy/rano ) jak się uda dorobię plik odbiornika
EDIT 20.16: nam już zrobine- odbiornik bramka odbiera ładnie dane i widać to na konsoli ale nie wysyła do Cloud
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
-
QLQ
- Posts: 2512
- Joined: Sun Sep 03, 2017 9:13 am
AAAAAAAA!! Dlaczego nie przesyła ciśnienia ?? temp i wilgotność działa.
Co tu jest źle ?
Co tu jest źle ?
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 "svr5.supla.org"
#define LOCATION_ID xxx
#define LOCATION_PASSWORD "xxx"
// 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)
{
pressure = RFNodes[i].pressure;
}
return pressure;
}
void setup() {
Serial.begin(SERIAL_BAUD);
//SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
//SuplaDevice.setPressureCallback(&get_pressure);
SuplaDevice.addDHT22();
SuplaDevice.addPressureSensor(); //Pressure
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 = -10000;
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.....
-
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
Hej,
Wydaje mi się, że wszystkie wartości z odczytu z nadajnika 1 są przypisywane do SuplaDevice.addDHT22()
Do SuplaDevice.addPressureSensor(); przypisałaby się pierwsza wartość z drugiego nadajnika.
Wydaje mi się, że wszystkie wartości z odczytu z nadajnika 1 są przypisywane do SuplaDevice.addDHT22()
Do SuplaDevice.addPressureSensor(); przypisałaby się pierwsza wartość z drugiego nadajnika.
Pozdrawiam
Robert Błaszczak
Moja prywatna strona: www.blaszczak.pl
Robert Błaszczak
Moja prywatna strona: www.blaszczak.pl
-
klew
- Posts: 13908
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 134 times
- Been thanked: 137 times
Czemu przypisanie callbacków masz wykomentowane? Bez przypisania callbacku nawet temp i wilg nie powinny działaćQLQ wrote: Fri Oct 18, 2019 9:14 pm AAAAAAAA!! Dlaczego nie przesyła ciśnienia ?? temp i wilgotność działa.
Co tu jest źle ?
Kod, który wkleiłeś zakłada, że jeden czujnik to jeden kanał. A "addDHT" + "addPressure" to dwa kanały.
RFNodes trzyma czujnik z temp, wilg, pressure - wszystko przypisane do jednego channelNumber
Jeśli masz podłączone tylko czujniki mierzące temp, wilg i ciśnienie, to zrób callbacki tak:
Code: Select all
void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {
for (int i = 0; i < RFNodesCount; i++)
if (RFNodes[i].channelNumber == channelNumber/2 )
{
*temp = RFNodes[i].temperature;
*humidity = RFNodes[i].humidity;
}
}
Code: Select all
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;
}
Code: Select all
SuplaDevice.addDHT22();
SuplaDevice.addPressureSensor(); //Pressure
SuplaDevice.addDHT22();
SuplaDevice.addPressureSensor(); //Pressure
// itd...
Najlepsze suple dla Twojego domu 
-
QLQ
- Posts: 2512
- Joined: Sun Sep 03, 2017 9:13 am
klew wrote: Fri Oct 18, 2019 10:14 pmCzemu przypisanie callbacków masz wykomentowane? Bez przypisania callbacku nawet temp i wilg nie powinny działaćQLQ wrote: Fri Oct 18, 2019 9:14 pm AAAAAAAA!! Dlaczego nie przesyła ciśnienia ?? temp i wilgotność działa.
Co tu jest źle ?
Kod, który wkleiłeś zakłada, że jeden czujnik to jeden kanał. A "addDHT" + "addPressure" to dwa kanały.
RFNodes trzyma czujnik z temp, wilg, pressure - wszystko przypisane do jednego channelNumber
Jeśli masz podłączone tylko czujniki mierzące temp, wilg i ciśnienie, to zrób callbacki tak:Code: Select all
void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) { for (int i = 0; i < RFNodesCount; i++) if (RFNodes[i].channelNumber == channelNumber/2 ) { *temp = RFNodes[i].temperature; *humidity = RFNodes[i].humidity; } }Taki brzydki hak powinien tutaj pomóc. Tylko uważaj jeśli będziesz dodawał więcej czujników. Wtedy musisz zachować kolejność:Code: Select all
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; }Code: Select all
SuplaDevice.addDHT22(); SuplaDevice.addPressureSensor(); //Pressure SuplaDevice.addDHT22(); SuplaDevice.addPressureSensor(); //Pressure // itd...
DZIAŁA !!!!
jak coś nie działa to włącz zasilanie.....
-
QLQ
- Posts: 2512
- Joined: Sun Sep 03, 2017 9:13 am
Jak obiecałem pliki z obsługą BME280 oraz BH1750.
Filmik z działania: https://youtu.be/e_SsksKYvMI
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
