This is an old revision of the document!


Ceas de birou smart

Introducere

Acest proiect constă în dezvoltarea unui ceas de birou, însă nu orice fel de ceas, ci unul smart. Scopul acestuia este atât de a arăta ora curentă și temperatura din cameră, cât şi de a lumina suficient de tare în jurul său cât să nu mai trebuiască altă lumină pe birou.

Ideea pentru acest proiect a venit din dorința de a realiza ceva ce nu am mai vazut până acum, combinată cu lipsa de lumină de pe biroul meu în timp ce mă gândeam la ce aș putea realiza.

Cum sunt sigură de faptul că nu sunt singura persoană care nu are o lumină pe birou care să mă ajute, în special noaptea, când nu mai există lumină naturală, consider că acest proiect poate fi util şi altor persoane care au acestă problemă.

Descriere generală

Ceasul de birou smart are următoarele caracteristici:

  1. Indică pe ecran ora exactă, prin intermediul unui modul RTC (real time clock);
  2. Indică pe ecran temperatura din cameră, prin intermediul unui senzor de temperatură;
  3. In funcție de cât de multă lumină este în jurul său, LED-urile albe din jurul ceasului scad sau cresc în intensitate (dacă este mai puțină lumină în jur, LED-urile luminează mai tare). Nivelul de lumină este măsurat cu ajutorul unui fotorezistor;
  4. LED-urile RGB, tot din jurul ceasului, se vor aprinde în momentul în care senzorul infraroșu detectează o anumită acțiune realizată de către un utilizator asupra unei telecomenzi.

Schema bloc a proiectului:

Schema bloc este realizată în Figma, folosind icon-uri de pe www.flaticon.com.

Hardware Design

Componente utilizate:

  • Breadboard
  • Aduino uno
  • I2C display
  • Senzor de temperatura
  • Senzor infrarosu
  • Telecomanda
  • Fotorezistor
  • LED-uri albe
  • LED-uri RGB
  • Rezistente
  • Fire
  • Modul RTC

Schemă proiect:

Schema proiectului este realizată în www.tinkercad.com.

De pe această schemă lipsește modulul RTC, întrucât acesta nu există in Tinkercad.

De asemenea, LED-urile RGB au aici catodul comun, însă în realitate folosesc LED-uri cu anod comun.

Schematic circuit:

Hardware-ul momentan:

Urmează să adaug acest hardware într-o carcasă de ceas și, de asemenea, să adaug mai multe LED-uri pe aceasta.

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Mediu de Dezvoltare

  • Arduino IDE

Librării utilizate

  • DS1307.h - folosita pentru a comunica cu modulul de RTC
  • Wire.h - folosita pentru comunicatiile cu I2C
  • LiquidCrystal_I2C.h - folosita pentru facilizarea afisarii datelor pe ecranul LCD
  • OneWire.h - folosita pentru a facilita comunicarea cu senzorul de temperatura
  • DallasTemperature.h - specifica senzorului de temperatura pe care l-am folosit (DS1820)
  • IRremote.hpp - folosita pentru decodarea semnalelor primite de la senzorul de IR

Codul momentan

#include <DS1307.h> // Librarie pentru a comunica cu modulul de RTC
#include <Wire.h> // Librarie pentru comunicatiile cu I2C
#include <LiquidCrystal_I2C.h> // Librarie pentru a comunica cu ecranul I2C mai usor
#include <OneWire.h> // Librarie pentru facilizarea comunicarii cu senzorul de temperatura
#include <DallasTemperature.h> // Librarie pen
#include <IRremote.hpp> // Librarie pentru decodarea semnalelor primite de la senzorul IR
 
// Initializez pinii LED-urilor RGB
int ledRGB_R = 6;
int ledRGB_G = 5;
int ledRGB_B = 3;
 
// Initializez pinul LED-urilor albe
int led_white = 10;
 
// Variabila pentru a porni/opri ledurile albe
int is_on = 1;
 
// Inițializare LCD (I2C address, nr of rows, nr of columns)
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
// Initializare RTC
DS1307 rtc;
 
// Pinul pentru citit date de pe senzorul IR
const int RECV_PIN = 7;
 
// Variabila pentru a stoca codul citit de senzorul IR
String code = "";
 
// Senzor Temperatura
int temp = 2;
OneWire oneWire(temp);
DallasTemperature temp_sensor(&oneWire);
 
