Raspberry Pi Pico İle Akıllı Ev Otomasyonu

Güncelleme tarihi: 9 Şub

Her geçen gün internetin hayatımızdaki yeri artmaktadır. Bu artışla beraber kullandığımız ürünleri, yaşadığımız sorunları internet aracılığı ile çözmeye çalışmaktayız. Ev otomasyonu da bunlardan biridir. Evimizdeki lambayı, ortam sıcaklığını, elektronik aletlerin açık olup olmamasını internet üzerinden kontrol etmek mümkündür. Raspberry Pi Pico, diğer Raspberry Pi'lardan farklı olarak üzerinde WiFi modülü bulundurmamaktadır. Raspberry Pi Pico ve ESP8266'yı haberleştirerek otomasyon projesi yapacağız.

Bu uygulamada kullanılacak malzemeler:

  • Raspberry Pi Pico

  • NodeMCU

  • 2 Kanallı Röle

  • 3 Adet 5mm LED

  • 3 Adet 220R Direnç

  • Jumper Kablolar

  • Breadboard

Devre aşağıdaki gibi kurulur.

Devre kurulumu bittikten sonra kod yazmaya geçmeden önce internet ile kontrol etmek için bir mobil uygulama oluşturmalıyız. Mobil uygulamayı kodlamak için Block kodlama ile Kodular'dan yapacağız. Kodular'a üyelik oluşturduktan sonra yeni proje oluşturarak uygulamanın kodlamasını yapıyoruz.

Export edip uygulamanın Apk'sını oluşturarak telefonumuza kuruyoruz.

WiFi modülü görevi olan ESP8266, Arduino IDE üzerinde kodlanacaktır. ESP8266WiFi kütüphanesini kurmakla işe başlıyoruz. Kullanılan Wifi'nin kullanıcı adı ve şifresini yazıyoruz.

#define SSID "KullanıcıAdı"
#define PASS  "Şifre"

String kullanarak html dizisi oluşturuyoruz. Ayrıca Thonny IDE'sinde alınacak veriler de 'data' dizisinde saklanacaktır.

String temp ;
String data ;
String head = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
String html_1 = "<!DOCTYPE html><html><body><div id='main'>";

Thonny'den alınan sıcaklık verilerinin Seri Port Ekranına yazılması için void loop() içerisinde if oluşturarak gelen verinin okunması sağlanıyor.

void loop() {
  if (Serial.available() > 0) {
    String data = Serial.readStringUntil('\n');
    Serial.print("Sıcaklık : ");
    Serial.println(data);
  }

Ip Adresinin okunup yazılması için fonksiyon oluşturularak onun içine kodlaması yapılır.

  Serial.print("\nCOnnected to: ");
  Serial.println(SSID);
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

Kodun tamamı aşağıda verilmiştir.

#include <ESP8266WiFi.h>


#define SSID "KullanıcıAdı"
#define PASS  "Şifre"


String temp ;
String data ;
String head = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
String html_1 = "<!DOCTYPE html><html><body><div id='main'>";
String html_2 = "<form id='F1' action='LEDON'></form><br>";
String html_3 = "<form id='F2' action='LEDOFF'></form><br>";
String html_4 = "<form id='F3' action='ROLE1ON'></form><br>";
String html_6 = "<form id='F5' action='ROLE2ON'></form><br>";
String html_7 = "<form id='F6' action='ROLE2OFF'></form><br>";
String html_7_1 = "<form id='F7' action='data'></form><br>";
String html_8 = "</div></body></html>";

String req;

void connectWiFi();

WiFiServer server(80);


void setup() {
  Serial.begin(9600);
  connectWiFi();
  server.begin();
}

void loop() {
  if (Serial.available() > 0) {
    String data = Serial.readStringUntil('\n');
    Serial.print("Sıcaklık : ");
    Serial.println(data);
  }
  WiFiClient client = server.available();
  if (!client) {

  }
  else {
    req = client.readStringUntil('\r');
    req += '\n';
    for (int i = 5; i < req.length() - 10; i++) {
      data += req[i];
    }
    data += '\n';
    Serial.write(data.c_str());
    data = "";
    client.print(head);
    client.print(html_1 );
    client.print(html_2 );
    client.print(html_3 );
    client.print(html_4);
    client.print(html_6);
    client.print(html_7 );
    client.print(html_7_1 );
    client.println(data);
    client.print(html_8);
    client.flush();
  }
  
  
  timer.run();
  
  delay(10);
  
}

void connectWiFi() {
  WiFi.begin(SSID, PASS);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nCOnnected to: ");
  Serial.println(SSID);
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());
}

