#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <SimpleTimer.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
#define FLOWSENSORPIN 2 // пин для датчика расхода
volatile uint16_t pulses = 0 ; // считает сколько импульсов
volatile uint8_t lastflowpinstate; // отслеживает состояние пина FLOWSENSORPIN
float flowMilliLitres ; // поток.
int liters = 0 ;
uint16_t n = 0;
int address = 0;
volatile unsigned long timerPrew = 0;
volatile bool countOn = 0;
int analoginput = 0 ;
float volt ;
float vout ;
SimpleTimer timer;
byte gradus[8] = {0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000}; // символ градуса
byte ulitsa[8] = {0b00100, 0b01010, 0b10001, 0b11111, 0b10001, 0b10001, 0b11111, 0b00000}; // символ улица
byte dvigatel[8] = {0b01110, 0b00100, 0b00110, 0b10101, 0b11101, 0b10101, 0b00110, 0b00000}; // символ двигатель
#define ONE_WIRE_BUS 6 // линия данных подключена к цифровому выводу 15 Arduino
OneWire oneWire(ONE_WIRE_BUS); // настройка объекта oneWire для связи с любым устройством OneWirе
DallasTemperature sensors(&oneWire);// передать ссылку на oneWire библиотеке DallasTemperature
// адреса двух датчиков DS18B20
uint8_t sensor1[8] = { 0x28, 0x86, 0x49, 0x16, 0xA8, 0x01, 0x3C, 0x67 }; // адрес 1го датчика
uint8_t sensor2[8] = { 0x28, 0xFF, 0xA6, 0xBF, 0x72, 0x15, 0x03, 0xBD }; // адрес 2го датчика
void button() //функция, вызываемая нажатием кнопки (прерыванием на 2-м пине)
{
if ((millis() - timerPrew) >= 200) //счетчик на 200 мс для борьбы с дребезгом
{
countOn = 0;
timerPrew = millis();
}
if (countOn == 0) //"флажок" для разрешения подсчета
{
EEPROM.write(address, 0); // пишим в ЭН нули.
(address, liters = 0 ); // по адресу присваеваем значение ноль.
countOn = 1; //запрет подсчета после первого срабатывания кнопки
}
}
void pulsesi () {
pulses ++;
if (pulses == 450 ) {
pulses = 0;
liters ++;
}
}
// Прерывание вызывается один раз в миллисекунду, ищет любые импульсы от датчика!
ISR(TIMER2_COMPA_vect) {
uint8_t x = digitalRead(FLOWSENSORPIN);
if (x == lastflowpinstate) {
return; // nothing changed!
}
if (x == HIGH) {
pulsesi () ;
}
lastflowpinstate = x;
}
void useInterrupt(boolean v) {
if (v) {
OCR2A = 0xAF;
TIMSK2 |= _BV(OCIE2A);
}
else { // не вызывать функцию прерывания больше
TIMSK2 &= ~_BV(OCIE2A);
}
}
void setup() {
pinMode(5, OUTPUT);
pinMode(13, OUTPUT);
sensors.begin(); // инициализация библиотеки
lcd.createChar(0, gradus); // Функция создает пользовательский символ lcd.createChar(num, data)lcd: переменная типа LiquidCrystal
lcd.createChar(1, ulitsa); // num: номер пользовательского символа, который необходимо создать (от 0 до 7)
lcd.createChar(2, dvigatel);// data: данные о пикселах пользовательского символа
lcd.begin(16, 2);
lcd.clear();
EEPROM.get(address, liters);
lcd.setCursor (0, 1);
lcd.print (liters);
delay(500);
pinMode(FLOWSENSORPIN, INPUT);
digitalWrite(FLOWSENSORPIN, HIGH);
lastflowpinstate = digitalRead(FLOWSENSORPIN);
pinMode(3, INPUT);// pin кнопки на вход.
attachInterrupt(1, button, RISING); //прерывание по LOW - HIGH
useInterrupt(true);
}
void printTemperature(DeviceAddress deviceAddress) //функция получения температуры с датчиков
{
float tempC = sensors.getTempC(deviceAddress); // переменная для хранения температуры
lcd.print(tempC, 1); //1 выдает десятые, без 1 сотые
lcd.write(byte(0)); // выводит определенный пользовательский символ
lcd.print("C");
}
//Функция паузы
void Led_ON() {
digitalWrite(13, HIGH); // ваше действие
digitalWrite(5, LOW);//включение/выключение светодиода
}
void Led_OFF() {
digitalWrite(13, LOW); //выключение светодиода
digitalWrite(5, HIGH); //включение
}
void Led_ON1() {
digitalWrite(4, HIGH); //включение светодиода
}
void Led_OFF1() {
digitalWrite(4, LOW); //выключение светодиода
}
void loop() {
timer.run();
sensors.requestTemperatures();// запускаем измерение температуры на всех датчиках
lcd.setCursor(0, 0); // выставляем курсор
lcd.write(byte(1)); // выводит определенный пользовательский символ
printTemperature(sensor1); // выводим тепературу 1го датчика
lcd.setCursor(8, 0);
lcd.write(byte(2));
printTemperature(sensor2); // выводим тепературу 2го датчика
EEPROM.put(address, liters);
cli();
n = pulses;
sei();
flowMilliLitres = n;
flowMilliLitres /= 7.5 ;
flowMilliLitres /= 60.0;
//vout = analogRead(analoginput); //читаем значение входа А0.
//volt = vout * 5.0 / 1024.0 / 0.194; // вычисляем результат напряжения.
lcd.setCursor(4, 1);
lcd.print(flowMilliLitres); lcd.print("mL");
lcd.setCursor(0, 1);
lcd.print(liters); lcd.print("L");
lcd.setCursor (10, 1);
lcd.print (volt); lcd.print ("V"); // выводим результат измерения напряжения.
float temp = (sensors.getTempCByIndex(1));
if (temp >= 24) {
timer.setTimeout(2000, Led_ON);
}
else
{
(temp <= 24);
timer.setTimeout(2000, Led_OFF);
}
if (temp >= 50)// перегрев
{
timer.setTimeout(2000, Led_ON1);
}
else
{
(temp <= 50);
timer.setTimeout(2000, Led_OFF1);
}
}