Таймер на ардуино

Галерея
Andy18
A

Ижевск
28 / 13 раз

Приветствую всех аквариумистов. Решил поделиться своей версией таймера для кормления. Посмотрел на форумах массу вариантов таймеров, на ардуино+энкодер варианта не нашел (может плохо искал), тем не менее решил выложить свой вариант таймера, может быть кому-нибудь пригодится. Был у меня самодельный тройничок с выключателями на каждый канал из эл.коробки 100*100*50, очень удобно, при обслуживании аквариума, либо кормлении. Но как обычно иногда забывал после кормления включать фильтр. Нашел в инете интересную программку таймера на ардуино, допилил под свой дисплей и решил впихнуть в свой тройничок таймер. Итак нам нужен:
- сама ардуинка нано:https://aliexpress.ru/item/32341832857. ... 4441736976 - 209р.
- энкодер: https://aliexpress.ru/item/32827628801. ... 4944867895 - 40р.
- реле 5в: https://aliexpress.ru/item/32997387727. ... 6976944519 - 40р.
- олед дисплей:https://aliexpress.ru/item/100500435554 ... 8880136293 - 105р.
- б/п 5в
Собрал на коленке, проверил работает Далее запихал в свой тройничок. Суть работы: энкодером выставляем нужное время: 30мин. максимум, стартуем.
Время сохраняется, в следующий раз достаточно только стартануть одним нажатием.
Схема подключения и программка: #include <Wire.h> // библиотека для протокола I2C
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
Adafruit_SSD1306 display(-1);
#include <RotaryEncoder.h> // библиотека для энкодера
RotaryEncoder encoder(4, 2); // пины подключение энкодера (DT, CLK)

// задаем шаг энкодера, максимальное и минимальное значение
#define STEPS 1
#define POSMIN 0
#define POSMAX 30

int lastPos, newPos;
boolean buttonWasUp = true;
byte w = 0;
int SEC= 0;
int MIN = 0;
unsigned long timer;

void setup() {
pinMode(6, INPUT_PULLUP); // пин для кнопки энкодера
encoder.setPosition(0 / STEPS);
pinMode(10, OUTPUT); // подключаем реле
digitalWrite(10, HIGH);
// инициализируем I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Очистить буфер.
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30,0); display.println("TIMER");
display.setTextSize(5);
if (MIN<10)
{
display.setCursor(30,24); display.print(MIN);
}
else
{
display.setCursor(0,24); display.print(MIN);
}
if (SEC<10)
{
display.setCursor(68,24); display.print("0");
display.setCursor(98,24); display.print(SEC);
}
else
{
display.setCursor(68,24); display.print(SEC);
}
display.fillCircle(61, 34, 2, WHITE); display.fillCircle(61, 48, 2, WHITE);
display.display();
display.clearDisplay();
}

void loop() {

// проверяем положение ручки энкодера
encoder.tick();
newPos = encoder.getPosition() * STEPS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPS);
newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPS);
newPos = POSMAX;
}

// если положение изменилось - меняем переменную MIN и выводим на дисплей
if (lastPos != newPos){
MIN = newPos;
lastPos = newPos;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30,0); display.println("TIMER");
display.setTextSize(5);
if (MIN<10)
{
display.setCursor(30,24); display.print(MIN);
}
else
{
display.setCursor(0,24); display.print(MIN);
}
if (SEC<10)
{
display.setCursor(68,24); display.print("0");
display.setCursor(98,24); display.print(SEC);
}
else
{
display.setCursor(68,24); display.print(SEC);
}
display.fillCircle(61, 34, 2, WHITE); display.fillCircle(61, 48, 2, WHITE);
display.display();
display.clearDisplay();
}

// если была нажата кнопка энкодера запускаем отсчет времени
boolean buttonIsUp = digitalRead(6);
if (buttonWasUp && !buttonIsUp && MIN > 0) {
delay(10);
buttonIsUp = digitalRead(6);
if (!buttonIsUp) {
if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
if (MIN < 0 ) { MIN = 0; }
digitalWrite(10, LOW);
w = 1;
}
}
buttonWasUp = buttonIsUp; // запоминаем состояние кнопки

while (w == 1 ) {
// если прошло 1000 мс - вычитаем одну секунду от переменной SEC
if (millis() - timer > 1000) {
timer = millis();
SEC = SEC - 1;

// если отсчет закончился - обнуляемся, включаем сигнал и выходим из цикла
if (SEC == 0 && MIN == 0) {
lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30,0); display.println("TIMER");
display.setTextSize(5);
if (MIN<10)
{
display.setCursor(30,24); display.print(MIN);
}
else
{
display.setCursor(0,24); display.print(MIN);
}
if (SEC<10)
{
display.setCursor(68,24); display.print("0");
display.setCursor(98,24); display.print(SEC);
}
else
{
display.setCursor(68,24); display.print(SEC);
}
display.fillCircle(61, 34, 2, WHITE); display.fillCircle(61, 48, 2, WHITE);
display.display();
display.clearDisplay();
digitalWrite(10, HIGH);
delay(500);
w = 0;
}
// если секунды дошли до нуля - вычитаем одну минуту
if (SEC == 0 && w==1) {
SEC = 59; MIN = MIN - 1;
if (MIN < 0 ) { MIN = 0; }
}
// если из цикла while еще не вышли - выводим информацию на дисплей
if (w == 1) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30,0); display.println("START");
display.setTextSize(5);
if (MIN<10)
{
display.setCursor(30,24); display.print(MIN);
}
else
{
display.setCursor(0,24); display.print(MIN);
}
if (SEC<10)
{
display.setCursor(68,24); display.print("0");
display.setCursor(98,24); display.print(SEC);
}
else
{
display.setCursor(68,24); display.print(SEC);
}
display.fillCircle(61, 34, 2, WHITE); display.fillCircle(61, 48, 2, WHITE);
display.display();
display.clearDisplay();
}
}
// если была нажата кнопка - обнуляем переменные и выходим из цикла
buttonIsUp = digitalRead(6);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(6);
if (!buttonIsUp) {
lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30,0); display.println("TIMER");
display.setTextSize(5);
if (MIN<10)
{
display.setCursor(30,24); display.print(MIN);
}
else
{
display.setCursor(0,24); display.print(MIN);
}
if (SEC<10)
{
display.setCursor(68,24); display.print("0");
display.setCursor(98,24); display.print(SEC);
}
else
{
display.setCursor(68,24); display.print(SEC);
}
display.fillCircle(61, 34, 2, WHITE); display.fillCircle(61, 48, 2, WHITE);
display.display();
display.clearDisplay();
digitalWrite(10, HIGH);
w = 0;
}
}
buttonWasUp = buttonIsUp; // запоминаем состояние кнопки
}
}

Andy18
A

Ижевск
28 / 13 раз

Добавляю небольшое видео
https://www.youtube.com/watch?v=nZP8EH-cbMg


  • Похожие темы