Crazy clock with alarm and RTC

Nume: Ciobanu Adrian-Dănuț
Grupa: 331AB

Poza din fata Poza din profil

Introducere

Prezentarea pe scurt a proiectului meu:

  • Ce face: nu prea multe :)
    Principalul obiectiv e să fie atât un ceas normal dar și un ceas “enervant”, să te trezească dimineața.
  • Scopul: să fie o motivație atât să te trezească dar și cât să te facă să îl arunci în perete zi de zi.
  • Ideea de la care am pornit: Am vrut să fac un ceas normal inițial și gândindu-mă cum să îl complic, am ajuns la acest model cu 2 motoare care îl fac să se miște atât pe el, cât și pe utilizator din pat de dimineață
  • Ar fi util pentru alții și/sau pentru noi ? Probabil. Eu personal nu i-aș da o durată lungă de viață dar totodată consider că ar putea fi folositor cuiva undeva sub anumite circumstanțe.

Descriere generală

Schemă bloc generală a proiectului prezentând modulele folosite și interacțiunile dintre ele

Schema bloc de mai sus prezintă ideea generală inițială de comunicare a modulelor prezentate unele cu altele. Foarte pe scurt, “piesa centrală” este un Arduino UNO, pe care îl voi programa să aibă funcționalitatea de ceas normal folosind un modul RTC, căruia îi adaug un buzzer pentru alarmă, un joystick pentru folosirea meniului și setarea alarmelor, un driver de motoare și 2 motoare DC pentru a-i da “personalitatea” enervantă și un senzor de temperatură și umiditate, pentru ca de ce nu ? (mi-au rămas pini liberi) Proiectul actual, așa cum s-a văzut și în pozele de la început, nu mai are celulele fotovoltaice din lipsă de timp și resurse alocabile pentru designul exterior.

Hardware Design

* Lista de piese:

  • Arduino UNO
  • LCD cu I2C pentru mai puține fire folosite
  • Modul RTC DS1302
  • Buzzer
  • Senzor de temperatură no-name din Super Starter Kit
  • Driver de motoare HM-166 (pentru controlul mai ușor și față-spate al motoarelor)
  • 2 motoare DC cu mini-gearbox pentru cuplu mai puternic (să fugă din mâna când încerci să îl oprești :) )
  • Alimentarea se va face dintr-o baterie
  • Un joystick pentru navigarea alarmelor și a diferitelor “ecrane”
  • Un buton pentru oprirea alarmei si stergerea alarmelor selectate
  • Un power supply mic, de breadboard

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediul de dezvoltare va fi ArduinoIDE
  • biblioteci și surse 3rd-party:
    • virtuabotixRTC.h → pentru a putea lucra mai eficient cu modulul de RTC
    • LiquidCrystal_I2C.h → pentru a interacționa cu ecranul LCD legat prin I2C
    • ezButton.h → folosit inițial pentru a lucra cu butoanele însă am renunțat la el și am folosit întreruperi
    • dht.h → pentru interfațarea placuței Arduino cu senzorul de temperatură și umiditate
    • SparkFun_TB6612.h → o bibliotecă găsită online pentru a facilita lucrul cu driver-ul de motoare
    • alarm.hpp → o clasă scrisă de mine pentru a mă ajuta în lucrul cu vectorul de alarme

Algoritmi:

  • Nu am folosit algoritmi complecși, am realizat foarte multe funcții distincte pentru a separa mai bine codul în părți mai mici pentru un troubleshooting mai ușor:
    • Cel mai mare algoritm din cod este cel pentru sortarea alarmelor: a trebuit să iau în calcul dacă alarma este setată pentru ziua de azi sau pentru ziua de mâine și să le ordonez corespunzător. Am făcut acest lucru pentru a face lucrul cu alarma mai ușor deoarece întotdeauna pe poziția alarme[0] voi avea alarma care trebuie să sune și pot compara timpul curent doar cu ea în loc să parcurg mereu vectorul de alarme pentru a afla care este urmatoarea. De asemenea acest algoritm mă ajută și la ștergerea alarmelor, deoarece ele fiind ordonate (și lista, chiar și “goală” este populată cu alarme setate la 25:61 care nu vor suna niciodată) pot reseta alarma și să o mut la finalul vectorului fără nici o problemă.

Detalii structurale:

  • Primul lucru ar fi faptul că ecranul LCD este folosit pentru a afișa un State Machine de sub-ecrane (care vor fi atașate sub această căsuță de text):
    • Ecranul principal pe care se află ora și data curentă, în “sus” se află ecranul cu numărul de alarme setate, “sub” ecranul cu data și ora se află ecranul cu informațiile de la senzorul de temperatură și umiditate. În “stânga” se află meniul de vizualizare a alarmelor, dacă există, un mesaj corespunzător dacă totuși există alarme atât setate dar și nesetate sau un mesaj dacă nu a fost setată nici o alarmă.
  • Butoanele au următoarele acțiuni în funcție de locul în care sunt apăsate:
    • Pe linia de ecrane principale (mijlocul), dacă se apasa pe joystick nu se întâmplă nimic, dacă se apasă butonul verde se stinge lumina de fundal a LCD-ului:
    • Pe linia din stânga, joystick-ul nu are efect iar butonul verde șterge și reordonează alarmele dacă aceasta este setată.
    • Pe ecranul din stânga joystick-ul incrementează sau decrementează ora sau minutul în funcție de ce se dorește a se schimba, iar apăsarea lui determină setarea orei sau minutului respective. Ordinea este următoarea: se modifică ora la cea dorită, se apasă joystick-ul, se modifică minutul la cel dorit, se apasă iar joystick-ul și când ora și minutul s-au resetat la 0, alarma a fost adaugată în listă. Pe acest ecran butonul verde nu are alte efecte.
    • Butonul verde oprește alarma atunci când sună indiferent de ecranul în care se află.

