цифровая электроника
вычислительная техника
встраиваемые системы

 

Простой таймер на Arduino

Автор: Mike(admin) от 27-05-2014, 07:45

Этот проект представляет собой простой таймер с малым количеством компонентов, позволяющий отсчитывать 60 секунд.


Простой таймер на Arduino

Устройство может быть запитано как от батарейки 9 В, так и от подходящего сетевого адаптера для Arduino. Работа схемы очень проста!


Схема простого таймера на Arduino

При нажатии кнопки RESET на плате Arduino таймер начнет обратный отсчет 60 секунд. При достижении нулевой секунды пьезозуммер (BZ1) начнет издавать звук, и на дисплее высветится сообщение «TIMER ALERT!». По желанию к четвертому выводу платы можно подключить реле. Например, если вы хотите установить электромагнитное реле для включения/выключения любой внешней электрической нагрузки, просто используйте этот выход для управления электромагнитной реле с помощью подходящей для этих целей схемы драйвера на транзисторной основе.


Простой таймер на Arduino

Код:



    //Arduino Self-Timer
    //T.K.Hareendran
    //www.electroschematics.com
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(7,8,9,10,11,12);
    int runTimer = 1;
    int runFor = 60; // time in seconds
    int buzzerPin = 13;
    int relayPin=4;
    int data = 0;
     
    void setup() {
    pinMode(buzzerPin, OUTPUT);
    pinMode(relayPin,OUTPUT);
    lcd.begin(16, 2);
    }
     
    void loop() {
    if(runTimer == 1){
    digitalWrite(relayPin,LOW); // реле отключено при счете таймера от 60 до 0
    /* *измените на HIGH, если хотите, чтобы оно было включено во время счета */
    lcd.clear();
    lcd.print("TIMER=");
    //Start timer
    timer();
    } else {
    digitalWrite(relayPin,HIGH); // реле включается по срабатыванию таймера
    /* *измените на LOW, если хотите, чтобы оно выключалось по срабатыванию таймера */
    }
    runTimer = 0;
    lcd.noDisplay();
    delay(250);
    for(int duration = 0; duration < 100; duration ++){
    digitalWrite(buzzerPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(buzzerPin, LOW);
    delayMicroseconds(500);
    }
    lcd.display();
    delay(250);
    }
     
    void timer() {
    for(int timer = runFor;timer > 0; --timer){
    if(timer >= 10) {
    lcd.setCursor(6,0);
    } else {
    lcd.setCursor(6,0);
    lcd.print("0");
    lcd.setCursor(7,0);
    }
    lcd.print(timer);
    lcd.print(" SECOND!");
    delay(1000);
    }
    lcd.setCursor(0,0);
    lcd.clear();
    lcd.print(" TIMER ALERT!");
    }



Перевод © digitrode.ru


<Источник>


Теги: Arduino




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Добрый день.
Подскажите, как нужно изменить код, чтобы таймер запускался по сигналу на пин, а не резетом?
Цитата
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 28.08.2013
  • Статус: Пользователь offline
  • Комментариев: 15
  • Публикаций: 1253
^
Если вкратце, то примерно так:

val = digitalRead(inPin); // inPin - номер желаемого пина
if (val == 1) {
runTimer = 1;
}
Цитата
  • Группа: Посетители
  • ICQ:
  • Регистрация: 25.09.2016
  • Статус: Пользователь offline
  • Комментариев: 3
  • Публикаций: 0
^
Цитата: Mike(admin)
Если вкратце, то примерно так:

val = digitalRead(inPin); // inPin - номер желаемого пина
if (val == 1) {
runTimer = 1;
}


Посмотрите пожалуйста код, компилируется но корректно не работает: #include <LiquidCrystal.h>
LiquidCrystal lcd(7,8,9,10,11,12);
int runTimer = 1;
int runFor = 10; // time in seconds
int inPin = 6;
int buzzerPin = 13;
int relayPin=4;


int val = digitalRead(inPin); // inPin - номер желаемого пина

void setup() {
pinMode(inPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(relayPin,OUTPUT);
lcd.begin(16, 2);
}

void loop() {
if (val == 1){
digitalWrite(relayPin,LOW); // реле отключено при счете таймера от 60 до 0
/* *измените на HIGH, если хотите, чтобы оно было включено во время счета */
lcd.clear();
lcd.print("TIMER=");
//Start timer
{
runTimer = 1;}
} else {
digitalWrite(relayPin,HIGH); // реле включается по срабатыванию таймера
/* *измените на LOW, если хотите, чтобы оно выключалось по срабатыванию таймера */
}
runTimer = 0;
Цитата
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 28.08.2013
  • Статус: Пользователь offline
  • Комментариев: 15
  • Публикаций: 1253
^
Во-первых, val = digitalRead(inPin) нужно поместить в бесконечный цикл. Во-вторых, в программе нет самого куска кода (функции timer() ), где таймер бы считал
Цитата
  • Группа: Посетители
  • ICQ:
  • Регистрация: 25.09.2016
  • Статус: Пользователь offline
  • Комментариев: 3
  • Публикаций: 0
^
Спасибо, заработало. Вторую часть кода просто не вложил в целях экономии места.

Попытался убрать LCD и buzzer и не могу отделаться от delay(1000);, задержка слишком большая уменьшаю меньше 200 код перестает работать. Вот как выглядит -

int runTimer = 1;
int runFor = 10; // time in seconds
int relayPin=4;
int data = 0;
int inPin = 6;

void setup() {
pinMode(inPin, INPUT);
pinMode(relayPin,OUTPUT);
}

void loop() {
int val = digitalRead(inPin); // inPin - номер желаемого пина
if (val == 1){
digitalWrite(relayPin,LOW); // реле отключено при счете таймера от 60 до 0
//Start timer
timer(); }
else {
digitalWrite(relayPin,HIGH); // реле включается по срабатыванию таймера
}
runTimer = 0;
}

void timer() {
for(int timer = runFor;timer > 0; --timer)
{ delay(1000); }
}

Посоветуйте...как заменить delay на millis вот моя попытка -

unsigned long previousMillis = 0; // состояние
const long interval = 1000; //интервал
int runTimer = 1;
int runFor = 10; // time in seconds
int relayPin=4;
int data = 0;
int inPin = 6;

void setup() {
pinMode(inPin, INPUT);
pinMode(relayPin,OUTPUT);
}

void loop(){
int val = digitalRead(inPin); // inPin - номер желаемого пина
if (val == 1){
digitalWrite(relayPin,LOW); // реле отключено при счете таймера от 60 до 0
timer(); } //Start timer
else {
digitalWrite(relayPin,HIGH); // реле включается по срабатыванию таймера
}
runTimer = 0;
}

void timer() {
for(int timer = runFor;timer > 0; --timer)
{ unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (runTimer == 0)
runTimer = 1;
else
runTimer = 0;
}}
}
не работает
Цитата
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 28.08.2013
  • Статус: Пользователь offline
  • Комментариев: 15
  • Публикаций: 1253
^
Не работает как? Не компилируется или не включается реле?
Цитата
  • Группа: Посетители
  • ICQ:
  • Регистрация: 25.09.2016
  • Статус: Пользователь offline
  • Комментариев: 3
  • Публикаций: 0
^
компилируется но срабатывает реле через 1 сек после запуска вне зависимости от установленной задержки