This shows you the differences between two versions of the page.
|
pm:prj2024:vstoica:dragos.coscodan [2024/05/27 01:11] dragos.coscodan [Software Design] |
pm:prj2024:vstoica:dragos.coscodan [2024/05/30 23:53] (current) dragos.coscodan [Rezultate Obţinute] |
||
|---|---|---|---|
| Line 140: | Line 140: | ||
| + | ==== Descrierea codului aplicaţiei: ==== | ||
| + | |||
| + | |||
| + | |||
| + | |||
| <note tip> | <note tip> | ||
| - | Descrierea codului aplicaţiei (firmware): | ||
| - | ** Mediu de dezvoltare:** | + | ** Medii de dezvoltare:** |
| + | VS Code - Platformio : Programare placute | ||
| + | Android-Studio: Aplicatie telefon | ||
| - | - VS Code - Platformio : Programare placute | + | **Biblioteci utilizate:** |
| - | - Android-Studio: Aplicatie telefon | + | 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 | ||
| - | **Biblioteci utilizate:** | + | </note> |
| - | - Arduino.h | + | === Baza de date === |
| - | - WiFi.h | + | Baza de date folosita pentru a stoca informatia si pentru a comunica cu telefonul este Firebase |
| - | - Adafruit_Sensor.h | + | {{:pm:prj2024:vstoica:dragos.coscodan_firebase.png?400|}} |
| - | - EmonLib.h | + | == Comunicare esp cu baza de date: == |
| + | |||
| - | - driver/adc.h | ||
| - | - Firebase_ESP_Client.h | + | FirebaseAuth auth; |
| + | FirebaseConfig config; | ||
| + | FirebaseData fbdo; | ||
| - | - addons/TokenHelper.h | + | ................ (autentificare si initializare) |
| - | - IRremote.h | ||
| - | - | ||
| - | </note> | ||
| + | **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|}} | ||
| Line 175: | Line 350: | ||
| ===== 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> | ||