Mały, bezprzewodowy czujnik temperatury na radiu

Awatar użytkownika
dzikusk
Posty: 204
Rejestracja: wt maja 01, 2018 7:24 pm
Lokalizacja: Bolesławiec

Ja szukam pomysłu na zainstalowanie i zasilenie w jakiś sposób czujników temperatury z czujek od alarmu. Czy ktoś może mnie naprowadzić na właściwy tor? Oczywiście też bym chętnie kupił jakiegoś gotowca od was chłopaki :D
Mój czujnik pogodowy
https://krasnikgorny.aqi.eco/pl
Awatar użytkownika
makrz
Posty: 395
Rejestracja: wt lis 27, 2018 1:43 pm
Lokalizacja: Opole

@Robert Błaszczak może popełnił byś wsad dla HTU21?
A może ktoś inny zrobi?
Awatar użytkownika
Robert Błaszczak
Posty: 3970
Rejestracja: sob gru 22, 2018 8:55 pm
Lokalizacja: Zielona Góra
Kontakt:

Nie posiadam tego czujnika, ale powinno działać:

Kod: Zaznacz cały

#include <Wire.h>                         //Zawarty w Arduino IDE (www.arduino.cc)
#include <SPI.h>                          //Zawarty w Arduino IDE (www.arduino.cc)
#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69
#include <SPIFlash.h>                     //Pobierz z: https://github.com/lowpowerlab/spiflash
#include <Adafruit_HTU21DF.h>             //Pobierz z: https://github.com/adafruit/Adafruit_HTU21DF_Library
#include <LowPower.h>                     //Pobierz z: https://github.com/lowpowerlab/lowpower

#define NODEID 1                          // Unikalny numer transmitera (1 - 6) pracującego w sieci o takim samym ID, który jest jednocześnie numerem czujnika w SUPLA Cloud.
#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 GATEWAYID 1                       // Numer bramki (0 - 254), do której łączy się transmiter.

#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 "xxxxxxxxxxxxxxxx"     //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 ATC_RSSI -80                      //Poziom sygnału radiowego (odcięcie) dla ATC.

period_t sleepTime = SLEEP_4S;            //Zdefiniowany czas uśpienia transmitera 4 sekundy (zgodnie z LowPower library (LowPower.h)).
#define SEND_LOOPS 13                     //Ilość pętli uśpienia transmitera (np. 4 sekundy * 15 = 60 sekund). Ilość pętli należy dobrać do konkretnej płytki Monteino.
#define BATT_READ_LOOPS SEND_LOOPS * 30   //Ilość pętli, po których wykonywany jest pomiar napięcia na baterii (np. 60 sekund * 30 = 30 minut).

//#define SERIAL_ENABLE                   //Usuń znaki komentarza '//' aby włączyć wyświetlanie na porcie szeregowym.

#define BATT0 730                         //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 0 (3.10V).
#define BATT1 1002                        //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 1 (3.20V).
#define BATT2 1008                        //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 2 (3.25V).

#ifdef SERIAL_ENABLE
  #define SERIAL_BAUD 115200
  #define SP(input) {Serial.print(input);}
  #define SPln(input) {Serial.println(input);}
  #define SFLUSH() {Serial.flush();}
#else
  #define SERIAL_BAUD 115200
  #define SP(input);
  #define SPln(input);
  #define SFLUSH();
#endif

RFM69_ATC radio;
SPIFlash flash(SS_FLASHMEM, 0xEF30);
Adafruit_HTU21DF HTU21 = Adafruit_HTU21DF();
char Tstr[10];
char Hstr[10];
char Bstr[10];
double T,H,B;
char buffer[60];