void setup() {
  // Declar pinii red, green si blue de la led-urile RGB ca fiind output:
  pinMode(ledRGB_R, OUTPUT);
  pinMode(ledRGB_G, OUTPUT);
  pinMode(ledRGB_B, OUTPUT);
 
  // Declar pin-ul led-urilor albe ca fiind output
  pinMode(led_white, OUTPUT);
 
  // Inițializare LCD
  lcd.init();
  lcd.backlight();
  lcd.print("Ora:");
  lcd.setCursor(0, 1);
  lcd.print("Temperatura:");
  lcd.setCursor(15, 1);
  lcd.print("C");
 
  // Pornire si setare modul RTC
  rtc.begin();
  rtc.set(0, 51, 22, 23, 05, 2024); //sec, min, hour, day, month, year
  rtc.start();
 
  Serial.begin(9600);
 
  // Pornire citire date de pe senzorul IR
  IrReceiver.begin(RECV_PIN, DISABLE_LED_FEEDBACK);
 
  // Pornire senzor de temperatura
  temp_sensor.begin();
 
  // Setare LED-uri RGB ca fiind stinse initial
  digitalWrite(ledRGB_R, 1);
  digitalWrite(ledRGB_G, 1);
  digitalWrite(ledRGB_B, 1);
 
  // Setare LED-uri albe ca fiind aprinse initial
  digitalWrite(led_white, 0);
}
 
void loop() {
  // Citesc nivelul de lumina de la pin-ul A0
  int value = analogRead(A0);
 
 // Daca LED-urile albe sunt aprinse, li se regleaza intensitatea in functie de lumina
  if (is_on == 1){
    if (value < 150) { // Daca este lumina slaba in jur
      analogWrite(led_white, 250); // LED-ul lumineaza mai intens
    } else if (value >= 150 && value < 300) {
      analogWrite(led_white, 200);
    } else if (value >= 300 && value < 500) {
      analogWrite(led_white, 150);
    } else if (value >= 500 && value < 700) {
      analogWrite(led_white, 100);
    } else {
      analogWrite(led_white, 50);
    }
  } else {
    analogWrite(led_white, 0);
  }
 
  // Variabile pentru a retine ora si data
  uint8_t sec, min, hour, day, month;
  uint16_t year;
 
  // Obtin datele despre ora si data de la senzorul RTC
  rtc.get(&sec, &min, &hour, &day, &month, &year);
 
  // Afișează ora actuală pe LCD
  lcd.setCursor(5, 0);  // Setează cursorul la linia 1, poziția 5
  lcd.print(hour, DEC);
  lcd.print(':');
  lcd.print(min, DEC);
  lcd.print(':');
  lcd.print(sec, DEC);
 
  // Obtinere temperatura de la senzor si afisare pe ecran
  temp_sensor.requestTemperatures(); 
  lcd.setCursor(12, 1);
  lcd.print(temp_sensor.getTempCByIndex(0));
 
  // Citire si decodare date de pe senzor
  if (IrReceiver.decode()){
    code = String(IrReceiver.decodedIRData.decodedRawData, HEX);
    if (code == "fb04ef00") { // rosu
      digitalWrite(ledRGB_R, 0);
      digitalWrite(ledRGB_G, 1);
      digitalWrite(ledRGB_B, 1);
    } else if (code == "fa05ef00") { // verde
      digitalWrite(ledRGB_R, 1);
      digitalWrite(ledRGB_G, 0);
      digitalWrite(ledRGB_B, 1);
    } else if (code == "f906ef00") { // albastru
      digitalWrite(ledRGB_R, 1);
      digitalWrite(ledRGB_G, 1);
      digitalWrite(ledRGB_B, 0);
    } else if (code == "f50aef00") { // turn OFF LED-uri RBG 
      digitalWrite(ledRGB_R, 1);
      digitalWrite(ledRGB_G, 1);
      digitalWrite(ledRGB_B, 1);
    } else if (code == "fc03ef00") { // turn OFF LED-uri albe
      is_on = 0;
    } else if (code == "fd02ef00") { // turn ON LED-rui albe
      is_on = 1;
    }
 
    IrReceiver.resume();
  }
 
  delay(500);
}

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2024/sseverin/mihaela.alexe0502.1716538399.txt.gz · Last modified: 2024/05/24 11:13 by mihaela.alexe0502
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