Prezentare succinta proiect:
Proiectul consta in realizarea unui sistem de control al luminilor si al prizelor. Monitorizare consum curent, temperatura, umiditate, calitate aer. Deschiderea ușii se va realiza prin introducerea unei parole pe un keypad sau folosind un card rfid. Controlul si monitorizarea se va face de pe o aplicația realizata in flutter si folosind o telecomandă ir. Va conține o cameră esp-cam, care va fi controlata cu doua servomotoare. Alarma se va activa atunci când pătrunde cineva in casa fără sa introducă parola/cardul sau când calitatea aerului este foarte rea. Pentru controlul intensității luminii am creat un dimmer ce folosește pwm, luminile pot fi controlate si bătând din palme, de la telecomanda sau din aplicație. De asemenea putem seta o anumita ora/interval sau atunci când intensitatea luminii scade sub un anumit nivel când sa se aprindă/stingă luminile.
De ce este util un astfel de proiect ?
Prin simplificarea excesivă a proceselor obositoare și obișnuite întâlnite în casele tradiționale, aceasta aduce un nivel de confort și eficiență care poate să nu fie experimentat în altă parte. De exemplu, prin integrarea tehnologiilor inteligente și a automatizării, sarcinile precum controlul temperaturii, securitatea locuinței sau gestionarea energiei sunt gestionate în mod automat și convenabil. Aceste facilități nu numai că economisesc timp și efort, dar și oferă un sentiment de confort și siguranță, lăsându-i pe locatari să se concentreze pe alte aspecte ale vieții lor.
Main Box :
Aceasta este cutia principala care se va conecta la automatele din casa pentru controlul prizelor, becurilor, masurare curent, interactionare cu baza de date.
Box 1 Aceasta este prima cutie care se va monta intr-o camera si care contine mai multi senzori pentru monitorizare si control. Ea va comunica direct cu placuta principala utilizand pinii GPIO.
Box 2
Este la fel ca prima cutie numai ca comunica prin wifi.
Door Lock Box
Usa va putea fi deschisa folosind cardul sau introducand parola pe un keypad. Din meniul acestuia putem schimba parola, schimba limba, adauga/sterge carduri. Datele sunt salvate in EEPROM. Pentru a detecta daca usa a fost deschisa voi folosi un Sensor Hall. Interfonul va comunica cu placuta principala prin UART pentru a trimite semnale de alarma.
Esp-cam
Este o camera directia careia va fi controlata cu 2 servo-motoare.
Medii de dezvoltare:
VS Code - Platformio : Programare placute Android-Studio: Aplicatie telefon
Biblioteci utilizate:
WiFi.h Adafruit_Sensor.h EmonLib.h driver/adc.h Firebase_ESP_Client.h addons/TokenHelper.h IRremote.h SPI.h MFRC522.h EEPROM.h
FirebaseAuth auth; FirebaseConfig config; FirebaseData fbdo;
................ (autentificare si initializare)
Trimitere BD:
Firebase.RTDB.setInt(&fbdo, "Main_box/power_measure", mainBox.power_measure)
Citire BD:
Firebase.RTDB.readStream(&fbddo_light_intensity)
if (fbdo_light_intensity.streamAvailable()) { if (fbdo_light_intensity.dataType() == "int") { mainBox.light_intensity = fbdo_light_intensity.intData(); } }
private DatabaseReference database = FirebaseDatabase.getInstance().getReference(); database.addValueEventListener(new ValueEventListener() { public void onDataChange(final DataSnapshot dataSnapshot) { // Citire BD Long temperature = (Long) dataSnapshot.child("Room2").child("Temperature").getValue(); Long gassensor = (Long) dataSnapshot.child("Room2").child("Gas_sensor_value").getValue(); // Scriere BD dataSnapshot.getRef().child("Room2").child("Relay1").setValue(true); }
Functia verifica daca au fost exact 2 batai intr-un anumit interval de timp
void claps_function(int sensorPin, bool *signalToRelayPin) { int soundValue = digitalRead(sensorPin); currentNoiseTime = millis(); if (soundValue == 1) { // if there is currently a noise if ( (currentNoiseTime > lastNoiseTime + 200) && (lastSoundValue == 0) && (currentNoiseTime < lastNoiseTime + 800) && (currentNoiseTime > lastLightChange + 1000) ) { \*signalToRelayPin = !(*signalToRelayPin); lastLightChange = currentNoiseTime; } lastNoiseTime = currentNoiseTime; } lastSoundValue = soundValue; }
Primeste comenzi de la telecomanda si in functie de acestea seteaza variabilele necesare Pentru a nu citi prea rapid comenzi si nu a trimite date prea des la baza de date an facut un delay pentru fiecare folosind functia millis()
if (IrReceiver.decode()) { IrReceiver.resume(); irCommand = IrReceiver.decodedIRData.command; if (millis() - debouncing_delay > 200){ // up if (irCommand == 64) { room1.relay1 = !room1.relay1; relayStatus = true; } // ok if (irCommand == 70) { room1.relay2 = !room1.relay2; relayStatus = true; } // # if (irCommand == 74) { room1.alarm = !room1.alarm; digitalWrite(BUZZER_PIN, room1.alarm); if (mainBox.deactivate_alarm) { digitalWrite(BUZZER_PIN, LOW); } update_db_buzzer = 1; } ................ debouncing_delay = millis(); irCommand = 0; } update_db_time = millis(); }
Parola si cartelele sunt salvate in eeprom pentru a nu pierde informatia la resetare.
if (EEPROM.read(EE_START_ADDR) == KEY_DATA) { savedTags = EEPROM.read(EE_START_ADDR + ADDRESS_TAGS); } // Verify if EEPROM contain key data, clear the memory if not else { for (int i = 0; i < EEPROM.length(); i++) { EEPROM.update(i, 0x00); } for (int i = 0; i < 6; i++) { // Writing a default password when first time uploading EEPROM.update(i + 6, '1'); } } EEPROM.update(EE_START_ADDR, KEY_DATA);
for (int i = 0; i < 6; i++) { compPassword[i] = EEPROM.read(i + PASSWORD_ADDRESS); // Reading the password from EEPROM Serial.print(compPassword[i]); }
// Adding and deleting new tag in/from EEPROM bool saveOrDeleteTag(uint8_t *tag, uint8_t size) { int16_t tagAddr = foundTag(tag, size); // search the tag uint16_t newTagAddr = (savedTags * 8) + EE_START_ADDR + ADDRESS_TAGS; // last tag addres if (tagAddr >= 0) { // deleting the tag for (uint8_t i = 0; i < 8; i++) { EEPROM.write(tagAddr + i, 0x00); // deleting old tag EEPROM.write(tagAddr + i, EEPROM.read((newTagAddr - 8) + i)); // writing new tag EEPROM.write((newTagAddr - 8) + i, 0x00); } EEPROM.write(EE_START_ADDR + 1, savedTags --); // write in EEPROM number of tags return false; } else if (savedTags < MAX_TAGS) { for (uint16_t i = 0; i < size; i++) EEPROM.write(i + newTagAddr, tag[i]); // write new tag EEPROM.write(EE_START_ADDR + 1, ++savedTags); // write number of tags } else { return false; } return true; }
Inchidere Usa:
Introducere parola pe numpad pentru a deschide usa; Apropiere cartela pentru a deschide usa; Cand usa este deschisa tastare "***" pentru a intra in meniul de setari unde putem schimba parola, limba(RO, EN, FR), adauga/sterge cartele; Usa se incuie automat dupa cateva secunde daca este inchisa.
Cutie 1 si 2:
Afisare temperatura, umiditate, calitate aer pe telefon; Activare/dezactivare becuri, prize, alarma de la telecomanda sau telefon; Aprinde/stinge luminile, batand de doua ori din palme; Aprinde lumina daca intensitatea luminii este mai mica de un prag; Activare/Dezactivare becuri, prize, alarma intrun anumit interval; Setare intensitate lumina de la telecomanda sau din aplicatie; Afisare curent consumat in aplicatie; Activare alarma daca cineva a patruns in casa sau daca calitatea aerului este rea; Afisare status cutii utilizand ledurile montate.
Resurse Software:
https://randomnerdtutorials.com/esp32-pwm-arduino-ide/
https://medium.com/@khantalha7367/uart-communication-on-esp32-28fd3df3b6eb
https://randomnerdtutorials.com/esp32-esp8266-firebase-authentication/
https://developer.android.com/
Resurse Hardware:
https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
https://www.instructables.com/AC-PWM-Dimmer-for-Arduino/
https://diyprojectslab.com/measure-ac-current-using-arduino-and-sct-013/