NodeMCU'ya kodu yüklemek için öncelikle Raspberry Pi Pico ile bağlantısını kesmek için TX ve RX pinlerinin bağlantısını kesiyoruz. Yüklemeye başladıktan sonra FLASH tuşuna basarak kodun yüklenmesini sağlıyoruz. Kod yüklendikten sonra RST tuşuna basarak Seri Port Ekranını açıyoruz. Seri Port'da IP Adresi yazılacaktır. Seri Port Ekran çıktısı aşağıda verilmiştir.


Sıcaklık sensörü Raspberry Pi Pico'nun üzerinde bulunanADC Pinini tanımlıyoruz. Haberleşme için kullanılacak TX ve RX pini tanımlanır.

sensor = machine.ADC(4)
deger_don = 3.3/(65535)

uart = UART(1, baudrate=9600, bits=8, parity=None, stop=1, tx=Pin(8), rx=Pin(5))
rxData = bytes()

LED ve Rölelerin kontrolü Raspberry Pi Pico ile sağlanıyor. Thonny IDE'sinden alınan data Arduino IDE'ye aktarılması için def oluşturularak gerçekleştirilir.

def readUART(uart):
    rawData = ""
    data = ""
    while uart.any():
        rawData = uart.readline()
    if rawData != "":
        for i in range(0, len(rawData)-1):
            data = data + chr(rawData[i])
    return data

while True içerisinde LED ve Rölelerin kontrolü yapılır.

     if data == "LEDON":
        led.value(1)
        print("Led yandı.")
    elif data == "LEDOFF":
        led.value(0)
        print("Led söndü.")

Sıcaklık değerinin okunması sağlandıktan sonra Arduino IDE'ye yazdırmak için haberleşme kodlanmalıdır.

    uart.write('Sıcalık = ' + str(t) + ' °C\r\n')

Kodun tamamı aşağıda verilmiştir.

from machine import Pin, UART
import utime


sensor = machine.ADC(4)
deger_don = 3.3/(65535)

uart = UART(1, baudrate=9600, bits=8, parity=None, stop=1, tx=Pin(8), rx=Pin(5))
rxData = bytes()


led = Pin(15, Pin.OUT)
role1= Pin(6, Pin.OUT)
role2= Pin(3, Pin.OUT)

led.value(1)
role1.value(0)
role2.value(0)
def readUART(uart):
    rawData = ""
    data = ""
    while uart.any():
        rawData = uart.readline()
    if rawData != "":
        for i in range(0, len(rawData)-1):
            data = data + chr(rawData[i])
    return data
while True:
    data = readUART(uart)
    if data == "LEDON":
        led.value(1)
        print("Led yandı.")
    elif data == "LEDOFF":
        led.value(0)
        print("Led söndü.")
    
    if data == "ROLE1OFF":
        role1.value(1)
        print("Röle 1 kapandı.")
    elif data == "ROLE1ON":
        role1.value(0)
        print("Röle 1 açıldı.")
        
    if data == "ROLE2OFF":
        role2.value(1)
        print("Röle 2 kapandı.")
    elif data == "ROLE2ON":
        role2.value(0)
        print("Röle 2 açıldı.")
    
    ADC_voltaj = sensor.read_u16()*deger_don
    t = 27 - (ADC_voltaj-0.706)/0.001721
    uart.write('Sıcalık = ' + str(t) + ' °C\r\n')
    print(t, "°C")
    utime.sleep_ms(200)

Thonny IDE'sini de çalıştırdıktan sonra uygulamamıza giriş yaparak IP Adresini girerek uygulamamayı çalıştırıyoruz.

IDE'lerdeki çıktılar aşağıdaki gibidir.



Son Paylaşımlar