This shows you the differences between two versions of the page.
|
pm:prj2024:iotelea:gabriel.comisaru [2024/05/17 22:18] gabriel.comisaru [Introducere] |
pm:prj2024:iotelea:gabriel.comisaru [2024/05/26 23:30] (current) gabriel.comisaru [Rezultate Obţinute] |
||
|---|---|---|---|
| Line 12: | 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 31: | 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\\ | ||
| + | 12.05.2024 - Comanda piese\\ | ||
| 16.05.2024 - Compunere schema bloc\\ | 16.05.2024 - Compunere schema bloc\\ | ||
| - | 17.05.2024 - Adaugare schema hardware + poze | + | 17.05.2024 - Adaugare schema hardware + poze\\ |
| + | 24.05.2024 - Adaugare implementare software\\ | ||
| + | 25.05.2024 - Rezultatele obtinute printr-un video\\ | ||
| </note> | </note> | ||
| Line 75: | 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> | ||