FORUM

Zdalny pomiar/kontrola temperatury HC-12

Odpowiedz

Emotikony
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek:

BBCode włączony
[Img] włączony
[Flash] wyłączony
[URL] włączony
Emotikony włączone

Przegląd tematu
   

Rozwiń widok Przegląd tematu: Zdalny pomiar/kontrola temperatury HC-12

Zdalny pomiar/kontrola temperatury HC-12

autor: Wolfik » 20 lis 2022, 19:36

Witam.

Chciałbym podzielić się swoim projektem DIY, który wykonałem dla kolegi. Projekt jest dalej wspierany i rozbudowywany o kolejne elementy, także w najbliższym czasie mogą pojawić się nowe wpisy prezentujące nowe możliwości systemu.

Na początek może sama idea projektu i jego założenia. Pomysł jak już wspomniałem podrzucił kolega, który zimą korzystał z przydomowej sauny. Jednak musiał pokonywać dystans z domu do sauny ok. 50 m. w celu sprawdzenia temperatury nagrzania sauny. Nie było by to problemem teraz w lecie, jednak zimą sprawa nie była za ciekawa, a stacje pogodowe i inne czujniki wysyłające temperaturę na odległość albo gubiły zasięg już po paru dniach albo temperatura w saunie była za wysoka (120 st.) i nadajniki odmawiały posłuszeństwa. Na spotkaniu towarzyskim kolega opowiedział mi całą sytuację i tak oto narodził się pomysł czujnika temp. na odległość.

Zapoznałem się z sytuacją, kolega przedstawił oczekiwania, ja dodałem coś od siebie i wyszły nam poniższe założenia projektu:

* Projekt miał być bezprzewodowy, a sygnał miał
być emitowany na odległość 50 m. otwartej
przestrzeni i 2 ściany w domu.

* Oczywiście nadawanie i odbiór temperatury z
sauny i wyświetlenie jej na wyświetlaczu LCD, tak
więc 2 moduły: nadawczy i odbiorczy.

* Dodałem od siebie możliwość ustawienia alarmu
temperatury, po której przekroczeniu miał
włączać się buzzer sygnalizujący osiągnięcie
ustawionej temp. w saunie (nie trzeba co chwilę
sprawdzać i specjalnie chodzić do kuchni, a także
nie trzeba pamiętać o sprawdzaniu :D).

* Nadajnik i odbiornik mają być zasilane z sieci i
być w obudowach.

* Czujnik temp. musi dokonywać pomiaru
temperatury sięgającej 130 stopni C.

No to tyle z założeń, wszystko było już ustalone więc pozostało nic innego jak wykonanie projektu. Jak widzicie kolega ma saunę także koszta nie musiały być cięte a ja mogłem puścić wodze fantazji xD

No więc pewnego zimowego wieczoru zacząłem kompletować potrzebne elementy:

Oczywiście potrzeba czegoś co to ogarnie i jakoś tak padło na ATmega328p a konkretnie Arduino pro mini. Dlaczego Arduino, a nie goła atmega, lub inne cusik? Podobne koszty, stabilizator, rezonator i goldpiny na pokładzie więc wybór był prosty, choć na pewno znajdą się osoby co powiedzą po co od razu atmega i to jeszcze328p! No ale cóż chciałem żeby projekt był przyjemny, i łatwy w ewentualnych dalszych upgreydach :p

I właśnie również z tego powodu zdecydowałem się na płytki prototypowe a nie na trawienie laminatu, choć tak mogłem wyprowadzić sygnały, zasilanie i masy no ale cóż lubię lutować i plątanine kabelków.

Teraz dalsze elementy czyli najważniejszy czujnik temp, który postanowiłem umieścić również w odbiorniku. Jako, że 125 stopni to taka przyjazna temp dla większości czujników to wybór padł na popularne Dallas 18b20 - tryb pasożytniczy, dokładność, i cena przemówiły na jego korzyść (choć każdy może sb dać jaki mu się żyd nie podoba).

Dalej myślałem o zasilaniu... Czy 12V i przetwornica step-down, czy jakieś zasilacze 5V i bezpośrednio do VCC pro mini, czy jakiś zasilacz 9V do stabilizatora pro mini? Pomysłów było sporo, lecz po próbach postanowiłem spróbować na zasilaczach USB 5V 1A i sprawdzić już z gotowym projektem. To akurat element nad którym pomyślę później i nie muszę podejmować już ostatecznej decyzji.

Wyświetlacz to LCD 4x20, po prostu ze względów estetycznych i potrzebnego miejsca pod nim na elektronikę.

Następnie moduły komunikacyjne na daną odległość i przeszkody w formie 50 cm. ścian. Postanowiłem sprawdzić najpierw tanie moduły RF do arduino na interface TTL, a także odległość jaką proponuje producent czyli 150m. Jednak po próbach okazało się, iż nawet z antenami zasięg ledwo wystarczał na 50m i jedną 20cm. ścianę. W dodatku pomyślałem, że fajnie by było mieć komunikację w obie strony i np. włączać światło z domu w środku sauny, czy też sam piec (gdyby był elektryczny a nie na drewno jak ma kolega xD), jak i również wysłanie sygnału SOS do domu w razie potrzeby, który uruchomi buzzer, i inne bajery.