Surse și funcții implementate:

  • Funcțiile principale implementate sunt:
    • Funcția de ceas și afișare dată calendaristică
    • Funcția de termometru și afișare nivel umiditate
    • Funcția de alarmă și motiv de mișcare din pat
    • Funcție de mod Low-Power în care se stinge lumina de fundal a LCD-ului și în acest mod, când sună alarma, ceasul nu se mai mișcă, motoarele sunt dezactivate
  • Funcții și alte detalii pe care mi-aș fi dorit să le implementez:
    • Funcția de selecție a melodiei alarmei
    • Funcția de selecție a numărului de alarme sau creearea dinamică a acestui vector
    • Construcția unui cadru mai “profesional” pentru ceas și componente
    • Reproiectarea mai eficientă a componentelor pentru a eficientiza energia consumată (de ex foloisrea doar a microprocesorului în locul întregii plăcuțe Arduino) și/sau PCB-uri custom
  • Sursele de inspirație au fost diverse soluții căutate pe Google și GitHub dar și în documentațiile componentelor folosite

 Schemă privind diferitele ecrane ce pot fi parcurse

Rezultate Obţinute

În cadrul acestui proiect consider că am obținut tot ceea ce mi-am propus la început, chiar dacă rezultatul final arată ca un tun folosit în timpul unui război. Am reuși să implementez așa cum mi-am dorit funcționalitatea alarmelor și să folosesc (consider eu) intuitiv joystick-ul pentru o utilizare mai facilă a (deși cu câteva bug-uri) a ceasului. Un astfel de bug de care nu am reușit încă să scap este faptul ca prin miscarea joystick-ului pot sari 2 ecrane odată: de exemplu din ecranul de afișare alarme pot sări direct în ecranul de setare alarme, fără să mai trec și prin cel cu ora și data. Mai jos voi atașa poze cu proiectul finalizat:

Videoclipuri

Concluzii

Realizarea proiectului a fost atât o provocare dar și un prilej de a testa de ce sunt capabil. În final consider că am realizat un proiect satisfăcător și care să respecte cerințele impuse asupra lui. Mi-a plăcut să învăț să interfațez diverse module cu Arduino și să testez limitele acestuia (am folosit toți pinii disponibili pe un Arduino Uno). Dacă ar trebui sa reîncep un astfel de proiect cu siguranță primul pas ar fi prototiparea și realizarea șasiului înainte de toate m( .

Jurnal

Aici voi atașa câteva imagini cu diversele stadii prin care a trecut proiectul înainte să ajungă la stadiul la care se află acum:

Bibliografie/Resurse

Resurse software

Proiecte similare:

- https://www.instructables.com/Arduino-Digital-Clock-Without-RTC-Real-Time-Clock Un simplu ceas fara modul de RTC si cu 2 butoane de setare a orei si minutelor, fara alarma

- https://www.hackster.io/harshitmehra2007/arduino-clock-without-rtc-with-temperature-and-humidity-355f5f Un proiect putin mai complicat, caruia i se adauga functionalitatea data de senzorul de temperatura si umiditate, fara alarma

- https://projecthub.arduino.cc/ahmadordi/725aaa71-694e-4652-801f-4a25baf43e4f Un proiect asemanator celui de deasupra, senzor de umiditate si temperatura, fara alarma

- https://projecthub.arduino.cc/SurtrTech/simple-alarm-clock-with-ds1302-rtc-72582d Proiect mai aprupiat celui realizat de mine, cu modul RTC si alarma, dar cu tastatura numerica mai complexa in loc de joystick

Altele:

- https://github.com/sparkfun/SparkFun_TB6612FNG_Arduino_Library Pentru driver-ul de motoare

Resurse hardware

- https://github.com/ArduinoGetStarted/button Pentru a folosi butoane (am renunțat la ea dar o folosisem o perioadă)

- https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html Folosit pentru a mă ajuta în folosirea întreruperilor

- https://dronebotworkshop.com/tb6612fng-h-bridge/ Pentru a folosi fizic driver-ul de motoare

- https://ocw.cs.pub.ro/courses/_media/pm/atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf A fost un ajutor constant când aveam nevoie de informații privind Arduino și pinii + cum să îi folosesc

Download

Codul sursă și clasele Alarm: ceasfinal.rar

Un scurt README cu detaliile mai relevante: readme.pdf

Link către Google Drive unde am încărcat toate fișierele folosite în acest proiect (inclusiv versiuni mai vechi ale codului): Google Drive

Laboratoare folosite

În cadrul proiectului meu m-am folosit de următoarele laboratoare:

  1. Folosit pentru întreruperile pe butoane……………. Laboratorul 2: Întreruperi, Timere
  2. Folosit pentru PWM în cadrul motoarelor…………. Laboratorul 3: Timere. PWM
  3. Folosit pentru conversia datelor de la joystick… Laborator 4: Analog Digital Convertor (ADC)
  4. Folosit pentru conectarea modulului RTC………… Laboratorul 5: SPI (Serial Peripheral Interface)
  5. Folosit pentru conectarea LCD-ului…………………. Laboratorul 6: I2C (Inter-Integrated Circuit)

Export to PDF

pm/prj2023/gpatru/90.txt · Last modified: 2023/05/29 18:29 by adrian.ciobanu1906
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