Water dispenser

Student: Vîrţan Alina-Elena

Grupa: 331CC

Introducere

Ştiai că aproximativ 71% din suprafaţa pământului este repezentată de apă, dar doar 2.5% din apa disponibilă este potabilă? Apa este o resursă vitală, însă noi, oamenii, risipim din neglijenţă cantităţi îngrijorătoare de apă. Dacă am înlocui toate robinetele manuale cu robinete inteligente, care să se deschidă şi să se închida automat, am economisi, în timp, o cantitate considerabilă de apă.

Proiectul are ca scop stoparea risipei de apă potabilă şi presupune construirea unui dozator automat care toarnă cantitatea necesară de apă când plasezi un pahar sub el.

Descriere generală

Dozatorul de apă îşi propune să înlocuiască robinetul manual cu unul inteligent, capabil să se se declanşeze automat.

Principiul care stă la baza dozatorului este unul simplu: automatul se declanşează şi toarnă lichidul când detectează că un pahar este plasat sub rezervor.

Se va folosi senzorul ultrasonic HC-SR04 pentru a detecta dacă un obiect este poziţionat sub dozator. Odată ce detectează obiectul, dozatorul va turna apă şi se va opri când paharul este umplut.

Hardware Design

Lista de piese

Schema electrică

Software Design

  • Limbaj de programare folosit: C
  • Mediu de dezvoltare si compilare: Arduino IDE

Pompa de aer/apă

  • Este pusă în funcţiune de un motor DC intern
  • Are ataşate 2 furtunuri: unul trage apa din sticla, altul evacuează apa în pahar
  • Motorul DC este responsabil pentru generarea energiei cinetice care extrage apa din intrare şi o trimite prin ieşire
  • Intrarea, conectată la primul furtun, este locul prin care lichidul este absorbit din rezervorul de apă
  • Ieşirea, conectată la cel de-al doilea furtun, este admisia prin care va ieși lichidul propulsat de puterea pompei de apă

Modul releu

  • Controlează starea pompei (închisă sau deschisă) prin macro-ul relayPin (pinul 10)
  • Modulul releu va acţiona asupra pompei în funcţie de distanţa detectată de senzorul ultrasonic: dacă distanţa dintre senzor şi obiect este mai mică de 15 cm, este pornit motorul pompei şi se începe procesul de extragere şi evacuare a apei, altfel, motorul este oprit şi pompa stă în repaus.
void setup() {
  // put your setup code here, to run once:
  pinMode(relayPin, OUTPUT);
  ...
}
 
void loop() {
  // put your main code here, to run repeatedly:
  centimeter = readUltrasonicDistance() / 58.00;
  if (centimeter < 15) {
    delay(500);
    centimeter = readUltrasonicDistance() / 58.00;
    if (centimeter < 15) {
      digitalWrite(relayPin, HIGH);
      ...
    } else {
      digitalWrite(relayPin, LOW);
      ...
    }
  } else {
    digitalWrite(relayPin, LOW);
    ...
  }
}

Leduri

Ledul roşu:

  • se aprinde când pompa începe să evacueze apă în pahar
  • rămâne în starea activă pe tot parcursul perioadei în care lichidul este turnat

Ledul verde:

  • stă aprins pe toată perioada în care dozatorul este în stare de repaus, adică nu toarnă lichid
  • se stinge când începe procesul de turnare a apei în pahar şi se reaprinde când paharul s-a umplut
