This shows you the differences between two versions of the page.
pm:prj2024:iotelea:gabriel.comisaru [2024/05/17 22:17] gabriel.comisaru [Jurnal] |
pm:prj2024:iotelea:gabriel.comisaru [2024/05/26 23:30] (current) gabriel.comisaru [Rezultate Obţinute] |
||
---|---|---|---|
Line 4: | Line 4: | ||
<note tip> | <note tip> | ||
**Nume: Comisaru Gabriel-Cornel\\ | **Nume: Comisaru Gabriel-Cornel\\ | ||
- | Grupa: 331CB\\ | + | Grupa: 331CB** |
- | Îndrumător: Ionuț Oțelea** | + | |
</note> | </note> | ||
Line 13: | Line 12: | ||
Modul de functionare al automatului va fi urmatorul: | Modul de functionare al automatului va fi urmatorul: | ||
- | * Senzorul de temperatura masoara valoarea temperaturii din incapere la fiecare moment de timp. | + | * Senzorul de temperatura masoara valoarea temperaturii din incapere la fiecare moment de timp |
* Informatia este procesata si se afiseaza pe un ecran LCD temperatura curenta | * Informatia este procesata si se afiseaza pe un ecran LCD temperatura curenta | ||
* Cand temperatura trece de un anumit threshold setat anterior utilizand joystick-ul, ventilatorul si pompa de apa vor porni | * Cand temperatura trece de un anumit threshold setat anterior utilizand joystick-ul, ventilatorul si pompa de apa vor porni | ||
Line 32: | Line 31: | ||
- duză de pulverizare | - duză de pulverizare | ||
- tranzistori & rezistoare | - tranzistori & rezistoare | ||
+ | - diode | ||
- conectori & fire | - conectori & fire | ||
- sursă de alimentare | - sursă de alimentare | ||
- display lcd cu meniu | - display lcd cu meniu | ||
- | - butoane de control / joystick | + | - joystick |
- ventilator | - ventilator | ||
</note> | </note> | ||
- | {{ :pm:prj2024:iotelea:gabi_sch.jpg?800 |}} | + | {{ :pm:prj2024:iotelea:gabieagle.png?800 |}} |
{{ :pm:prj2024:iotelea:whatsapp_image_2024-05-17_at_22.08.45.jpeg?800 |}} | {{ :pm:prj2024:iotelea:whatsapp_image_2024-05-17_at_22.08.45.jpeg?800 |}} | ||
+ | Updated:\\ | ||
+ | {{ :pm:prj2024:iotelea:gabiult.jpeg?800 |}} | ||
+ | Final product:\\ | ||
+ | {{ :pm:prj2024:iotelea:whatsapp_image_2024-05-26_at_22.35.22.jpeg?800 |}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | <note tip> | + | **Mediu de dezvoltare:** Arduino IDE\\ |
- | TODO | + | **Versiunea:** 1.8.19 |
- | </note> | + | **Librarii si surse 3rd-Party:**\\ |
+ | - LiquidCrystal.h | ||
+ | * Biblioteca este utilizata pentru a controla ecranul LCD oferind unfctii simple pentru a afisa text pe un LCD cu 16x2 caractere. | ||
+ | * <code c> #include <LiquidCrystal.h> </code> | ||
+ | - DallasTemperature.h | ||
+ | * Biblioteca folosita pentru citirea temperaturii de la senzorul de temperatura. | ||
+ | * <code c> #include <DallasTemperature.h> </code> | ||
+ | - OneWire.h | ||
+ | * Biblioteca folosita alaturi de cea Dallas pentru comunicarea cu senzorul de temperatura. | ||
+ | * <code c> #include <OneWire.h> </code> | ||
+ | - TimerOne.h | ||
+ | * Aceasta biblioteca permite utilizarea timerului 1 de pe microcontroller pentru a seta intreruperi temporizate. Am utilizat-o pentru a verifica temperatura la intervale regulate. | ||
+ | * <code c> #include <TimerOne.h> </code> | ||
+ | |||
+ | **Algoritmi si structuri pe care le-am implementat:** | ||
+ | - Meniul interactiv | ||
+ | * Meniul interactiv este controlat printr-un joystick. Structura meniului permite utilizatorului sa navigheze intre optiuni si sa selecteze diverse actiuni. Exista doua optiuni prinicpale: | ||
+ | - Afisarea temperaturii curente: Afiseaza temperatura citita de la senzor. | ||
+ | - Schimbarea temperaturii de prag: Permite utilizatorului sa seteze o noua valoare de preag pentru temperatura. | ||
+ | * Functii: | ||
+ | - <code c>updateMenu()</code> Actualizeaza meniul pe ecranul LCD in functie de selectiile utilizatorului. | ||
+ | - <code c>menuSelection()</code> Gestioneaza actiunile efectuate atunci cand utilizatorul selecteaza o optiune din meniu. | ||
+ | - Controlul pompei si al ventilatorului | ||
+ | Pompa si ventilatorul sunt controlate in functie de temperatura citita de la senzor. | ||
+ | * Daca temperatura depaseste pragul setat, ventilatorul este pornit si pompa este activata pentru o secunda, urmata de o perioada de pauza de 5 secunda, dupa care este pornita din nou s.a.m.d. | ||
+ | * Ventilatorul ramane pornit atata timp cat temperatura este peste pragul setat. | ||
+ | Functii: | ||
+ | * <code c> timerISR() </code> Seteaza un flag la intervale de 5 secunde pentru a indica ca este timpul sa se verifice temperatura. | ||
+ | * <code c> loop() </code> Codul din loop() gestioneaza activarea si dezactivarea pompei si ventilatorului. | ||
+ | |||
+ | **Surse si functii implementate:** | ||
+ | |||
+ | <code c> setup() </code> Initializarea LCD-ului, senzorului si configurarea piniilor pentru joystick, pompa si ventilator si a temporizatorului pentru verificarea temperaturii: | ||
+ | |||
+ | <file c setup.c> | ||
+ | // set up the LCD's number of columns and rows: | ||
+ | lcd.begin(16, 2); | ||
+ | sensors.begin(); | ||
+ | Serial.begin(9600); // Starting Serial for Joystick | ||
+ | lcd.setCursor(3,0); | ||
+ | |||
+ | // Print the welcome message to the LCD. | ||
+ | lcd.print("Welcome to"); | ||
+ | lcd.setCursor(3,1); | ||
+ | lcd.print("AquaBreeze"); | ||
+ | |||
+ | // Initial position of the JoyStick | ||
+ | xInit = analogRead(joyX); | ||
+ | yInit = analogRead(joyY); | ||
+ | |||
+ | pinMode(joyButton, INPUT_PULLUP); | ||
+ | pinMode(pumpPin, OUTPUT); | ||
+ | pinMode(fanPin, OUTPUT); | ||
+ | |||
+ | delay(5000); | ||
+ | |||
+ | // Check the temp every 5s | ||
+ | Timer1.initialize(5000000); | ||
+ | Timer1.attachInterrupt(timerISR); | ||
+ | |||
+ | updateMenu(); | ||
+ | </file> | ||
+ | |||
+ | <code c>loop()</code> | ||
+ | Citirea valorilor de la joystick pentru navigarea in meniu: | ||
+ | <file c joystick.c> | ||
+ | int xValue = analogRead(joyX); | ||
+ | int yValue = analogRead(joyY); | ||
+ | int joyButtonState = digitalRead(joyButton); | ||
+ | </file> | ||
+ | Actualizarea afisajului LCD. | ||
+ | <file c lcd.c> | ||
+ | f (yValue < yInit - DRIFT) { | ||
+ | menuIndex = 0; | ||
+ | updateMenu(); | ||
+ | delay(300); | ||
+ | } else if (yValue > yInit + DRIFT) { | ||
+ | menuIndex = 1; | ||
+ | updateMenu(); | ||
+ | delay(300); | ||
+ | } | ||
+ | } | ||
+ | </file> | ||
+ | Verificarea si actualizarea starii pompei si ventilatorului in functie de temperatura citita de la senzor. | ||
+ | <file c motors.c> | ||
+ | if (temp > tempThreshold) { | ||
+ | unsigned long currentTime = millis(); | ||
+ | digitalWrite(fanPin, HIGH); | ||
+ | if (!pumpActive && (currentTime - lastPumpTime >= pumpCooldown)) { | ||
+ | digitalWrite(pumpPin, HIGH); | ||
+ | delay(pumpActiveTime); | ||
+ | digitalWrite(pumpPin, LOW); | ||
+ | lastPumpTime = currentTime; | ||
+ | } | ||
+ | } else { | ||
+ | digitalWrite(fanPin, LOW); | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ | <code c> menuSelection() </code> | ||
+ | Afisarea temperaturii curente. | ||
+ | <file c currTemp.c> | ||
+ | lcd.setCursor(0,0); | ||
+ | lcd.print("Current Temp:"); | ||
+ | lcd.setCursor(0,1); | ||
+ | lcd.print(temp); | ||
+ | lcd.print(" C"); | ||
+ | </file> | ||
+ | Afisarea schimbarii temperaturii de prag de catre utilizator. | ||
+ | <file c changeTemp.c> | ||
+ | lcd.setCursor(0,0); | ||
+ | lcd.print("Set new temp:"); | ||
+ | lcd.setCursor(0,1); | ||
+ | lcd.print("< "); | ||
+ | lcd.print(tempThreshold); | ||
+ | lcd.print(" C >"); | ||
+ | </file> | ||
+ | |||
+ | ===== Download ===== | ||
+ | {{:pm:prj2024:iotelea:aquabreeze.zip|}} | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
<note tip> | <note tip> | ||
- | TODO | + | Video cu demo: https://www.youtube.com/watch?v=FfeswgPBJQo&ab_channel=GabrielComisaru |
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Per total, proiectul a fost un succes, am implementat tot ce mi-am propus. Au existat destule probleme întâmpinate, precum gestionarea consumului de energie, având în vedere numărul de componente conectate la Arduino. Inițial, când conectam senzorul, joystick-ul, LCD-ul și pompa, Arduino-ul era suprasolicitat și se reseta de fiecare dată când se pornea pompa 8-O. A fost nevoie să folosesc o alimentare externă, dar pompa avea nevoie de 3-6V și nu am găsit astfel de baterii, așa că am conectat în serie două baterii de 1.5V folosind bandă adezivă ^_^. Din fericire, această improvizație a funcționat și am reușit să duc la bun sfârșit proiectul. |
- | + | ||
- | <note warning> | + | |
- | TODO | + | |
- | </note> | + | |
+ | Din acest lucru am învățat că pe viitor trebuie să fiu mai atent când îmi comand piesele și să mă gândesc mai bine dacă Arduino-ul este suficient ca sursă de alimentare pentru toate componentele pe care le voi avea. | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
<note tip> | <note tip> | ||
- | 05.05.2024 - Creare pagina wiki | + | 05.05.2024 - Creare pagina wiki\\ |
- | 16.05.2024 - Compunere schema bloc | + | 12.05.2024 - Comanda piese\\ |
- | 17.05.2024 - Adaugare schema hardware + poze | + | 16.05.2024 - Compunere schema bloc\\ |
+ | 17.05.2024 - Adaugare schema hardware + poze\\ | ||
+ | 24.05.2024 - Adaugare implementare software\\ | ||
+ | 25.05.2024 - Rezultatele obtinute printr-un video\\ | ||
</note> | </note> | ||
Line 76: | Line 198: | ||
<note> | <note> | ||
- | TODO | + | https://www.sensingthecity.com/tutorial-controlling-submersible-pump-with-arduino/ |
+ | https://docs.arduino.cc/built-in-examples/usb/JoystickMouseControl/ | ||
+ | https://www.youtube.com/watch?v=s_-nIgo71_w&ab_channel=ScienceBuddies | ||
+ | |||
+ | https://www.arduino.cc/reference/en/libraries/liquidcrystal/ | ||
+ | https://www.arduino.cc/reference/en/libraries/dallastemperature/ | ||
+ | https://github.com/sparkfun/SparkFun-Eagle-Libraries | ||
</note> | </note> | ||
<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> | ||