#define F_CPU 8000000
#define LCD_LINES 4
#define LCD_DISP_LENGTH 20
#define LCD_PORT PORTB ///< port for the LCD lines
#define LCD_DATA0_PORT LCD_PORT ///< port for 4bit data bit 0
#define LCD_DATA1_PORT LCD_PORT ///< port for 4bit data bit 1
#define LCD_DATA2_PORT LCD_PORT ///< port for 4bit data bit 2
#define LCD_DATA3_PORT LCD_PORT ///< port for 4bit data bit 3
#define LCD_DATA0_PIN 4 ///< pin for 4bit data bit 0
#define LCD_DATA1_PIN 5 ///< pin for 4bit data bit 1
#define LCD_DATA2_PIN 6 ///< pin for 4bit data bit 2
#define LCD_DATA3_PIN 7 ///< pin for 4bit data bit 3
#define LCD_RS_PORT PORTC ///< port for RS line
#define LCD_RS_PIN 7 ///< pin for RS line
#define LCD_RW_PORT PORTC ///< port for RW line
#define LCD_RW_PIN 6 ///< pin for RW line
#define LCD_E_PORT PORTC ///< port for Enable line
#define LCD_E_PIN 5 ///< pin for Enable line
#include "s/g.h"
#include "s/rprintf.c"
#include "s/lcd.c"
#include "s/adc.c"
#include "util/delay.h"
//! bereken gemiddelde van x aan sampels op eenzelfde adc pin
u16 avg(u08 adcChannel, u08 samples);
//! main functie, start programma, moet altijd aanwezich zijn
int main(void){
uartInit(UART_FULL, 19200);
rprintfInit(uartSendByte);
rprintf("UART PRESENTn");
lcdInit(LCD_DISP_ON);
adcInit(ADC_P128, ADC_AVCC);
u16 adcLm35;
u08 buffer[4];
rprintf("LM35 at ADC5n");
while(1){
// ADC waarde lezen, dan via u32 cast 32bit integer van maken
// want 1024 * 5000 > 16bit, na de bewerking volstaat u16 weer
adcLm35 = (u16)(((u32) avg(5, 5) * 5000) / (1024));
// ADC heeft een resolutie van ongeveer 5mV, de LM35 is tot op
// 0,5°C naukeurig, daarom afronden tot op 0,5°
// Eerst eenheden laten vallen door /10 en dan *10 te doen
// daarna kijken of de eenheden groter of gelijk aan 5 waren,
// zoja +5 anders +0
adcLm35 = ((adcLm35/10) * 10) + (((adcLm35%10) >= 5) ? 5 : 0);
rprintf("LM35: %d,%dn", (adcLm35/10), (adcLm35%10));
lcdClr();
lcdPuts("LM35 at ADC5");
lcdGotoXY(0, 1);
// alles wat voor de komma staat, hetgeen erachter staat (eenheden)
// laten vallen door het getal te delen door 10
lcdPuts( itoa((adcLm35/10), buffer, 10) );
lcdPuts(",");
// na de komma, de eenheden, deze kunnen we uit de variable adcLm35
// halen door er de module van 10 van te nemen
lcdPuts( itoa((adcLm35%10), buffer, 10) );
// LCDs ondersteunen niet alle karakters, het graden-teken wordt oa
// niet ondersteunt daarom maar een enkel aanhalingsteken
lcdPuts("'");
// temperatuur verandert niet zo snel... daarom kunnen we hier heel
// wat delay nemen. Als we sneller gaan, gaan we meer storingen
// krijgen. Het is niet de bedoeling dat de temperatuur tussen
// 24,0 en 24,5 staat te verspringen
_delay_ms(2000);
}
return 0;
}
/**
* @param adcChannel AVR hardware ADC channel
* @param samples Aantal te nemen sampen en dan gemmidelde berekenen
* @return het gemiddelde van het aantal genomen sampels
*/
u16 avg(u08 adcChannel, u08 samples){
// dit is voor een meer stabiele temperatuursmeting te krijgen
u32 tmp = 0;
for(u08 i=0; i<samples; i++){
tmp += (u32) (adcGet(adcChannel));
}
return (u16) (tmp/samples);
}