Studentă: Alexandra-Diana CHIPER (117182)
Grupă: 335CB
An universitar: 2022-2023
Sistem de alarmă și protecție împotriva inundațiilor și prevenirea accidentelor mortale produse prin electrocutare. Nivelul apei dintr-o încăpere tehnică este permanent monitorizat cu ajutorul unor senzori de nivel al apei. Dacă se detectează prezența apei în încăpere, atunci cu ajutorul unor pompe de apă controlate prin intermediul microcontrollerului, aceasta va fi evacuată în exterior.
Sursă de inspirație (#16):
Când apa atinge nivelul de alertă este pornită pompa de serviciu din bașă. Dacă nivelul apei continuă să crească și ajunge la nivelul de pericol este pornită și a doua pompă de siguranță, cu debit mai mare. Cele două praguri de alertă sunt citite cu ajutorul a doi senzori de nivel al apei, plasați la înălțimi diferite.
Starea curentă a nivelului apei va fi afișată pe un ecran LCD și abstractizată vizual printr-un LED RGB astfel:
Organigrama
Schema electrică
Schemă
Componenta principală este plăcuța arduino, la care se leagă
Componentă | Cantitate |
---|---|
Placă de dezvoltare compatibilă Arduino UNO R3 | 1 |
Senzor de nivel al apei | 2 |
Ecran LCD cu interfață I2C | 1 |
Releu cu comandă high-level 5V | 2 |
Baterie 9V | 1 |
Power bank 5V | 2 |
Cablu USB | 1 |
Conector rapid 3×1 și 5×1 pini | 2 |
Mufă alimentare (mamă + tată) | 2 |
Doză derivație | 1 |
LED RGB | 1 |
Notiuni folosite: Timere, Întreruperi, ADC, I2C, UART
Cu ajutorul Timer-ului 1 de pe plăcuța Arduino se generează o întrerupere la fiecare 0.5s (500 ms) care declanșează startul conversiei AD pentru primul senzor legat la pinul A1 analogic. La rândul său, modulul ADC generează o întrerupere când conversia s-a terminat, iar în rutina de tratare a acestei întreruperi se citește rezultatul într-una din două variabile, în funcție de un flag setat în funcția loop().
La fiecare 0.5s se verifică valoarea primului senzor, care se încadrează apoi între niste praguri astfel:
valoare_senzor < noWater_threshold
noWater_threshold < valoare_senzor < lowerThreshold
lowerThreshold < valoare_senzor < upperThreshold
valoare_senzor > upperThreshold
Starea curentă a sistemului este afișată pe ecranul LCD și în paralel este printată și pe interfața serială.
Se inițializează pinii pentru senzori, relee pentru pompe și led-uri. Se configurează Timer1 și modulul ADC astfel:
void config_timer1() { TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // tc = f_cpu / (prescaler * f_needed) - 1 = f_cpu / prescaler * time - 1 OCR1A = (F_CPU / PRESCALER) * SAMPLING_INTERVAL_S - 1; // Calculate the compare value TCCR1B |= (1 << WGM12); // CTC mode TCCR1B |= (1 << CS12); // 256 prescaler } void init_timer1() { TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt }
void config_adc() { ADMUX = 0; /* AVCC with external capacitor at AREF pin */ ADMUX |= (1 << REFS0); ADCSRA = 0; // Set the ADC prescaler to 128 for a 16MHz clock, giving an ADC clock of 125kHz ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); } void init_adc() { ADCSRA |= (1 << ADEN); // Enable ADC ADCSRA |= (1 << ADIE); // Enable ADC interrupts }
Proiectul funcționează așa cum a fost proiectat. Proiectul poate funcționa atât independent, prin alimentarea plăcuței arduino la o baterie de 9V sau în modul de management, cu plăcuța arduino conectată prin usb la un calculator care are un emulator pentru consola serială, pentru a putea urmării mesajele printate în cazul în care ecranul LCD sau LED-ul de informare se defectează.
Proiectul a fost interesant de realizat, fiind primul proiect de acest fel, care să implice și partea de design și realizare hardware.
A fost overall o experiență nouă (lipit fire, sertizat cbluri, înghesuit și organizat cabluri în cutie, etc) care ar fi putut fi foart plăcută dacă nu erau atâtea deadline-uri în perioada aceasta :(
7 mai 2023
7-14 mai 2023
27-28 mai 2023
28-30 mai 2023