This is an old revision of the document!
Dispozitiv de monitorizare pentru bebelusi:
Folosind un senzor de zgomot, dispozitivul sesizeaza plansetele copilului si porneste un avertisment sonor pentru parinti. Totodata, are incorporat un senzor de lumina care aprinde o matrice de leduri la lasarea intunericului. Pe un ecran lcd va rula o animatie ce are ca scop captarea atentiei bebelusului.
Schema bloc :
Componente :
Pentru o intelegere mai buna a modului in care sunt conectate componentele, atasez un close-up al placutei:
Mediul de dezvoltare folosit a fost Visual Studio Code, folosind extensia PlatformIO. Impreuna cu etapele implementarii sunt incluse fragmente de cod pentru o intelegere mai usoara a rationamentului.
Am inceput prin a construi animatia redata pe lcd : dupa ce am ales imaginile, le-am convertit in siruri de octeti folosind image2cpp. Acestea sunt stocate si redate din memoria flash a microcontroller-ului, folosind functii specifice bibliotecii TFT_HX8357. Urmatorul fragment de cod este inclus in metoda loop():
if (millis() - lastImageChangeTime >= 4000) { // 4000 milisecunde = 4 secunde
// Schimba imaginea la următoarea în slideshow
switch (currentImage) {
case 1:
tft.drawBitmap(0, 0, image1, IMAGE_WIDTH, IMAGE_HEIGHT, TFT_CYAN);
currentImage = 2;
delay(2000);
tft.fillScreen(TFT_DARKCYAN);
break;
case 2:
tft.drawBitmap(0, 0, image2, IMAGE_WIDTH, IMAGE_HEIGHT, TFT_CYAN);
currentImage = 1; // Resetăm contorul pentru a începe slideshow-ul de la început
delay(2000);
tft.fillScreen(TFT_DARKCYAN);
break;
}
lastImageChangeTime = millis(); // Actualizăm momentul ultimei schimbări de imagine
}
Mai apoi, am configurat lampa de veghe. Am ales sa fac aceasta caracteristica putin mai interactiva, asa ca, atunci cand fotorezistorul nu mai sesizeaza lumina, pe matricea de LED-uri se reda o animatie cu o inima care bate. Pentru asta folosesc functiile :
// un exemplu de frame
const byte heart3[8] = {
B00000000,
B01100110,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000,
B00000000
};
void displayHeartFrame(const byte* frame) {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, frame[row]);
}
}
void animateHearts() {
for (int i = 0; i < 5; i++) {
displayHeartFrame(heartFrames[i]);
delay(100); // Ajustăm viteza animației
}
}
In metoda loop() pornim LED-urile in functie de valorile semnalate de fotorezistor :
// Dacă nivelul de lumină este sub pragul stabilit, activăm matricea de LED-uri
if (lightLevel < LIGHT_THRESHOLD) {
animateHearts();
} else {
lc.clearDisplay(0); // Stingem toate LED-urile
}
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.