Arduino ile Kablosuz Termometre Oluşturma

433MHz RF modülünü ATMega328P-PU ile nasıl kullanacağınızı öğrenin. Bu yazımızda bir DHT11 sensörü ve bir RF vericisinden bir devre kuracağız. Ayrıca 433 MHz radyo alıcılı ve LCD ekranlı bir alıcı cihaz kuracağız.

Neye ihtiyacımız var

  • Arduino IDE'nin kurulu olduğu bir bilgisayar (1.6.5 sürümünü kullanıyorum);
  • VirtualWire kitaplığı (aşağıdaki bağlantı);
  • ATMega328P;
  • programcı AVR MKII ISP;
  • sıcaklık ve bağıl nem sensörü DHT11 ;
  • aşağıdaki öğeler listesinden bileşenler.

giriiş

Bu yazımda sizlere standart bir 433 MHz RF modülü kullanarak sıcaklık ve bağıl nemi ölçen ve ölçülen değerleri gönderen bir cihazın nasıl monte edileceğini göstereceğim. Cihazda kullanılan sıcaklık ve nem sensörü DHT11'dir.

Arduino veya ATMega denetleyicilerini kullanarak küçük miktarda veri aktarmanın birçok yolu vardır. Bunlardan biri RCSwitch, Radiohead veya VirtualWire gibi hazır bir kütüphane kullanıyor. Mikrodenetleyicinin yerleşik UART modülünü kullanarak ham veri göndermek de mümkündür. Ancak, alıcı tüm parazitleri toplayacağından ve mikrodenetleyici beklendiği gibi çalışmadığından, yerleşik UART modülünün kullanılması önerilmez. Bu yazıda, veri göndermek ve almak için VirtualWire kütüphanesini kullanıyorum. Bu kütüphane Arduino IDE 1.6.2 ve 1.6.5 ile çalışır.

433 MHz verici modülü, veri iletmediğinde hala RF titreşimleri yayar ve gürültü iletir. Ayrıca diğer RF cihazlarıyla etkileşime girebilir. Bunu önlemek için veri aktarmam gerektiğinde açıp aktarım bittiğinde kapatıyorum.

Donanım

İki yapısal diyagrama ihtiyacımız var. Biri verici için, diğeri alıcı için.

verici

İhtiyacımız var:

  • mikrodenetleyici bellenim yöntemi → ​​ISS;
  • sıcaklık ve nem sensörü → DHT11;
  • veri işleme için mikro denetleyici → ATMega32p;
  • kablosuz iletim yöntemi → 433MHz RF modülü.

Alıcı

İhtiyacımız var:

  • radyo alım yöntemi → 433MHz RF modülü;
  • alınan verileri işleme yöntemi → Arduino Mega;
  • sıcaklık ve nem görüntüleme yöntemi → 16x2 LCD.

Şematik diyagramlar

verici


ATMega328p'de kablosuz termometrenin verici kısmı
()

Bu örnekte, kullanılmayan mikrodenetleyici pinlerini harici termometre kontaklarına çıkarmayacağım, bundan sonra cihazı daha da geliştirmek için kullanılabilecekler. Burada sadece cihaz fikrini ele alıyoruz ve onu sadece bir devre tahtasında birleştireceğiz.

Alıcı



(yakınlaştırmak için resme sağ tıklayıp "Bağlantıyı / resmi yeni sekmede / yeni pencerede aç" seçeneğini seçebilirsiniz.)

Lütfen alıcının, şemada gösterilmeyen Arduino Mega kartına dayandığını unutmayın. Arduino Mega kartını bağlamak için RF modülünü ve LCD ekranı şemadaki etikete göre ona bağlayın.

Eşya listesi

verici


ATMega328p'deki kablosuz termometrenin verici kısmının elemanlarının listesi
(yakınlaştırmak için resme sağ tıklayıp "Bağlantıyı / resmi yeni sekmede / yeni pencerede aç" seçeneğini seçebilirsiniz.)

Alıcı



(yakınlaştırmak için resme sağ tıklayıp "Bağlantıyı / resmi yeni sekmede / yeni pencerede aç" seçeneğini seçebilirsiniz.)

programı

verici programı

İlk olarak, ileten kısmın programını düşünün:

