Akıllı Ev Otomasyonu
Bu projemizde sizlerle birlikte LoRa E32 modülünü ( 443T30D ) ve Topway dokunmatik ekranını kullanarak kablosuz akıllı ev sistemlerini nasıl kodlayabileceğinizi öğreteceğiz. Projemizde kullandığımız ekran üzerinde gösterilen butonları dinleme, tıklandığına aksiyona geçirme ve LoRa üzerinden alıcıya gönderip daha sonra vantilatörü çalıştırma komutları hem YouTube kanalımızda hem de aşağıdaki kodda mevcuttur.
Ayrıca YouTube kanalımızdan ESP32 gibi düşük akımda çalışan bir modülü nasıl yüksek akım gerektiren vantilatör gibi ev eşyalarının çalıştırmak için kullanabileceğimizi görebilirsiniz.
Solid State Role Modülü sayesinde siz de istediğiniz ev eşyalarınızı LoRa ile kontrol edebilirsiniz.
Videomuzu izlemek için tıklayınız:
Gerekli Malzemeler
ESP32 30-Pin ESP-WROOM-32 WiFi Bluetooth
Çift çekirdekli işlemciye sahip, WiFi ve Bluetooth özellikleri barındıran bu ESP32 modülü, çok çeşitli IoT projelerinde kullanılabilir.
Ürün Sayfasına GitESP32 30-Pin ESP-WROOM-32 WiFi Bluetooth
Çift çekirdekli işlemciye sahip, WiFi ve Bluetooth özellikleri barındıran bu ESP32 modülü, çok çeşitli IoT projelerinde kullanılabilir.
Ürün Sayfasına GitLoRa Başlangıç Seti (SX1278 E32-433T20D)
LoRa teknolojisi ile tanışmak isteyenler için 433 MHz bandında çalışan, SX1278 çipli modül ve anten içeren bir başlangıç setidir.
Ürün Sayfasına GitKodlar
Aşağıda iki farklı kod sekmesiyle karşılaşacaksınız. Birinci kod gönderici kısmına ait, ikincisi ise alıcı kısmına aittir. Alıcı’da aldığımız buton state’lerine göre işlem yapmaktayız. LoRa E32 modülünün kullanımı ve diğer detaylar için kod üzerinde bulunan yorum satırlarını okuyunuz.
Ekran Tarafının Kodu:
/****************************************Copyright (c)****************************************************
** Fixaj Mehmet YILDIZ
**
** https://fixaj.com/
**
** Tüm hizmetler Mehmet Yıldız şirketi Fixaj tarafından sağlanmaktadır.
** FİXAJ MAĞAZALARIMIZ DIŞINDA SATIN ALINAN TOPWAY MARKA DOKUNMATİK EKRANLARDA BU KÜTÜPHANENİN TİCARİ OLARAK KULLANIMI YASAKTIR.
** Herhangi bir program, belge, test sonucu, çözüm, destek ve diğer malzeme ve bilgiler yalnızca referans amaçlıdır
** ve müşterilerin kullanmama veya atıfta bulunma ve kendileri tarafından değişiklik yapma hakları vardır.
** Müşterinin kullanımı sırasında herhangi bir özel, tesadüfi veya dolaylı kayıp meydana gelirse,
** herhangi bir bütünlük, güvenilirlik ve diğer garantileri sağlamak için şirket sorumlu olmayacaktır.
** HERHANGİ BİR SORUMLULUĞUN KABUL EDİLMEMESİ.
** Fixaj
**
**
**--------------File Info-------------------------------------------------------------------------------
** Modified by: MEHMET YILDIZ
** Modified date: 8.06.2023
** Version: v0.1
** Description:
********************************************************************************************************/
#define E32_TTL_1W // E32 30d modülleri için bunu aktif et
#include <HardwareSerial.h>
#include <FixajEkran.h>
unsigned long kanalBekleme_sure = 0;
int kanalBekleme_bekleme = 2500;
#define RX 17 // Lora nın 3. pini RX in ESP 32 de hangi pine bağlı olduğu
#define TX 16 // Lora nın 4. pini TX in ESP 32 de hangi pine bağlı olduğu
HardwareSerial fixajSerial(2); //esp32 hardware serial kullanıyoruz
FixajEkran FixajSS(TX, RX, &fixajSerial, UART_BPS_RATE_115200_Ekran);
#include "LoRa_E32.h"
#define M0 32 //3in1 PCB mizde pin 7
#define M1 33 //3in1 PCB mizde pin 6
#define RXLora 27 // Lora nın 3. pini RX in ESP 32 de hangi pine bağlı olduğu
#define TXLora 35 // Lora nın 4. pini TX in ESP 32 de hangi pine bağlı olduğu
//Alıcı tarafı ESP32 olduğu parametre ayaraları değişmemiz gerekiyor.
HardwareSerial fixajSerial1(1); //esp32 hardware serial kullanıyoruz
LoRa_E32 FixajLora(TXLora, RXLora, &fixajSerial1, UART_BPS_RATE_9600);
//PARAMETRE AYARLARI
#define Adres 1 //0--65000 arası bir değer girebilirsiniz. Diğer Modüllerden FARKLI olmalı
#define Kanal 20 //Frekans değeri Diğer Modüllerle AYNI olmalı.
//E32 için 0--31 arasında bir sayı giriniz.
//E32 433 için Frekans = 410 + kanal değeri
#define GonderilecekAdres 2 //Mesajın gönderileceği LoRa nın adresi
struct Signal {
char sifre[15] = "Fixaj.com";
char konum[15];
bool btnSulama;
bool btnAydinlatma;
bool btnOtopark;
bool btnHava;
} data;
#define addrSulama 0x080004
#define addrAydinlatma 0x080006
#define addrOtopark 0x080008
#define addrHavandirma 0x08000A
Buton havandirma(0, 3);
Buton sulama(0, 0);
Buton aydinlatma(0, 1);
Buton otopark(0, 2);
bool havandirmaDurum = false;
bool sulamaDurum = false;
bool aydinlatmaDurum = false;
bool otoparkDurum = false;
void setup() {
Serial.begin(115200);
delay(100);
FixajSS.begin();
delay(500);
if (!FixajSS.EkranTest()) {
Serial.println("bağlantı hatası, kabloları kontrol edin"); //ESP yi veya NANO yu PCB den çıkarıp programı yükleyin sonra PCB takın
//Ekran nın Baud Rate ni de ayarlamayı unutmuş olabilirsiniz.
//SGTools programından projenize sağ tıklayın Prpject properties-> Baud rate
//sonra arayüz tasarımını tekrar Ekrana yükleyin.
}
delay(100);
pinMode(M0, OUTPUT);
pinMode(M1, OUTPUT);
FixajLora.begin();
LoraE32Ayarlar();
digitalWrite(M0, LOW);
digitalWrite(M1, LOW);
delay(500);
Serial.println("Fixaj.com Basliyor...");
}
void loop() {
if (FixajSS.dokunmaDinle()) {
if (FixajSS.butonBasildiMi(sulama)) {
Serial.println("sulama click");
sulamaDurum = !sulamaDurum;
FixajSS.yaz(addrSulama, sulamaDurum);
} else if (FixajSS.butonBasildiMi(aydinlatma)) {
Serial.println("aydinlatma click");
aydinlatmaDurum = !aydinlatmaDurum;
FixajSS.yaz(addrAydinlatma, aydinlatmaDurum);
} else if (FixajSS.butonBasildiMi(otopark)) {
Serial.println("otopark click");
otoparkDurum = !otoparkDurum;
FixajSS.yaz(addrOtopark, otoparkDurum);
} else if (FixajSS.butonBasildiMi(havandirma)) {
Serial.println("havandirma click");
havandirmaDurum = !havandirmaDurum;
FixajSS.yaz(addrHavandirma, havandirmaDurum);
}
}
if (millis() > kanalBekleme_sure + kanalBekleme_bekleme) {
kanalBekleme_sure = millis();
data.btnSulama = sulamaDurum;
data.btnAydinlatma = aydinlatmaDurum;
data.btnOtopark = otoparkDurum;
data.btnHava = havandirmaDurum;
ResponseStatus rs = FixajLora.sendFixedMessage(highByte(GonderilecekAdres), lowByte(GonderilecekAdres), Kanal, &data, sizeof(Signal));
Serial.print("Sonuc: "); Serial.println(rs.getResponseDescription());
}
}
void LoraE32Ayarlar() {
digitalWrite(M0, HIGH);
digitalWrite(M1, HIGH);
ResponseStructContainer c;
c = FixajLora.getConfiguration();
Configuration configuration = *(Configuration*)c.data;
//DEĞİŞEBİLEN AYARLAR
// Üstte #define kısmında ayarlayınız
configuration.ADDL = lowByte(Adres);
configuration.ADDH = highByte(Adres);
configuration.CHAN = Kanal;
//SEÇENEKLİ AYARLAR
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24; //Veri Gönderim Hızı 2,4 varsayılan
//configuration.SPED.airDataRate = AIR_DATA_RATE_000_03; //Veri Gönderim Hızı 0,3 En uzak Mesafe
//configuration.SPED.airDataRate = AIR_DATA_RATE_101_192; //Veri Gönderim Hızı 19,2 En Hızlı
//configuration.OPTION.transmissionPower = POWER_20; //Geönderim Gücü max Varsayılan
//configuration.OPTION.transmissionPower = POWER_10; //Geönderim Gücü min
configuration.OPTION.transmissionPower = POWER_30; // E32 30d modülleri için bunu aktif et
//GELİŞMİŞ AYARLAR
configuration.SPED.uartBaudRate = UART_BPS_9600;
configuration.SPED.uartParity = MODE_00_8N1;
configuration.OPTION.fec = FEC_0_OFF;
//configuration.OPTION.fec = FEC_1_ON;
configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
//configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
// Ayarları KAYDET ve SAKLA
ResponseStatus rs = FixajLora.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
Serial.print("Ayarlar Durum: "); Serial.println(rs.getResponseDescription());
c.close();
}
Röle Tarafı
/* Kernel for the receiver part */
#define E32_TTL_1W // for 30d modules
#include "LoRa_E32.h"
#include <HardwareSerial.h>
// pinout region
#define M0 32
#define M1 33
#define RX 17
#define TX 16
#define L_RX 27 // pins for LoRa
#define L_TX 35 // pins for LoRa x2
#define role1 2
#define role2 4
#define role3 13
#define role4 25
// parameters region
#define Adres 2 // cross values with transmitter setup
#define Kanal 20 // frequency
#define GonderilecekAdres 1 // cross values with transmitter setup
#define password "Fixaj.com"
HardwareSerial fixajSerial1(1);
LoRa_E32 FixajLora(L_TX, L_RX, &fixajSerial1, UART_BPS_RATE_9600);
struct Signal {
char sifre[15] = password;
char konum[15];
bool btnSulama;
bool btnAydinlatma;
bool btnOtopark;
bool btnHava;
} data;
void setup() {
Serial.begin(115200);
while (!Serial) {
;
}
delay(500); // ^^
pinMode(M0, OUTPUT); // define output pins
pinMode(M1, OUTPUT);
pinMode(role1, OUTPUT);
pinMode(role2, OUTPUT);
pinMode(role3, OUTPUT);
pinMode(role4, OUTPUT);
delay(100); // ^^
FixajLora.begin();
LoraE32Ayarlar();
digitalWrite(M0, LOW);
digitalWrite(M1, LOW);
delay(100); // start
Serial.println(F("Booting.. Fixaj.com"));
}
void loop() {
while (FixajLora.available() > 1) { // Reading the message
ResponseStructContainer rsc = FixajLora.receiveMessage(sizeof(Signal));
struct Signal data = *(Signal*)rsc.data;
rsc.close();
if (strcmp(data.sifre, password) == 0) { // Sifre dogru mu
Serial.println(F("Password verified"));
switch (data.btnSulama) {
case true:
Serial.println(F("SULAMA ACILIYOR..."));
digitalWrite(role1, HIGH);
Serial.println(F("____________________"));
Serial.println(F(" "));
Serial.println(F(" "));
break;
case false:
Serial.println(F("Sulama Kapaniyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
Serial.println(F(" "));
digitalWrite(role1, LOW);
break;
}
switch (data.btnAydinlatma) {
case true:
Serial.println(F("Aydinlatma Aciliyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
Serial.println(F(" "));
digitalWrite(role2, HIGH);
break;
case false:
Serial.println(F("Aydinlatma Kapaniyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
Serial.println(F(" "));
digitalWrite(role2, LOW);
break;
}
switch (data.btnOtopark) {
case true:
Serial.println(F("Otopark Aciliyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
Serial.println(F(" "));
digitalWrite(role3, HIGH);
break;
case false:
Serial.println(F("Otopark Kapaniyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
Serial.println(F(" "));
digitalWrite(role3, LOW);
break;
}
switch (data.btnHava) {
case true:
Serial.println(F("Havalandirma Aciliyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
digitalWrite(role4, HIGH);
break;
case false:
Serial.println(F("Havalandirma Kapaniyor..."));
Serial.println(F("____________________"));
Serial.println(F(" "));
digitalWrite(role4, LOW);
break;
}
}
}
}
void LoraE32Ayarlar() {
digitalWrite(M0, HIGH);
digitalWrite(M1, HIGH);
ResponseStructContainer c;
c = FixajLora.getConfiguration();
Configuration configuration = *(Configuration*)c.data;
//DEĞİŞEBİLEN AYARLAR
// Üstte #define kısmında ayarlayınız
configuration.ADDL = lowByte(Adres);
configuration.ADDH = highByte(Adres);
configuration.CHAN = Kanal;
//SEÇENEKLİ AYARLAR
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24; //Veri Gönderim Hızı 2,4 varsayılan
//configuration.SPED.airDataRate = AIR_DATA_RATE_000_03; //Veri Gönderim Hızı 0,3 En uzak Mesafe
//configuration.SPED.airDataRate = AIR_DATA_RATE_101_192; //Veri Gönderim Hızı 19,2 En Hızlı
//configuration.OPTION.transmissionPower = POWER_20; //Geönderim Gücü max Varsayılan
//configuration.OPTION.transmissionPower = POWER_10; //Geönderim Gücü min
configuration.OPTION.transmissionPower = POWER_30; // E32 30d modülleri için bunu aktif et
//GELİŞMİŞ AYARLAR
configuration.SPED.uartBaudRate = UART_BPS_9600;
configuration.SPED.uartParity = MODE_00_8N1;
configuration.OPTION.fec = FEC_0_OFF;
//configuration.OPTION.fec = FEC_1_ON;
configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
//configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
// Ayarları KAYDET ve SAKLA
ResponseStatus rs = FixajLora.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
Serial.print("Ayarlar Durum: "); Serial.println(rs.getResponseDescription());
c.close();
}