This shows you the differences between two versions of the page.
pm:prj2024:vstoica:dragos.coscodan [2024/05/03 14:45] dragos.coscodan [Introducere] |
pm:prj2024:vstoica:dragos.coscodan [2024/05/30 23:53] (current) dragos.coscodan [Rezultate Obţinute] |
||
---|---|---|---|
Line 11: | Line 11: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | <note tip> | + | **Main Box :** |
- | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | |
- | + | Aceasta este cutia principala care se va conecta la automatele din casa pentru controlul prizelor, becurilor, masurare curent, interactionare cu baza de date. | |
- | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | + | |
- | </note> | + | {{:pm:prj2024:vstoica:dragos.coscodan.Main_box.png?400|}} |
- | + | ||
+ | **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. | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.box_1.1.png?400|}} | ||
+ | |||
+ | **Box 2** | ||
+ | |||
+ | Este la fel ca prima cutie numai ca comunica prin wifi. | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.box_2.1.png?400|}} | ||
+ | |||
+ | **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. | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.Interphone.png?400|}} | ||
+ | |||
+ | **Esp-cam** | ||
+ | |||
+ | Este o camera directia careia va fi controlata cu 2 servo-motoare. | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.esp-cam.png?400|}} | ||
+ | |||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | + | ||
- | <note tip> | + | ==== Lista piese: ==== |
- | Aici puneţi tot ce ţine de hardware design: | + | |
- | * listă de piese | + | |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | * Esp32 x2 |
- | * diagrame de semnal | + | * Esp-cam |
- | * rezultatele simulării | + | * Arduino Nano |
- | </note> | + | * Placa PCB prototipare |
- | + | * Relee x4 | |
+ | * Header pini | ||
+ | * Conectori XH2.54 | ||
+ | * Conectori screw-in x20 | ||
+ | * Convertor 220V-5V | ||
+ | * Current sensor CT 013 | ||
+ | * LEDs x3 | ||
+ | * Cablu UTP ~1m | ||
+ | * Cablu eletric 2.5mm ~2m | ||
+ | * Power button | ||
+ | * Fotorezistori x2 | ||
+ | * Telecomanda IR | ||
+ | * Sensor IR x2 | ||
+ | * Sensor DHT11 x2 | ||
+ | * Buzzer x2 | ||
+ | * Sensor MQ-2 x2 | ||
+ | * Microfon x2 | ||
+ | * Acumulator 18650 x2 | ||
+ | * Convertor Step-Up | ||
+ | * Modul incarcare | ||
+ | * LCD 16x2 | ||
+ | * Keypad | ||
+ | * Servo-motor x3 | ||
+ | * Sensor Hall | ||
+ | * Magneti | ||
+ | * Modul RFID | ||
+ | * MOSFET | ||
+ | * Punte redresoare | ||
+ | * Condensator 100uF | ||
+ | * Dioda Zenner 15V | ||
+ | * Dioda | ||
+ | * Resistori 100k, 10k, 330, 220 | ||
+ | * Optocoupler | ||
+ | |||
+ | ==== Scheme electrice ==== | ||
+ | |||
+ | **Schematics:** | ||
+ | |||
+ | [[https://github.com/Dragosh-C/Smart-Home-Box/blob/main/Main_box_2_schem.png|Main_box + Box1]] | ||
+ | |||
+ | [[https://github.com/Dragosh-C/Smart-Home-Box/blob/main/interphone%2Bcamera_schem.png|Interfon + Camera]] | ||
+ | |||
+ | [[https://github.com/Dragosh-C/Smart-Home-Box/blob/main/Main_box_2_schem.png|Box 2]] | ||
+ | |||
+ | |||
+ | |||
+ | === Main Box + Box 1 === | ||
+ | |||
+ | |||
+ | {{:pm:prj2024:vstoica:Main_box+box1.dragos.coscodan.png?400|}} | ||
+ | |||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_main+box1.jpg?400|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_box1.jpg?400|}} | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === Interfon + Camera === | ||
+ | |||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.interphone+camera_bb.png?400|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_lock1.jpg?400|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscoan_lock2.jpg?400|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_camera.jpg?400|}} | ||
+ | |||
+ | |||
+ | |||
+ | === Box 2 === | ||
+ | |||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.box2.png?400|}} | ||
+ | |||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.box2.1.jpg?400|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan.box2.2.jpg?400|}} | ||
+ | |||
+ | |||
+ | |||
===== Software Design ===== | ===== Software Design ===== | ||
+ | ==== Descrierea codului aplicaţiei: ==== | ||
+ | |||
+ | |||
+ | |||
+ | |||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | ** Medii de dezvoltare:** |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | VS Code - Platformio : Programare placute |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | Android-Studio: Aplicatie telefon |
- | * (etapa 3) surse şi funcţii implementate | + | |
+ | **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 | ||
</note> | </note> | ||
+ | |||
+ | === Baza de date === | ||
+ | |||
+ | Baza de date folosita pentru a stoca informatia si pentru a comunica cu telefonul este Firebase | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_firebase.png?400|}} | ||
+ | |||
+ | == Comunicare esp cu baza de date: == | ||
+ | |||
+ | |||
+ | |||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | == Comunicare aplicatie cu baza de date: == | ||
+ | |||
+ | |||
+ | 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); | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | == Functie stingere/aprindere lumina batand din palme == | ||
+ | |||
+ | 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; | ||
+ | } | ||
+ | |||
+ | == Citire date telecomanda IR == | ||
+ | |||
+ | 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(); | ||
+ | } | ||
+ | |||
+ | == Citire si scriere EEPROM pe Arduino Nano == | ||
+ | |||
+ | 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]); | ||
+ | } | ||
+ | |||
+ | == Stergere/Scriere cartele == | ||
+ | | ||
+ | // 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; | ||
+ | } | ||
+ | |||
+ | == Poze aplicatie == | ||
+ | |||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_room_2.jpg?400|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:dragos.coscodan_power_measure.jpg?400|}} | ||
+ | |||
+ | |||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | **Inchidere Usa:** |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | Introducere parola pe numpad pentru a deschide usa; |
- | + | Apropiere cartela pentru a deschide usa; | |
- | ===== Concluzii ===== | + | 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. | ||
+ | |||
+ | |||
+ | [[https://youtu.be/betq2JxMFPk?si=Z8a8zUScWK3Z1pHi|Video 1]] | ||
+ | [[https://youtube.com/shorts/bQj4MoAs6Ao?si=cfGHVuRVleRzV3eR|Video 2]] | ||
+ | [[https://youtube.com/shorts/dKRBe61gDRw?si=bTGLbOu1wot8lc-2|Video 3]] | ||
+ | |||
+ | |||
+ | |||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | {{:pm:prj2024:vstoica:dragos.coscodan.smart_home.zip|}} |
- | + | ||
- | Fişierele se încarcă pe wiki folosind facilitatea *Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul *:pm:prj20??:c?* sau *:pm:prj20??:c?:nume_student** (dacă este cazul). *Exemplu:* Dumitru Alin, 331CC -> *:pm:prj2022:cc:dumitru_alin*. | + | |
- | </note> | + | |
- | + | ||
- | ===== Jurnal ===== | + | |
- | + | ||
- | <note tip> | + | |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
- | </note> | + | |
+ | |||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe *Resurse Software* şi *Resurse Hardware*. | + | **Resurse Software: |
- | </note> | + | ** |
+ | |||
+ | 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/ | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||