Table of Contents

Flood Security System - Chiper Alexandra-Diana

Studentă: Alexandra-Diana CHIPER (117182)
Grupă: 335CB
An universitar: 2022-2023

Introducere

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.

Pentru cine poate fi util acest proiect?
Acest proiect poate fi util în casele construite în zone ușor inundabile sau pentru cazurile în care nivelul pânzei de apă freatică este fluctuant și apare o defecțiune la flotorul de acționare al pompei de evacuare din bașă.

Sursă de inspirație (#16):

Descriere generală

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:

Dacă imaginile apar prea mici, faceți click pe ele.

Organigrama

Schema electrică

Schemă

Hardware Design

Componenta principală este plăcuța arduino, la care se leagă

Lista de componente

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

Lipituri

Conectare

Finisaje Proiect

Software Design

Notiuni folosite: Timere, Întreruperi, ADC, I2C, UART

Mod de funcționare

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().

Funcția loop()

La fiecare 0.5s se verifică valoarea primului senzor, care se încadrează apoi între niste praguri astfel:

  1. valoare_senzor < noWater_threshold
    • totul este ok
  2. noWater_threshold < valoare_senzor < lowerThreshold
    • se aprinde LED-ul verde pentru a atentiona persoanele de existenta unei pelicule de apă la nivelul podelei
    • ambele pompe de apă sunt oprite
  3. lowerThreshold < valoare_senzor < upperThreshold
    • se aprinde LED-ul albastru pentru a atentiona persoanele de existenta unui strat mai consistent de apă la nivelul podelei
    • prima pompă de apă (cea de capacitate mai mică) este deschisă
    • pompa de capacitate mai mare este închisă
  4. valoare_senzor > upperThreshold
    • se aprinde LED-ul roșu pentru a atentiona persoanele de prezenta unui strat de apă care depășește 30 de cm, adică există posibilitatea de curentare sau de pericole mortale în cazul în care se intră în încăperea afectată fără echipament corespunzător
    • ambele pompe sunt pornite
    • se citește și valoarea celui de-al doilea senzor.
      • dacă acesta detectează prezența apei, atunci cea de-a doua pompă este pornită
      • dacă nu, cea de-a doua pompă este oprită

Starea curentă a sistemului este afișată pe ecranul LCD și în paralel este printată și pe interfața serială.

Funcția setup()

Se inițializează pinii pentru senzori, relee pentru pompe și led-uri. Se configurează Timer1 și modulul ADC astfel:

timer_setup.ino
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
}
adc_setup.ino
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
}

Rezultate Obţinute

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ă.

Demo proiect

Concluzii

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 :(

Jurnal

Bibliografie/Resurse

Resurse

Download

old: flood_alarm.zip

most recent: flood_alarm_2.zip

Export to PDF