Sim800L Gsm Modul ile IoT Entegrasyonu
Ev Otomasyonu için SIM800C ile İnternet Üzerinden Kontrol: Röleler, Akım Sensörleri ve IoT Entegrasyonu
Giriş:
Ev otomasyonu, günümüzdeki akıllı ev trendinin temelini oluştururken, cihazlarımızı ve evlerimizi daha da akıllı hale getirmemize yardımcı oluyor. Bu makalede, SIM800C modülünü kullanarak ev otomasyonunu bir adım ileri taşımak için nasıl bir projeyi hayata geçirebileceğinizi keşfedeceksiniz. SIM800C, internete bağlanabilen ve SMS gönderebilen bir GSM/GPRS modülüdür. Bu proje, SIM800C'yi kullanarak evinizdeki röleleri kontrol etmenizi, akım sensörleri aracılığıyla rölelerin çalışma durumunu izlemenizi ve IoT sunucusuyla entegrasyon yapmanızı sağlayacaktır.
Makalenin İçeriği:
1. SIM800C Modülü ve Bağlantıları: SIM800C modülünün özellikleri, bağlantıları ve ESP32 ile nasıl entegre edileceği hakkında bilgi verilecektir. Ayrıca, modülün çalıştırılması ve seri iletişim ayarları da açıklanacaktır.
2. Rölelerin Kontrolü: SIM800C modülü aracılığıyla SMS göndererek röleleri açma ve kapama işlemlerinin nasıl gerçekleştirileceği anlatılacaktır. Master telefon numarasının belirlenmesi, şifre koruması ve yeni telefon numaralarının eklenmesi gibi güvenlik önlemleri de ele alınacaktır.
3. Akım Sensörleri ve Durum İzleme: Rölelerin çalışma durumunu izlemek için akım sensörleri kullanılacaktır. Akım sensörleriyle motorların çektiği akım değerleri ölçülecek ve ilk çalışmada bu değerlerin SMS ile bildirilmesi sağlanacaktır.
4. IoT Entegrasyonu: Rölelerin durumu ve akım değerleri, IoT sunucusuna (örneğin 192.168.1.45) HTTP GET isteği göndererek gönderilecektir. Bu şekilde, canlı olarak rölelerin durumu ve akım değerlerini izleyebileceğiniz bir IoT platformu oluşturabilirsiniz.
5. Ek Özellikler: DTMF sinyalleri aracılığıyla röleleri açma ve kapama, master telefon numarasının değiştirilmesi, telefon numaralarının eklenmesi gibi ek özellikler de projeye entegre edilecektir.
Sonuç:
Bu makalede, SIM800C modülünü kullanarak ev otomasyonu için bir proje geliştirmenin temel adımlarını öğrendiniz. Rölelerin kontrol edilmesi, akım sensörleri aracılığıyla durum izleme ve IoT sunucusuyla entegrasyon gibi işlevlerle, evinizin kontrolünü ve izlemesini daha da akıllı hale getirebilirsiniz. Bu projeyi uygulayarak, ev otomasyonunda ileri seviyede bir deneyim elde edebilirsiniz.
#include <SoftwareSerial.h>
#include <EEPROM.h>
#include <WiFi.h>
#include <HTTPClient.h>
SoftwareSerial sim800c(2, 3); // ESP32'nin RX ve TX pinlerine bağlanan SIM800C
const int RELAY_PIN_1 = 4; // Röle 1 kontrol pini
const int RELAY_PIN_2 = 5; // Röle 2 kontrol pini
const int CURRENT_SENSOR_PIN_1 = A0; // Röle 1 akım sensörü pin
const int CURRENT_SENSOR_PIN_2 = A1; // Röle 2 akım sensörü pin
String masterPhoneNumber; // Master telefon numarası
String secondaryPhoneNumber; // İkincil telefon numarası
const String PASSWORD = "1234"; // Şifre
const char* ssid = "your_wifi_ssid"; // WiFi ağı adı
const char* password = "your_wifi_password"; // WiFi şifresi
const char* serverIP = "192.168.1.45"; // IoT sunucusunun IP adresi
const int serverPort = 80; // IoT sunucusunun portu
void setup() {
Serial.begin(9600);
sim800c.begin(9600);
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
pinMode(CURRENT_SENSOR_PIN_1, INPUT);
pinMode(CURRENT_SENSOR_PIN_2, INPUT);
connectToWiFi();
delay(2000);
sendCommand("AT"); // Modülü kontrol etmek için AT komutu gönder
delay(1000);
sendCommand("AT+CMGF=1"); // SMS modunu metin moduna ayarla
delay(1000);
sendCommand("AT+CNMI=2,2,0,0,0"); // Gelen SMS mesajlarını seri porta yönlendir
delay(1000);
masterPhoneNumber = readPhoneNumberFromEEPROM(0); // EEPROM'dan master telefon numarasını oku
secondaryPhoneNumber = readPhoneNumberFromEEPROM(20); // EEPROM'dan ikincil telefon numarasını oku
}
void loop() {
// SMS mesajlarını kontrol et
checkSMS();
// DTMF sinyallerini kontrol et
checkDTMF();
// Akım değerlerini oku
float current1 = readCurrent(CURRENT_SENSOR_PIN_1);
float current2 = readCurrent(CURRENT_SENSOR_PIN_2);
// İlk çalışmada akım değerlerini SMS olarak gönder
static bool isFirstRun = true;
if (isFirstRun) {
sendSMS(masterPhoneNumber, "Motorlar çalıştı.\nRöle 1 Akım Değeri: " + String(current1) + "A\nRöle 2 Akım Değeri: " + String(current2) + "A");
isFirstRun = false;
}
// Akım ve voltaj değerlerini IoT sunucusuna gönder
sendDataToServer(current1, current2);
// Diğer işlemler...
}
void checkSMS() {
if (sim800c.available()) {
String sms = sim800c.readString();
Serial.println(sms);
if (sms.indexOf("#") != -1 && sms.indexOf("*") != -1) {
int passwordStartIndex = sms.indexOf("#") + 1;
int passwordEndIndex = sms.indexOf("*");
String passwordAttempt = sms.substring(passwordStartIndex, passwordEndIndex);
if (passwordAttempt == PASSWORD) {
int masterNumberStartIndex = passwordEndIndex + 1;
int masterNumberEndIndex = sms.length();
String newMasterNumber = sms.substring(masterNumberStartIndex, masterNumberEndIndex);
masterPhoneNumber = newMasterNumber;
writePhoneNumberToEEPROM(0, masterPhoneNumber); // Master telefon numarasını EEPROM'a kaydet
sendSMS(masterPhoneNumber, "Master telefon numarası güncellendi.");
} else {
sendSMS(masterPhoneNumber, "Geçersiz şifre.");
}
}
}
}
void checkDTMF() {
if (sim800c.available()) {
String dtmf = sim800c.readString();
Serial.println(dtmf);
if (dtmf.indexOf("1") != -1 && isAuthorizedPhoneNumber("")) {
digitalWrite(RELAY_PIN_1, HIGH); // Röle 1'i aç
sendSMS(masterPhoneNumber, "Röle 1 açıldı.");
} else if (dtmf.indexOf("2") != -1 && isAuthorizedPhoneNumber("")) {
digitalWrite(RELAY_PIN_1, LOW); // Röle 1'i kapat
sendSMS(masterPhoneNumber, "Röle 1 kapatıldı.");
} else if (dtmf.indexOf("3") != -1 && isAuthorizedPhoneNumber("")) {
digitalWrite(RELAY_PIN_2, HIGH); // Röle 2'yi aç
sendSMS(masterPhoneNumber, "Röle 2 açıldı.");
} else if (dtmf.indexOf("4") != -1 && isAuthorizedPhoneNumber("")) {
digitalWrite(RELAY_PIN_2, LOW); // Röle 2'yi kapat
sendSMS(masterPhoneNumber, "Röle 2 kapatıldı.");
}
}
}
float readCurrent(int sensorPin) {
int sensorValue = analogRead(sensorPin);
float voltage = sensorValue * (5.0 / 1023.0); // Vref = 5V
float current = voltage / 0.185; // Akım sensörünün hassasiyeti (185mV/A) için düzeltme faktörü
return current;
}
void sendDataToServer(float current1, float current2) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "http://" + String(serverIP) + ":" + String(serverPort);
url += "?current1=" + String(current1);
url += "¤t2=" + String(current2);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("HTTP Response Code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("HTTP Error: ");
Serial.println(httpResponseCode);
}
http.end();
}
}
void connectToWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void sendCommand(String command) {
sim800c.println(command);
delay(1000);
while (sim800c.available()) {
Serial.write(sim800c.read());
}
}
void sendSMS(String phoneNumber, String message) {
sim800c.println("AT+CMGS=\"" + phoneNumber + "\"");
delay(1000);
sim800c.println(message);
delay(1000);
sim800c.write(26);
delay(1000);
}
bool isAuthorizedPhoneNumber(String sms) {
return sms.indexOf(masterPhoneNumber) != -1 || sms.indexOf(secondaryPhoneNumber) != -1;
}
String readPhoneNumberFromEEPROM(int address) {
String phoneNumber = "";
for (int i = 0; i < 20; i++) {
char character = EEPROM.read(address + i);
if (character != '\0') {
phoneNumber += character;
} else {
break;
}
}
return phoneNumber;
}
void writePhoneNumberToEEPROM(int address, String phoneNumber) {
int phoneNumberLength = phoneNumber.length();
for (int i = 0; i < phoneNumberLength; i++) {
EEPROM.write(address + i, phoneNumber[i]);
}
EEPROM.write(address + phoneNumberLength, '\0');
EEPROM.commit();
}
kodda, WiFi.h ve HTTPClient.h kütüphaneleri eklenmiştir. Ayrıca connectToWiFi() ve sendDataToServer() fonksiyonları eklenmiştir. connectToWiFi() fonksiyonu, WiFi ağına bağlanmayı ve bağlantı sağlandığında bunu seri porta yazmayı sağlar.
sendDataToServer() fonksiyonu, current1 ve current2 değerlerini IoT sunucusuna HTTP GET isteği göndererek gönderir. İkinci telefon numarası ile ilgili olarak herhangi bir değişiklik yapmadım çünkü sadece master numarayı değiştirme talebiniz vardı.
Kodu projenizde kullanmadan önce, WiFi ağı adını ve şifresini ssid ve password değişkenlerine ayarlamayı unutmayın. Ayrıca, IoT sunucusunun IP adresini serverIP değişkenine ve portunu serverPort değişkenine ayarlayın.
Ünal KURTGÖZ (Yazar)
Hayal gücü bilgiden kıymetlidir.
Makaleleri
16
Makale Okunması
85869
Yorumunuz Gönder