Bezdrôtový teplomer využívajúci 433 MHz RF spojenie pomocou Arduina

Vyskúšajte Náš Nástroj Na Odstránenie Problémov





V tomto príspevku skonštruujeme bezdrôtový teplomer založený na Arduine, ktorý dokáže monitorovať teplotu v miestnosti a teplotu vonkajšieho prostredia. Dáta sú prenášané a prijímané cez 433 MHz RF linku.

Pomocou RF modulu 433 MHz a snímača DHT11

Navrhovaný projekt využíva Arduino ako mozog a srdce ako 433 MHz modul vysielač / prijímač .



Projekt je rozdelený na dva samostatné okruhy, jeden s prijímačom 433 MHz, LCD displejom a snímačom DHT11, ktoré budú umiestnené vo vnútri miestnosti a tiež meria teplotu v miestnosti .

Ďalší okruh má 433 MHz vysielač, Senzor DHT11 na meranie vonkajšej teploty okolia. Oba okruhy majú po jednom arduine.



Okruh umiestnený vo vnútri miestnosti zobrazí namerané hodnoty vnútornej a vonkajšej teploty na LCD displeji.

Teraz sa pozrime na modul vysielač / prijímač 433 MHz.

433 MHz modul vysielač / prijímač.

Vyššie sú zobrazené moduly vysielača a prijímača, ktoré umožňujú jednostrannú komunikáciu. Prijímač má 4 piny Vcc, GND a DATA piny. Existujú dva kolíky DATA, sú rovnaké a môžeme výstupovať údaje z ktoréhokoľvek z dvoch kolíkov.

Vysielač je oveľa jednoduchší, má iba vstupné kolíky Vcc, GND a DATA. Musíme pripojiť anténu k obom modulom, ktorá je popísaná na konci článku, bez toho, aby medzi nimi bola nadviazaná komunikácia medzi anténami do niekoľkých palcov.

Teraz sa pozrime, ako tieto moduly komunikujú.

Teraz predpokladajme, že na vstupný pin dát vysielača aplikujeme taktovací impulz 100 Hz. Prijímač dostane presnú repliku signálu na dátovom kolíku prijímača.

To je jednoduché, nie? Áno ... ale tento modul pracuje na AM a je citlivý na šum. Podľa pozorovania autora, ak dátový kolík vysielača zostal bez signálu dlhšie ako 250 milisekúnd, výstupný kolík dát prijímača produkuje náhodné signály.

Je teda vhodný iba na nekritické dátové prenosy. Tento projekt však s týmto modulom funguje veľmi dobre.

Prejdime teraz k schémam.

PRIJÍMAČ:


pripojenie Arduino k LCD displeju. 10K potenciometer

Vyššie uvedený obvod je pripojenie Arduino k LCD displeju. Na nastavenie kontrastu LCD displeja je k dispozícii 10K potenciometer.

Bezdrôtový teplomer využívajúci 433 MHz RF Link a Arduino

Vyššie je uvedený obvod prijímača. K tomuto arduinu by mal byť pripojený LCD displej.

Pred zostavením kódu si stiahnite nasledujúce súbory knižnice

Rádio Head: github.com/PaulStoffregen/RadioHead

Knižnica senzorov DHT: https://arduino-info.wikispaces.com/file/detail/DHT-lib.zip

Program pre prijímač:

//--------Program Developed by R.Girish-----//
#include
#include
#include
#include
#define DHTxxPIN A0
LiquidCrystal lcd(12,11,5,4,3,2)
RH_ASK driver(2000, 7, 9, 10)
int ack = 0
dht DHT
void setup()
{
Serial.begin(9600)
lcd.begin(16,2)
if (!driver.init())
Serial.println('init failed')
}
void loop()
{
ack = 0
int chk = DHT.read11(DHTxxPIN)
switch (chk)
{
case DHTLIB_ERROR_CONNECT:
ack = 1
lcd.setCursor(0,0)
lcd.print('INSIDE:')
lcd.print('NO DATA')
delay(1000)
break
}
if(ack == 0)
{
lcd.setCursor(0,0)
lcd.print('INSIDE:')
lcd.print(DHT.temperature)
lcd.print(' C')
delay(2000)
}
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]
uint8_t buflen = sizeof(buf)
if (driver.recv(buf, &buflen))
{
int i
String str = ''
for(i = 0 i {
str += (char)buf[i]
}
lcd.setCursor(0,1)
lcd.print('OUTSIDE:')
lcd.print(str)
Serial.println(str)
delay(2000)
}
}
//--------Program Developed by R.Girish-----//