#Dahil etmek // Tanım #define dhtPin 4 #define dhtType DHT11 #define txPowerPin 8 // DHT kütüphanesini kullanma DHT dht(dhtPin, dhtType); // Değişkenler char msg0; charmsg1; int tem = 0; inthum = 0; // İlk kurulum işlevi - açılışta yalnızca bir kez yürütülür void setup() ( pinMode(txPowerPin, OUTPUT); pinMode(txPowerPin, LOW); vw_setup(4800); // VirtualWire bağlantı hızı vw_set_tx_pin(9); // Transfer pini VirtualWire ) // Döngü işlevi - her zaman çalıştırılan void döngüsü() ( digitalWrite(txPowerPin, HIGH); hum = dht.readHumidity(); // Değişken nem tem = dht.readTemperature(); // Değişken sıcaklığı saklar itoa(hum) , msg1, 10); // Nemi char itoa(tem, msg0, 10) dizisine dönüştür; // Sıcaklığı char strcat(msg0, msg1) dizisine dönüştür; // İki dizi ekle/birleştir vw_send((uint8_t *)msg0 , strlen(msg0)); // İleti iletisi vw_wait_tx(); // İletimin tamamlanmasını bekleyin digitalWrite(txPowerPin, LOW); delay(5000); // 5 saniye bekleyin ve her şeyi tekrarlayın )

Nemi ve sıcaklığı tek bir mesajda iletmek için bunları bir araya getiriyorum. İlk olarak, veriler değişkene tamsayılar olarak okunur, ardından tamsayılar bir karakter dizisine dönüştürülür ve ardından birbirleriyle birleştirilir. Alıcı tarafta, veriler bireysel karakterlere bölünecektir. Bunu yaparak, kendimi iki basamaklı derece ile sınırlandırıyorum. Sensör sıcaklığı 10°C'nin altında olan bir ortamdaysa, ekranda çöp sembolleri alıyorum. Örneğin, sıcaklık 20°C ve nem %45 ise, 2045 mesajı iletilecektir ve her şey yolundadır. Sıcaklık 9°C ve nem %78 ise, "x" rastgele bir karakter olmak üzere 978x mesajı gönderilir. Bu nedenle, bu kablosuz termometreyi toplayacaksanız, sıcaklık 10°C'nin altına düştüğünde programı doğru verileri iletecek şekilde değiştirmenizi tavsiye ederim.

Alıcı Programı

// Gerekli kütüphaneleri dahil et #include #Dahil etmek // LCD bağlantısını tanımlayın #define RS 9 #define E 10 #define D4 5 #define D5 6 #define D6 7 #define D7 8 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Derece sembolünü çiz bayt derecesimge = ( B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 ); // Değişkenler int tem = 0; int ben; // İlk kurulum işlevi - açılışta yalnızca bir kez yürütülür void setup() ( lcd.begin(16,2); // LCD başlatma lcd.createChar(1, Degreesymbol); // Konum 1 Serial.begin'de derece sembolü oluşturun (9600); // Hata ayıklama için vw_setup(4800); // VirtualWire bağlantı hızı vw_rx_start(); // vw_set_rx_pin(2) almaya hazır; // VirtualWiore alma pini lcd.clear(); // LCD'yi Temizle ) // Döngü işlevi - her zaman çalıştırılan void loop() ( uint8_t buf; // Alınan verileri depolamak için değişken uint8_t buflen = VW_MAX_MESSAGE_LEN; // Alınan verinin uzunluğunu saklamak için değişken lcd.setCursor(0,0); lcd.print( "Temp: " ); if (vw_get_message(buf, &buflen)) // Veri alınırsa ( for (i=0;i)<2;i++) // Получить два первых байта { Serial.write(buf[i]); // Для отладки lcd.write(buf[i]); // Вывести первые байты на LCD } Serial.println(); // Для отладки lcd.write(1); // Вывести символ градусов на LCD lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Hum: "); for (i=2;i<4;i++) // Получаем последние два байта { Serial.write(buf[i]); // Отладка lcd.write(buf[i]); // Вывести последние байты на LCD } lcd.print("% RH"); } }

LiquidCrystal kitaplığını kullanmanın ilginç bir yolu, özel semboller oluşturmaktır. createChar ile derece karakterini oluşturdum. Aynı şekilde kendi sembollerinizi de oluşturabilirsiniz. Özel bir sembol veya simge oluşturmak için, onu sekiz baytlık bir dizi olarak bildirmeniz ve hangi piksellerin etkinleştirileceğini "çizmeniz" gerekir (1 - açık, 0 - kapalı).