#include <stdlib.h>
#include <string.h>
#include <util/delay.h>
#include <LiquidCrystal_I2C.h>
#ifndef _BV
#define _BV(bit) (1<<(bit))
#endif
#ifndef sbi
#define sbi(reg,bit) reg |= (_BV(bit))
#endif
#ifndef cbi
#define cbi(reg,bit) reg &= ~(_BV(bit))
#endif
#ifndef tbi
#define tbi(reg,bit) reg ^= (_BV(bit))
#endif
#define loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit))
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void ADC_init() {
sbi(ADMUX,REFS0);
cbi(ADMUX,REFS1);
cbi(ADCSRA ,ADPS0);
sbi(ADCSRA ,ADPS1);
sbi(ADCSRA ,ADPS2); //64
sbi(ADCSRA ,ADEN );
//cbi(ADMUX,MUX0);
cbi(ADMUX,MUX1);
cbi(ADMUX,MUX2);
cbi(ADMUX,MUX3);
//sbi(ADMUX,MUX4);
}
uint16_t ADC_10bit() {
sbi(ADCSRA ,ADSC );
loop_until_bit_is_clear(ADCSRA ,ADSC);
return ADC;
}
double adcChannel0(){
cbi(ADMUX,MUX0);
uint16_t result = ADC_10bit();
double V_result =double(result)/1023*5;
return V_result;
}
double adcChannel1(){
sbi(ADMUX,MUX0);
uint16_t result = ADC_10bit();
double V_result =double(result)/1023*5;
return V_result;
}
double histereza = 0.5;
void setup() {
ADC_init();
lcd.init();
lcd.backlight();
while (1) {
double potencjometr = adcChannel0();
double fotorezystor = adcChannel1();
if (fotorezystor > potencjometr + histereza) {
sbi(PORTB, 0);
lcd.setCursor(0, 1);
lcd.print("NOC ");
} else if (fotorezystor < potencjometr - histereza) {
cbi(PORTB, 0);
lcd.setCursor(0, 1);
lcd.print("DZIEN");
}
lcd.setCursor(0, 0);
lcd.print(potencjometr);
lcd.setCursor(6, 0);
lcd.print(fotorezystor);
}
}