This is an old revision of the document!
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ă.
Ceasul de birou smart are următoarele caracteristici:
De asemenea, LED-urile RGB au aici catodul comun, însă în realitate folosesc LED-uri cu anod comun.
Urmează să adaug acest hardware într-o carcasă de ceas și, de asemenea, să adaug mai multe LED-uri pe aceasta.
#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); }
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.