Vysielač:

Bezdrôtový vysielač teplomera

Vyššie uvedené je schéma vysielača, ktorý je ako prijímač pomerne jednoduchý. Tu používame ďalšiu dosku arduino. Senzor DHT11 sníma vonkajšiu teplotu okolia a odosiela späť do modulu prijímača.

Vzdialenosť medzi vysielačom a prijímačom by nemala byť väčšia ako 10 metrov. Ak sú medzi nimi nejaké prekážky, môže sa znížiť prenosový dosah.

Program pre vysielač:

//------Program Developed by R.Girish----//
#include
#include
#define DHTxxPIN A0
#include
int ack = 0
RH_ASK driver(2000, 9, 2, 10)
dht DHT
void setup()
{
Serial.begin(9600)
if (!driver.init())
Serial.println('init failed')
}
void loop()
{
ack = 0
int chk = DHT.read11(DHTxxPIN)
switch (chk)
{
case DHTLIB_ERROR_CONNECT:
ack = 1
const char *temp = 'NO DATA'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
break
}
if(ack == 0)
{
if(DHT.temperature == 15)
{
const char *temp = '15.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 16)
{
const char *temp = '16.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 17)
{
const char *temp = '17.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 18)
{
const char *temp = '18.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 19)
{
const char *temp = '19.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 20)
{
const char *temp = '20.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 21)
{
const char *temp = '21.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 22)
{
const char *temp = '22.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 23)
{
const char *temp = '23.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 24)
{
const char *temp = '24.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 25)
{
const char *temp = '25.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 26)
{
const char *temp = '26.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 27)
{
const char *temp = '27.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 28)
{
const char *temp = '28.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 29)
{
const char *temp = '29.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 30)
{
const char *temp = '30.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 31)
{
const char *temp = '31.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 32)
{
const char *temp = '32.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 33)
{
const char *temp = '33.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 34)
{
const char *temp = '34.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 35)
{
const char *temp = '35.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 36)
{
const char *temp = '36.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 37)
{
const char *temp = '37.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 38)
{
const char *temp = '38.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 39)
{
const char *temp = '39.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 40)
{
const char *temp = '40.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 41)
{
const char *temp = '41.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 42)
{
const char *temp = '42.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 43)
{
const char *temp = '43.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 44)
{
const char *temp = '44.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
delay(500)
if(DHT.temperature == 45)
{
const char *temp = '45.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 46)
{
const char *temp = '46.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 47)
{
const char *temp = '47.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 48)
{
const char *temp = '48.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 49)
{
const char *temp = '49.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 50)
{
const char *temp = '50.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
delay(500)
}
}
//------Program Developed by R.Girish----//

Konštrukcia antény:

Ak staviate projekty pomocou tohto 433 MHz moduly , pre dobrý dosah postupujte striktne podľa nasledujúcich konštrukčných detailov.

433 MHz RF anténa

Použite jednožilový drôt, ktorý by mal byť dostatočne pevný, aby podporoval túto štruktúru. Na spájkovanie môžete tiež použiť izolovaný medený drôt s odstránenou izoláciou v spodnej časti. Vytvorte dva z nich, jeden pre vysielač a druhý pre prijímač.

Autorský prototyp bezdrôtového teplomera využívajúci Arduino a 433 MHz RF Link:

Prototyp bezdrôtového teplomera využívajúci 433 MHz RF Link a Arduino


Dvojica: Antikorózne sondy pre regulátor hladiny vody Ďalej: Vývod IC L293 Quad Half-H Driver, dátový list, aplikačný obvod