Jelikož jsou prázdniny, tak abych se nenudil, řekl jsem si, že si připojím k AVR-ku (mega16), LCD z nokie 3310 (PCD8544) a DS18B20. Vše funguje, ale dostal jsem se do slepé uličky a nevím jak z ní.
Takže k věci.
Teplotu snímám, vypisuji na displej. Nic složitého. Ale chtěl jsem použít funkci: LcdSingleBar a zobrazit si jednoduchý "rtuťový teploměr".
Ale on ten BAR funguje jenom jednou cestou. A to tak, že při zahřátí čidla se mi zvětšuje ten bar. Ale zpět už ne. Nevím jak docílit toho, aby to fungovalo obousměrně.
Vytvořil jsem si funkci, ve které při změně hodnoty cele by se měl měnit i ten bar.
Celý ten bar by měl fungovat jako nulová výchylka.
Kód: Vybrať všetko
-t ----------- 0 ------------ +t
Kód: Vybrať všetko
void hlavni_display(){
//kresleni car
LcdLine(42, 42, 40, 47, 1); //vykresli svislou caru
//vykresleni progress Baru (vodorovna cara)
//LcdSingleBar (42, 45, 2, delka_cary, 1); //SingleBar (zacatek x, zacatek y, tloustka, delka, On/Off); rozmery v pixelech
// delka_cary = cele;
if (cele > 0 ){ //kresleni progress baru pro teploty vetsi nez 0
if (cele >= 40 ){
delka_cary = 40;LcdSingleBar (42, 45, 2, delka_cary, PIXEL_ON);
}
else{
LcdSingleBar (42, 45, 2, cele, PIXEL_ON);
}
}
if (cele == 0){LcdSingleBar (42, 45, 2, 0, 1);} //kresleni progress baru pro teplotu rovnou nule
if (cele < 0 ){ //kresleni progress baru pro teploty mensi nez 0
if (cele <= -40){
delka_cary = -40; LcdSingleBar ((42+delka_cary), 45, 2, 42, PIXEL_ON);
}
else{
delka_cary = cele;
LcdSingleBar ((42+cele), 45, 2, (delka_cary *= -1), PIXEL_XOR);
}
}
//kontrola teploty
if (cele > 0) {tempDisplay[0] = '+';} //je-li teplota vwtsi nez 0, zobrazi +
if (cele < 0) {tempDisplay[0] = '-'; cele *= -1;} //je-li teplota mensi nez 0, zobrazi -
//prepocet teploty
tempDisplay[1] = cele/10;
tempDisplay[2] = cele%10;
tempDisplay[3] = '.';
tempDisplay[4] = decicelsius%10;
//vypis na LCD
LcdGotoXYFont(1,5);
sprintf(buffer,"-42"); //- krajni rozsah
LcdStr(FONT_1X,(unsigned char*)buffer); //zapis znaku desetin
LcdUpdate();
LcdGotoXYFont(12,5);
sprintf(buffer,"+42"); //+ krajni rozsah
LcdStr(FONT_1X,(unsigned char*)buffer); //zapis znaku desetin
LcdUpdate();
//vypis teploty na displej
LCD_writeChar_megaFont(tempDisplay[0], 4, 1); //cislo (jako znak '4', pozice x v pixelech (napr. 25), radek 0 az 3
LCD_writeChar_megaFont(tempDisplay[1], 20, 1); //cislo (jako znak '4', pozice x v pixelech (napr. 25), radek 0 az 3
LCD_writeChar_megaFont(tempDisplay[2], 32, 1); //cislo (jako znak '4', pozice x v pixelech (napr. 25), radek 0 az 3
LCD_writeChar_megaFont(tempDisplay[3], 46, 1); //cislo (jako znak '4', pozice x v pixelech (napr. 25), radek 0 az 3
LCD_writeChar_megaFont(tempDisplay[4], 50, 1); //cislo (jako znak '4', pozice x v pixelech (napr. 25), radek 0 az 3
LcdUpdate(); //aktualizace displeje
//vypis znaku teploty °C
sprintf(buffer,"{C"); //znak desetin
LcdGotoXYFont(12,3); //pozice znaku stupnu "°C"
LcdStr(FONT_1X,(unsigned char*)buffer); //zapis znaku desetin
LcdUpdate(); //aktualizace displeje
}
Kód: Vybrať všetko
byte LcdSingleBar ( byte baseX, byte baseY, byte height, byte width, LcdPixelMode mode )
{
byte tmpIdxX,tmpIdxY,tmp;
byte response;
/* Checking border */
if ( ( baseX > LCD_X_RES ) || ( baseY > LCD_Y_RES ) ) return OUT_OF_BORDER;
if ( height > baseY )
tmp = 0;
else
tmp = baseY - height;
/* Draw lines */
for ( tmpIdxY = tmp; tmpIdxY < baseY; tmpIdxY++ )
{
for ( tmpIdxX = baseX; tmpIdxX < (baseX + width); tmpIdxX++ )
{
response = LcdPixel( tmpIdxX, tmpIdxY, mode );
if(response)
return response;
}
}
/* Set update flag to be true */
UpdateLcd = TRUE;
return OK;
}