#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const float BETA = 3950; // beta коефіцієнт термістора
volatile long zikl0 = 0;
void setup() {
lcd.init();
lcd.home (); // go home
lcd.print("T1");
pinMode(14, INPUT);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
attachInterrupt(0, zero_crosss_int, RISING); // прерывание по пину 2 - 0 это номер прерываня для ATMega328
//Настройка таймера Timer2 для управления симистором
TCCR2A = 0b00000011; // fastPWM, TOP=OCR2A
TCCR2B = 0b00001111; //dT = 64uS 1
TIMSK2 = 0b00000010; //Разрешить прерывание по TOP
pinMode (8, INPUT); // вход сигнала ICP( №8 only для atmega328)
//настройка 16 бит таймера-счётчика 1
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
TIMSK1 = (1 << ICIE1) | (1 << TOIE1); //создавать прерывание от сигнала на пине ICP1
TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10); //div 1
}
// the interrupt function must take no parameters and return nothing
//функция прерывания не должна принимать никаких параметров и ничего не возвращать
void zero_crosss_int() // функция, которая будет запущена при пересечении нуля
{
TCNT2 = 0; //Сброс счетчика на ноль.
TCCR2B |= 0b00000111; //Запуск отсчета времени задержки.
zikl0 = zikl0 + 1;
}
void loop() {
// put your main code here, to run repeatedly:
int analogT1 = analogRead(14);
int celsiusT1 = 1 / (log(1 / (1023. / analogT1 - 1)) / BETA + 1.0 / 298.15) - 273.15;
lcd.setCursor ( 3, 0 ); // go to the next line
lcd.print (celsiusT1);
lcd.print(" ");
if (celsiusT1>40)
digitalWrite(2, HIGH);
else if (celsiusT1<40) digitalWrite(2, LOW);
}