void setup() {
  // put your setup code here, to run once:
  pinMode(greenLed, OUTPUT);
  pinMode(redLed, OUTPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  centimeter = readUltrasonicDistance() / 58.00;
  if (centimeter < 15) {
    delay(500);
    centimeter = readUltrasonicDistance() / 58.00;
    if (centimeter < 15) {
      .....
      digitalWrite(greenLed, LOW);
      digitalWrite(redLed, HIGH);
    } else {
      .....
      digitalWrite(greenLed, HIGH);
      digitalWrite(redLed, LOW);
    }
  } else {
    .....
    digitalWrite(greenLed, HIGH);
    digitalWrite(redLed, LOW);
  }
}

Senzor ultrasonic

  • Seonzorul citeşte date din mediul exterior folosind sunete ultrasonice
  • Se activează când paharul se află la o distanţă mai mică de 15 cm de el
  • Acesta întoarce numărul de microsecunde parcurs de sunet de la senzor până la obiect şi înapoi
  • Pentru a putea converti din microsecunde în centimetri, putem să ne folosim de următoarea formulă: distance = (time x speedOfSound) / 2
/* Ultrasonic Module pins 
 * 
 * triggerPin: 10 microsecond high pulse causes sharp sound , wait 50 us
 * echoPin: Width of high pulse indicates distance
 */
const int triggerPin = 11;
const int echoPin = 12;
 
 
// ultrasonic sensor distance
int centimeter = 0;
 
long readUltrasonicDistance() {
  pinMode(triggerPin, OUTPUT);  // Clear the trigger
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  return pulseIn(echoPin, HIGH);
}

Buzzer

  • Stă în stare activă cât timp apa este turnată în pahar
  // Pink Panther theme
 
int melody[] = {
  REST,2, REST,4, REST,8, NOTE_DS4,8, 
  NOTE_E4,-4, REST,8, NOTE_FS4,8, NOTE_G4,-4, REST,8, NOTE_DS4,8,
  NOTE_E4,-8, NOTE_FS4,8,  NOTE_G4,-8, NOTE_C5,8, NOTE_B4,-8, NOTE_E4,8, NOTE_G4,-8, NOTE_B4,8,   
  NOTE_AS4,2, NOTE_A4,-16, NOTE_G4,-16, NOTE_E4,-16, NOTE_D4,-16, 
  NOTE_E4,2, REST,4, REST,8, NOTE_DS4,4,
 
  NOTE_E4,-4, REST,8, NOTE_FS4,8, NOTE_G4,-4, REST,8, NOTE_DS4,8,
  NOTE_E4,-8, NOTE_FS4,8,  NOTE_G4,-8, NOTE_C5,8, NOTE_B4,-8, NOTE_G4,8, NOTE_B4,-8, NOTE_E5,8,
  NOTE_DS5,1,   
  NOTE_D5,2, REST,4, REST,8, NOTE_DS4,8, 
  NOTE_E4,-4, REST,8, NOTE_FS4,8, NOTE_G4,-4, REST,8, NOTE_DS4,8,
  NOTE_E4,-8, NOTE_FS4,8,  NOTE_G4,-8, NOTE_C5,8, NOTE_B4,-8, NOTE_E4,8, NOTE_G4,-8, NOTE_B4,8,   
 
  NOTE_AS4,2, NOTE_A4,-16, NOTE_G4,-16, NOTE_E4,-16, NOTE_D4,-16, 
  NOTE_E4,-4, REST,4,
  REST,4, NOTE_E5,-8, NOTE_D5,8, NOTE_B4,-8, NOTE_A4,8, NOTE_G4,-8, NOTE_E4,-8,
  NOTE_AS4,16, NOTE_A4,-8, NOTE_AS4,16, NOTE_A4,-8, NOTE_AS4,16, NOTE_A4,-8, NOTE_AS4,16, NOTE_A4,-8,   
  NOTE_G4,-16, NOTE_E4,-16, NOTE_D4,-16, NOTE_E4,16, NOTE_E4,16, NOTE_E4,2,
 
};
 
void loop() {
      // iterate over the notes of the melody.
      for (int thisNote = 0; thisNote < notes * 2 && centimeter < 15; thisNote = thisNote + 2) {
        // calculates the duration of each note
        divider = melody[thisNote + 1];
        if (divider > 0) {
          // regular note, just proceed
          noteDuration = (wholenote) / divider;
        } else if (divider < 0) {
          // dotted notes are represented with negative durations!!
          noteDuration = (wholenote) / abs(divider);
          noteDuration *= 1.5; // increases the duration in half for dotted notes
        }
 
        // we only play the note for 95% of the duration, leaving 5% as a pause
        tone(buzzer, melody[thisNote], noteDuration * 0.95);
 
        // Wait for the specief duration before playing the next note.
        delay(noteDuration);
 
        // stop the waveform generation before the next note.
        noTone(buzzer);
}

Rezultate obţinute

Prima variantă funcţională de legare a componentelor pe plăcuţă. În acest stadiu, testam doar funcţionalitatea, fără să construiesc faţada dozatorului.

Ulterior, am regândit aranjarea componentelor. Am legat totul într-un mod mai aerisit. În acest stadiu, începusem deja să construiesc faţada dozatorului şi îmi puneam problema cum o să lipesc componentele în interiorul cutiei.

În final, acesta este rezultatul faţadei dozatorului. În interior, se află componentele lipite de o parte şi de alta a pereţilor dozatorului.

Demo

Download

Cod sursa: water_dispenser.zip

Jurnal

  • 19.05.2021: Testare individuală a componentelor pentru a verifica funcţionalitatea lor + acomodarea cu multimetrul ca instrument de debugging
  • 20.05.2021: Lipirea firelor la bornele pompei cu diafragmă, legarea modulului releu şi ajustarea distanţei de detecţie pentru senzorul ultrasonic.
  • 21.05.2021: Adăugarea a două leduri, unul roşu şi unul verde, care să semnaleze starea dozatorului: când acesta este liber, ledul verde este aprins şi cel roşu stins, iar când acesta este ocupat (toarnă apă), ledul roşu este aprins şi cel verde stins.
  • 01.06.2021: Adăugarea unui buzzer pasiv care redă o partitură din The Pink Panther cât timp dozatorul toarnă apă în pahar + realizarea design-ului pentru dozator şi construirea suportului acestuia din carton.
  • 03.06.2021: Realizarea schemei electrice şi adăugarea buzzerului în schema bloc.
  • 04.06.2021: Finalizarea paginii de wiki: adăugarea părţii de software design, rezultatele obţinute şi concluziile.

Concluzii

  • În final, consider că proiectul a fost o provocare pentru mine. De la mândria pe care am resimţit-o când am lipit firele la bornele pompei de apă, la spaima pe care am tras-o când am inversat polaritatea buzzerului, crezând că l-am ars, şi până la încercările repetate de a face debugging cu multimetrul, proiectul m-a trecut printr-un rollercoaster de emoţii din care am avut foarte multe de învăţat.
  • Proiectul este util nu doar pentru a încetini risipa de apă, ci şi pentru cei care consumă apă îmbuteliată şi, de fiecare dată când doresc să-şi pună apă în pahar sau cană, sunt nevoiţi să ridice un bidon de 5l sau 10l, ceea ce uneori poate fi obositor.

Bibliografie

pm/prj2021/apredescu/water_dispenser.txt · Last modified: 2021/06/04 20:21 by alina_elena.virtan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0