#include <Arduino.h>
#include <GyverSegment.h>
#include <GyverDS18.h>
#include "GyverButton.h"
#include <avr/sleep.h>
#include <avr/power.h>
#define DIO_PIN 10
#define CLK_PIN 11
#define LAT_PIN 12
#define BTN1_PIN 5
#define BTN2_PIN 6
GButton butt1(BTN1_PIN);
GButton butt2(BTN2_PIN);
//Disp7219<1> disp(DIO_PIN, CLK_PIN, LAT_PIN);
Disp1637_4 disp(DIO_PIN, CLK_PIN);
GyverDS18Single ds(2);
int BTN_PWR = 3;
int LED = 13;
void setup() {
Serial.begin(115200);
pinMode(BTN_PWR, INPUT);
pinMode(LED, OUTPUT);
// HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND)
// LOW_PULL - кнопка подключена к VCC, пин подтянут к GND
// по умолчанию стоит HIGH_PULL
butt1.setType(HIGH_PULL);
// NORM_OPEN - нормально-разомкнутая кнопка
// NORM_CLOSE - нормально-замкнутая кнопка
// по умолчанию стоит NORM_OPEN
butt1.setDirection(NORM_OPEN);
butt1.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс)
butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс)
butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс)
ds.requestTemp(); // первый запрос на измерение
// текст
disp.setCursor(1);
disp.print(ds.getTemp());
disp.update();
disp.delay(100);
/* // целое число
disp.setCursor(0);
disp.print(1234);
disp.update();
disp.delay(1000);*/
// float
disp.setCursor(0);
disp.print(ds.getTemp()); // точность 3 знака
disp.update();
disp.delay(1000);
}
void Interrupt(void){
}
void Sleep(void){
digitalWrite(LED, LOW); // (3) Светодиод гаснет при нажатии кнопки.
delay(250);
sleep_enable();
attachInterrupt(1, Interrupt, HIGH);
power_all_disable(); // (4) Отключаем переферию.
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
MCUCR |= (1<<BODS) | (1<<BODSE);
MCUCR &= ~(1<<BODSE); // (5) Отключаем Brown Out Detector для режима сна.
sleep_mode(); // (6) С этого момента спим.
sleep_disable(); // (7) С этого момента пробуждаемся.
detachInterrupt(1);
power_all_enable(); // (8) Включаем переферию обратно.
delay(5);
while(digitalRead(BTN_PWR)){ // (9) Светодиод загорается сразу при нажатии. Как только кнопка будет отпущена, возвращаемся в loop().
digitalWrite(LED, HIGH);
}
delay(250);
}
void loop() {
digitalWrite(LED, HIGH); // (1) Светодиод горит
if (digitalRead(BTN_PWR)){ // (2) Если кнопка нажата, то вызываем фнкцию засыпания.
Sleep();}
butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
{
if (butt1.isClick()) Serial.println("Click"); // проверка на один клик
if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик
if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик
if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик
if (butt1.hasClicks()) // проверка на наличие нажатий
Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий
if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс)
if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс)
if (butt1.isHold()) { // если кнопка удерживается
Serial.print("Holding "); // выводим пока удерживается
Serial.println(butt1.getHoldClicks()); // можно вывести количество кликов перед удержанием!
}
if (butt1.isHold()) Serial.println("Holding"); // проверка на удержание
//if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки
/* if (butt1.isStep()) { // если кнопка была удержана (это для инкремента)
value++; // увеличивать/уменьшать переменную value с шагом и интервалом
Serial.println(value); // для примера выведем в порт
}*/
}
Serial.print("temp: ");
Serial.println(ds.getTemp());
disp.tick();
if (ds.ready()) {
disp.setCursor(1);
disp.print(ds.getTemp()); // точность 3 знака
disp.update();
disp.delay(100); }
else {
Serial.println("error");
disp.setCursor(1);
disp.print(ds.getTemp()); // точность 3 знака
disp.update();
disp.delay(100);
}
ds.requestTemp();
}
Loading
ds18b20
ds18b20