This is an old revision of the document!
Vajalikud teadmised: [HW] Andurite moodul, [HW] Kasutajaliidese moodul, [HW] Kontrollermoodul, [LIB] Sisend-väljundviigud, [LIB] Graafiline LCD, [LIB] Andurid
#include <avr/io.h> #include <string.h> #include <stdio.h> #include "onewire.h" #include "ds18x20.h" #include <homelab/module/lcd_gfx.h> #include <homelab/delay.h> #include <homelab/pin.h> // // Muutuja, mis on defineeritud mujal. Sellesse salvestatakse // iga anduri järjekorra number ja anduri kood, mis on igal anduril unikaalne. // extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; int main( void ) { uint8_t nSensors, i; int16_t decicelsius; uint8_t error; char s[10]; char sensor_nr[1]; // Anduriplaadi multiplexeri viigu seadistamine. pin multiplexer_pin = PIN(G, 0); // LCD ekraani algseadistamine lcd_gfx_init(); // Ekraani puhastamine lcd_gfx_clear(); // Taustavalgustuse tööle lülitamine lcd_gfx_backlight(true); // Multiplexeri viigu seadmine väljundiks ja seejärel toimub selle ümber // lülitamine, et välised andurite pordid kontrolleriga ühendada. pin_setup_output(multiplexer_pin); pin_set(multiplexer_pin); // 1-Wire siini seadistamine. Anduriplaadil vastab viigule F3 ADC3 tähistusega pistik. ow_set_bus(&PINF,&PORTF,&DDRF,PF3); // Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud // andurite arv. nSensors = search_sensors(); while(1) { error = 0; // Kui andureid ei leita, siis seatakse püsti vealipp. if ( nSensors == 0 ) { error++; } // Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist. for ( i = nSensors; i > 0; i-- ) { // Mõõtmise tegemine. Vea korral seatakse vealipp. if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, &gSensorIDs[i-1][0] ) == DS18X20_OK ) { sw_delay_ms( 750 ); // Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp. if ( DS18X20_read_decicelsius( &gSensorIDs[i-1][0], &decicelsius) == DS18X20_OK ) { // Sõna "TEMP" kuvamine. lcd_gfx_goto_char_xy(2, 1); lcd_gfx_write_string("TEMP"); // Kraadi tähise kuvamine lcd_gfx_goto_char_xy(13, 1); lcd_gfx_write_string("C"); // Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine. DS18X20_format_from_decicelsius( decicelsius, s, 10 ); // Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni: // DS18X20_format_from_maxres( tval, s, 10 ); // Temperatuuri ekraanile kuvamine lcd_gfx_goto_char_xy(7, 1); lcd_gfx_write_string(s); // Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks. lcd_gfx_goto_char_xy(0, 1); sprintf(sensor_nr, "%d", i); lcd_gfx_write_string(sensor_nr); } else { // CRC viga (Ühendus on maas) error++; } } else { // Mõõtmine ebaõnnestus võibolla on siinil lühis error++; } } // Veateate kuvamine. if ( error ) { lcd_gfx_goto_char_xy(1, 3); lcd_gfx_write_string("ERROR!"); error = 0; } else { lcd_gfx_goto_char_xy(1, 3); lcd_gfx_write_string(" "); } sw_delay_ms(500); } }