Wtedy pojawił się pomysł aby wykorzystać moduły HC-12 433Mhz, które działają na magistralę UART za pośrednictwem pinów RX i TX. Wykorzystałem je ponieważ nie było dostępnych nRF24L01 ze wzmacniaczem, które są trochę tańsze no ale los tak chciał.

Zacząłem od konfiguracji modułów HC-12, w których ustawiłem za pomocą komend AT największą moc nadawania, odpowiedni kanał i inne (polecam filmik na youtube gdzie pan fajnie przedstawia działanie i konfigurowanie modułów). Po pozytywnym teście przesłania informacji z jednego Arduino do drugiego podłączyłem na płytkach stykowych zestaw nadawczy, odbiorczy i zabrałem się do pisania wsadów:



ODBIORNIK:

Kod: Zaznacz cały

/*
HC-12
odbiornik
*/

#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 4 //pin 4 w arduino cz. temp.

OneWire oneWire(ONE_WIRE_BUS); // uruchomienie onewire
DallasTemperature sensors(&oneWire);

// PODPIĘCIE LCD: RS-12, RW-14, E-11, D4-7, D5-8, D6-9, D7- 10
LiquidCrystal lcd(12, 14, 11, 7, 8, 9, 10);
//GND
SoftwareSerial mySerial(2, 3);  // RX, TX do hc12

String temp1;
int a = 0;

//int tempsauna;

//String ustTemp;
int ustTemp;
int odczytanaWartosc;
int alarm;
int buzerPin = 13;
void setup() {

lcd.begin(20, 4);

pinMode(buzerPin, OUTPUT);

Serial.begin(9600); // ardu - komp

mySerial.begin(1200); // ardu - HC-12

sensors.begin(); //rozpoczęcie pomiaru

lcd.print("     SAUNA"); //pierwszy wiersz

lcd.setCursor(0, 1); // drugi wiersz
lcd.print("   INICJALIZACJA"); //drugi wiersz

lcd.setCursor(0, 2); // 3 wiersz
lcd.print("   PROSZE CZEKAC"); //3 wiersz

lcd.setCursor(0, 3); // 4 wiersz
lcd.print("BY. A. Wolak ABC-RC"); //4 wiersz

delay(3000);
lcd.clear();
}
void loop() {

lcd.setCursor(0, 0); // I wiersz
lcd.print(" KONTROLER SAUNA");

// mapowania alarmu

odczytanaWartosc = analogRead(A2);
ustTemp = map(odczytanaWartosc, 0, 1023, 22, 140);

lcd.setCursor(0, 3); // IV wiersz
lcd.print("Temp. alarmu: ");
lcd.print(ustTemp);
lcd.print(" st");

// czujnik przy odbiorniku temp w pokoju
sensors.requestTemperatures(); //wyslij o uzyskanie temp
Serial.println("Temp. czujnika odbiornika");
Serial.println(sensors.getTempCByIndex(0));
lcd.setCursor(0, 2); // II wiersz
lcd.print("Pokoj temp: ");
lcd.print(sensors.getTempCByIndex(0)); //odczytanie wartości czujnika
lcd.print(" st");
//lcd.print("");

// odczytywanie z nadajnika HC-12

if (mySerial.available() > 1) {    //sprawdź bufor UART hc-12
String temp1 = mySerial.readString();
Serial.println(temp1);
lcd.setCursor(0, 1);                        // I wiersz
lcd.print("Sauna temp: ");
lcd.print(temp1);
lcd.setCursor(15, 1);                  // I wiersz wyś. pow. 100 st.
lcd.print(" stC ");
if (temp1. toInt() >= ustTemp) {   // warunek alarmu i przekształcenia na int
digitalWrite(buzerPin, HIGH);
lcd.clear();
lcd.setCursor(0, 1);                      // I wiersz
lcd.print("!!!!!! ALARM !!!!!");
lcd.setCursor(0, 2);                   // II wiersz
lcd.print("Temp. PRZEKROCZONA !");
lcd.setCursor(0, 3);                    // IV wiersz
lcd.print("Temp. sauny: ");
lcd.print(temp1);
} else {
digitalWrite(buzerPin, LOW);

}
}
}
Nadajnik:

Kod: Zaznacz cały

/*
Nadajnik HC-12 czuj. temp dallas
*/

#include <SoftwareSerial.h>
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 5 //pin 5 w arduino cz. temp. sygnał
OneWire oneWire(ONE_WIRE_BUS); // uruchomienie onewire do dallasa

DallasTemperature sensors(&oneWire);

SoftwareSerial mySerial(2, 3); // RX, TX do HC-12

// sensors.requestTemperatures(); //wyslij o uzyskanie temp

String temp;

void setup() {

Serial.begin(9600);
mySerial.begin(1200);
sensors.begin(); //rozpoczęcie pomiaru
}

void loop() {

Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); //wyslij o uzyskanie temp
Serial.println("DONE");

Serial.println(sensors.getTempCByIndex(0));
int a = (sensors.getTempCByIndex(0));
String temp1 = temp + a;
mySerial.println(temp1);
Serial.println(temp1);
delay(1000);
}

Na górę