void setup() {
  Serial.begin(SERIAL_BAUD);

  radio.initialize(FREQUENCY, NODEID, NETWORKID);
  #ifdef IS_RFM69HW_HCW
    radio.setHighPower();
  #endif
  radio.encrypt(ENCRYPTKEY);
  radio.enableAutoPower(ATC_RSSI);
  HTU21.begin();
  sprintf(buffer, "T/H SUPLA TRANSMITER RB-10 %d MHz.", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  SPln(buffer);
  Wire.begin();
  Wire.setClock(400000);
  if (flash.initialize()) flash.sleep();

  for (uint8_t i=0; i<=A5; i++)
  {
    if (i == RF69_SPI_CS) continue;
    if (i == SS_FLASHMEM) continue;
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  pinMode(A1, INPUT);
  SFLUSH();
}

char input = 0;
unsigned long sendLoops = 0;
unsigned long battReadLoops = 0;
word Battery1024 = 0;
byte BatteryLevel = 0;
byte sendLen;


void loop() {
  if (battReadLoops--<=0) {
    ReadBattery();
    battReadLoops = BATT_READ_LOOPS-1;
  }
  
  if (sendLoops--<=0) {
    sendLoops = SEND_LOOPS-1;
    
    T = HTU21.readTemperature();
    H = HTU21.readHumidity();
    dtostrf(T, 3, 2, Tstr);
    dtostrf(H, 3, 2, Hstr);
    dtostrf(BatteryLevel, 0, 0, Bstr);
    sprintf(buffer, "%s|%s|%s", Tstr, Hstr, Bstr);

    sendLen = strlen(buffer);
    radio.sendWithRetry(GATEWAYID, buffer, sendLen);
    radio.send(GATEWAYID, buffer, sendLen);
    SP("Wysłane dane: "); SP(buffer); SPln();
  }
  
  if (radio.receiveDone()) {
    SPln();
  }
  
  SFLUSH();
  flash.sleep();
  radio.sleep();
  
  LowPower.powerDown(sleepTime, ADC_OFF, BOD_OFF);
  
  SPln("SLEEP");
}


void ReadBattery() {
  unsigned int readings = 0;

  analogWrite(A0, 1024);
  for (byte i = 0; i < 6; i++)
    readings += analogRead(A1);
  analogWrite(A0, 0);

  Battery1024 = (readings / 3);

  if (Battery1024 >= BATT2) {
  BatteryLevel = 3;
  }
  else if (Battery1024 < BATT2 && Battery1024 >= BATT1) {
    BatteryLevel = 2;
  }
  else if (Battery1024 < BATT1 && Battery1024 >= BATT0) {
    BatteryLevel = 1;
  }
  else if (Battery1024 < BATT0) {
    BatteryLevel = 0;
  }
  SP("BATTx: "); SP(Battery1024); SP(" | Poziom baterii (0 - 3): ");SPln(BatteryLevel);
}
Pozdrawiam
Robert Błaszczak


Moja prywatna strona: www.blaszczak.pl
Awatar użytkownika
makrz
Posty: 395
Rejestracja: wt lis 27, 2018 1:43 pm
Lokalizacja: Opole

Robert Błaszczak pisze: śr sty 01, 2020 7:49 pm Nie posiadam tego czujnika, ale powinno działać:

Kod: Zaznacz cały

#include <Wire.h>                         //Zawarty w Arduino IDE (www.arduino.cc)
#include <SPI.h>                          //Zawarty w Arduino IDE (www.arduino.cc)
#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69
#include <SPIFlash.h>                     //Pobierz z: https://github.com/lowpowerlab/spiflash
#include <Adafruit_HTU21DF.h>             //Pobierz z: https://github.com/adafruit/Adafruit_HTU21DF_Library
#include <LowPower.h>                     //Pobierz z: https://github.com/lowpowerlab/lowpower

#define NODEID 1                          // Unikalny numer transmitera (1 - 6) pracującego w sieci o takim samym ID, który jest jednocześnie numerem czujnika w SUPLA Cloud.
#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 GATEWAYID 1                       // Numer bramki (0 - 254), do której łączy się transmiter.

#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 "xxxxxxxxxxxxxxxx"     //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 ATC_RSSI -80                      //Poziom sygnału radiowego (odcięcie) dla ATC.

period_t sleepTime = SLEEP_4S;            //Zdefiniowany czas uśpienia transmitera 4 sekundy (zgodnie z LowPower library (LowPower.h)).
#define SEND_LOOPS 13                     //Ilość pętli uśpienia transmitera (np. 4 sekundy * 15 = 60 sekund). Ilość pętli należy dobrać do konkretnej płytki Monteino.
#define BATT_READ_LOOPS SEND_LOOPS * 30   //Ilość pętli, po których wykonywany jest pomiar napięcia na baterii (np. 60 sekund * 30 = 30 minut).

//#define SERIAL_ENABLE                   //Usuń znaki komentarza '//' aby włączyć wyświetlanie na porcie szeregowym.

#define BATT0 730                         //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 0 (3.10V).
#define BATT1 1002                        //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 1 (3.20V).
#define BATT2 1008                        //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 2 (3.25V).

#ifdef SERIAL_ENABLE
  #define SERIAL_BAUD 115200
  #define SP(input) {Serial.print(input);}
  #define SPln(input) {Serial.println(input);}
  #define SFLUSH() {Serial.flush();}
#else
  #define SERIAL_BAUD 115200
  #define SP(input);
  #define SPln(input);
  #define SFLUSH();
#endif

RFM69_ATC radio;
SPIFlash flash(SS_FLASHMEM, 0xEF30);
Adafruit_HTU21DF HTU21 = Adafruit_HTU21DF();
char Tstr[10];
char Hstr[10];
char Bstr[10];
double T,H,B;
char buffer[60];


void setup() {
  Serial.begin(SERIAL_BAUD);

  radio.initialize(FREQUENCY, NODEID, NETWORKID);
  #ifdef IS_RFM69HW_HCW
    radio.setHighPower();
  #endif
  radio.encrypt(ENCRYPTKEY);
  radio.enableAutoPower(ATC_RSSI);
  HTU21.begin();
  sprintf(buffer, "T/H SUPLA TRANSMITER RB-10 %d MHz.", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  SPln(buffer);
  Wire.begin();
  Wire.setClock(400000);
  if (flash.initialize()) flash.sleep();

  for (uint8_t i=0; i<=A5; i++)
  {
    if (i == RF69_SPI_CS) continue;
    if (i == SS_FLASHMEM) continue;
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  pinMode(A1, INPUT);
  SFLUSH();
}

char input = 0;
unsigned long sendLoops = 0;
unsigned long battReadLoops = 0;
word Battery1024 = 0;
byte BatteryLevel = 0;
byte sendLen;


void loop() {
  if (battReadLoops--<=0) {
    ReadBattery();
    battReadLoops = BATT_READ_LOOPS-1;
  }
  
  if (sendLoops--<=0) {
    sendLoops = SEND_LOOPS-1;
    
    T = HTU21.readTemperature();
    H = HTU21.readHumidity();
    dtostrf(T, 3, 2, Tstr);
    dtostrf(H, 3, 2, Hstr);
    dtostrf(BatteryLevel, 0, 0, Bstr);
    sprintf(buffer, "%s|%s|%s", Tstr, Hstr, Bstr);

    sendLen = strlen(buffer);
    radio.sendWithRetry(GATEWAYID, buffer, sendLen);
    radio.send(GATEWAYID, buffer, sendLen);
    SP("Wysłane dane: "); SP(buffer); SPln();
  }
  
  if (radio.receiveDone()) {
    SPln();
  }
  
  SFLUSH();
  flash.sleep();
  radio.sleep();
  
  LowPower.powerDown(sleepTime, ADC_OFF, BOD_OFF);
  
  SPln("SLEEP");
}


void ReadBattery() {
  unsigned int readings = 0;

  analogWrite(A0, 1024);
  for (byte i = 0; i < 6; i++)
    readings += analogRead(A1);
  analogWrite(A0, 0);

  Battery1024 = (readings / 3);

  if (Battery1024 >= BATT2) {
  BatteryLevel = 3;
  }
  else if (Battery1024 < BATT2 && Battery1024 >= BATT1) {
    BatteryLevel = 2;
  }
  else if (Battery1024 < BATT1 && Battery1024 >= BATT0) {
    BatteryLevel = 1;
  }
  else if (Battery1024 < BATT0) {
    BatteryLevel = 0;
  }
  SP("BATTx: "); SP(Battery1024); SP(" | Poziom baterii (0 - 3): ");SPln(BatteryLevel);
}

Dzięki.
Jutro sprawdzę
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

dzikusk pisze: pn gru 09, 2019 6:39 pm Ja szukam pomysłu na zainstalowanie i zasilenie w jakiś sposób czujników temperatury z czujek od alarmu. Czy ktoś może mnie naprowadzić na właściwy tor? Oczywiście też bym chętnie kupił jakiegoś gotowca od was chłopaki :D
Wykorzystujesz wspólną masę czujek ruchu i DS. Dajesz osobny plus 3.3V dla DS oraz osobny przewod na magistralę. Łączysz wszystko w gwiazde i gotowe. Ja tak mam u siebie. Wykorzystalem wolne żyły od czujek ruchu, a calość zasililem z centrali alarmowej przez jedną przetwornice 12->3.3V. Łącznie pracuje tak u mnie 13 czujników DS zainstalowanych pod czujnikami ruchu.
Obrazek
Awatar użytkownika
dzikusk
Posty: 204
Rejestracja: wt maja 01, 2018 7:24 pm
Lokalizacja: Bolesławiec

Możesz podlinkować taką przetwornice?
A nie ma nic mniejszego tylko DSy?
Mój czujnik pogodowy
https://krasnikgorny.aqi.eco/pl
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

Np. taka:
https://tridex.pl/product/10140/przetwo ... -2a-mt3608

lub taka:
https://tridex.pl/product/10699/przetwo ... -lm2596-v2

DS-y są bardzo dobrymi czujnikami, więc nie wiem czy jest sens coś innego szukać.
Obrazek
Awatar użytkownika
dzikusk
Posty: 204
Rejestracja: wt maja 01, 2018 7:24 pm
Lokalizacja: Bolesławiec

Dzieki za linki. Jeszcze podpowiedz proszę którym softem obsłużyć 8 DS'ów. Stosujesz wemosa czy Sonoff?
Czy ten DS będzie ok? https://sklep.avt.pl/uklad-scalony-ds18s20-ds1820.html
Mój czujnik pogodowy
https://krasnikgorny.aqi.eco/pl
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

Ja stosuje wlasny soft i ESP-01. Co do ukladu to musi byc DS18b20, a nie DS18s20. Różnią się.
Obrazek
Zybi
Posty: 1511
Rejestracja: ndz cze 26, 2016 4:24 pm

Znalazłem na Ali akumulatorki do transmiterów.

Specyfikacja: 3.7 V800 mAh 25C bateria li-po
Czas ładowania: około 240 min (pięć ładowania baterii razem)
Długość kabla: 35mm
Rozmiar baterii: 45x25x10mm

https://pl.aliexpress.com/item/32921774 ... 383caa02a6
Załączniki
Battery_45x25x10_800mA.png
Battery_45x25x10_800mA.png (500.93 KiB) Przejrzano 2354 razy
ODPOWIEDZ

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