управление реле

cur

✩✩✩✩✩✩✩
24 Авг 2022
1
0
Не могу написать скетч уже 2 недели, только учусь, не чего не получается. Можете помочь? Мне нужно чтобы один (неважно на сколько секунд) раз нажал на кнопку и на 2 или 3 секунды включалось реле а потом выключалось.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
138
Код в студию, то что уже сделали. Плюс оформите нормально, вставьте как положено с нумерацией строк. Плюс уточните условия, запуск сразу после нажатия или после отпускания кнопки. Пока реле включено кнопкой можно ещё 10 раз нажать, что в таком случае надо делать?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
691
166
Начни с азов. А то методом тыка и за год не ннаучишься.Там же есть простенький пример работы с кнокой. Возьми его за основу и допиливай.
 

Ничосе_Илья

✩✩✩✩✩✩✩
1 Апр 2021
12
0
@cur,
C++:
#define pinRelay 13 //Пин реле
#define buttPin 3 //Пин кнопки
#define Delay 5000 //Задержка после нажатия кнопки
void setup() {
  pinMode(buttPin, INPUT_PULLUP); //Подключить кнопку со встроенным резистором
  pinMode(pinRelay, OUTPUT); //Режим пина реле, как выход

}

void loop() {
  byte buttStat = digitalRead(buttPin); //считываем статус кнопки и записываем в переменную
  if(buttStat == 0){ //Если кнопка нажата
  uint32_t now = millis(); //Создаём локальную переменную с millis()
while (millis () - now < Delay) { //Выполняем цикл, пока millis меньше Delay
    digitalWrite(pinRelay, 1); //Включаем.
    digitalWrite(pinRelay, 0); //Выключаем.
   }
  }
}
 

poty

★★★★★★✩
19 Фев 2020
3,448
982
Да, с логикой туговато.
Попробуйте разделить код на 3 части:
1. Определить, что даётся сигнал включения реле. Игнорировать последующие сигналы, если реле включено.
2. Если есть сигнал включения реле - включить реле и запомнить, что оно включено и когда включено.
3. Если реле включено и прошло заданное время - выключить реле и запомнить, что оно выключено.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
138
C++:
#define pinRelay 13
#define buttPin 3
#define Delay 5000 //Лучше так не называть
void setup() {
  pinMode(buttPin, INPUT_PULLUP); //Подтянуть пин к плюсу
  pinMode(pinRelay, OUTPUT);

}

void loop() {
  byte buttStat = digitalRead(buttPin); //не кажется лишним?
  if(buttStat == 0){ //Если кнопка нажали - код ниже будет работать
          uint32_t now = millis(); //Так тоже лучше не называть переменные
        while (millis () - now < Delay) { //просто представим, что цикл будет работать как надо.
            digitalWrite(pinRelay, 1);         //Внутри цикла у Вас будет ШИМ сигнал
            digitalWrite(pinRelay, 0);
           }
  } // а если кнопку отпустили или не нажали то мы будем выполнять только 11 строку
}
Не буду вас мучить, как пример ниже, но дальше думайте самостоятельно.
Первая проблема у Вас в том, что правильного форматирования кода, и Вы сами не видите, что Вы делаете.
Прежде чем начать делать, продумайте алгоритм действия.
А самое главное, начинать лучше с этого https://alexgyver.ru/lessons/

C++:
#define PIN_RELAY 13 //Пин реле
#define PIN_BUTTON 3 //Пин кнопки
#define DELAY_RELAY_ON 5000 //Задержка после нажатия кнопки

void setup() {
  pinMode(PIN_BUTTON, INPUT_PULLUP); //Кнопку тянем к + питания
  pinMode(PIN_RELAY, OUTPUT);
}

void loop() {
    static uint32_t TimeStart;
    if(!digitalRead(PIN_BUTTON) && !digitalRead(PIN_RELAY)){ //Если кнопка нажата И реле выключено
        digitalWrite(PIN_RELAY, HIGH);                       //Включаем реле
        TimeStart = millis();                                //Запоминаем время включения
    }
//Если реле включено и прошло заданное время
    if (digitalRead(PIN_RELAY)&& (millis()-TimeStart < DELAY_RELAY_ON)) {
       digitalWrite(PIN_RELAY, LOW);          // реле надо выключить
    }
}
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
138
Смотри, ты нажал кнопку и у тебя идёт ШИМ сигнал на реле. Твой код не имеет смысла, проще было использовать делай. То есть вместо цикла включил реле подождал 5 секунд, выключил.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
138
Да как ты только в цикл попал, ты в нем завис на 5 секунд. Ты там 5 секунд крутишься, потом выскакивает из цикла. Я же написал код, специально время потратил, не хаил, ничего, посмотри мой код, прочувствуй разницу. У меня во время включения реле весь код лупа будет крутится.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
137
39
C++:
#ifndef F_CPU
  #define F_CPU 8000000UL
#endif

#include <avr/io.h>
#include <avr/interrupt.h>

#define PIN_RELAY PINB0 //Пин реле
#define PIN_BUTTON PINB1 //Пин кнопки
#define DELAY_RELAY_ON 5000 //Задержка после нажатия кнопки

uint16_t micro_timer = 0;
uint16_t sec_timer = 0;

void _loop() {
  if(sec_timer > DELAY_RELAY_ON) {
    sec_timer = 0;
    PORTB &= ~(1<< PIN_RELAY);
  }
  else {
    if(!(PINB & (1<<PIN_BUTTON)) && !sec_timer) {
      sec_timer = 1;
      PORTB |= (1 << PIN_RELAY); // вклчаем
    }
  }
}

ISR(TIMER0_COMPA_vect) {
  micro_timer++;
  if(micro_timer > 100) {
    micro_timer = 0;
    if(sec_timer) sec_timer++;
  }
  _loop();

}

void timer_init() {
  TCCR0A = (1<<WGM01);
  TCCR0B = (1<<CS01);
  OCR0A = 1;
  TIMSK = (1<<OCIE0A);
  sei();
}

int main(void)
{
  DDRB |= (1 << PIN_RELAY); // устанавлеваем как выход
  PORTB &= ~(1<< PIN_RELAY); //выключаем рел
  DDRB &= ~(1 << PIN_BUTTON);    // устанавливаем как вход;
  PORTB |= (1 << PIN_BUTTON); //подтягиваем
  timer_init();//настраиваем таймерж
}
Наглядно тут
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,166
934
Почему же не то,что надо?
Да потому. Вы задание ТС читали?
Мне нужно чтобы один раз нажал на кнопку и на 2 или 3 секунды включалось реле а потом выключалось.
То есть реле должно включится на 2 сек, а потом выключится. А что у вас? - у вас реле включается и выключается сотни раз в секунду. Это разве одно и то же?

И я подозреваю, что вы и сами не знаете, как ваш код работает - поэтому и написал, что вам еще рано помогать новичкам.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
137
39
@bort707, Да ладно тебе, он первый кто хоть какой-то код скинул, да не правильный, но хотя-бы попытался. А вообще с самого начала, не понятно что за контролёр, и в каким компилятора он будет собираться
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
691
166
он первый кто хоть какой-то код скинул, да не правильный, но хотя-бы попытался
Иногда лучше направить в нужное русло, что бы человек почитал, попробовал сделать сам, чем вот так вот подать ему готовый рабочий код, в котором много всяких цифр, букв и не привычных для русскоязычного человека слов. И для новичка ничего не понятно, что может отбить всё желание кодить дальше.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
137
39
@viktor1703, Значит такое желания кодить, по мне наоборот лучший дать готовый код и чтоб человек в нем стал разбирать, что как работает, и что за что отвечает. Тем самым развивая логику, и погружаясь в программирование. Блага интернет работает. А написать "я 14 дней пытаюсь, но не получатся" я тоже могу. Не за что не поверю что человек за 2 недели не нашёл, как считать кнопку и как сделать простой таймер
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,166
934
по мне наоборот лучший дать готовый код и чтоб человек в нем стал разбирать
практика показывает, что если человеку дать готовый код, он ничего в нем разбирать не будет, а просто вставит в программу и тут же забудет. А когда нужно будет исправить одну запятую - снова побежит на форум.

А написать "я 14 дней пытаюсь, но не получатся" я тоже могу. Не за что не поверю что человек за 2 недели не нашёл, как считать кнопку и как сделать простой таймер
так обычно пишут те, кто даже не пытался ничего искать. Таким тем более не надо давать готовое, иначе будет именно так, как я написал выше
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
137
39
практика показывает, что если человеку дать готовый код, он ничего в нем разбирать не будет, а просто вставит в программу и тут же забудет. А когда нужно будет исправить одну запятую - снова побежит на форум.
Говорю значит такое желания научится

так обычно пишут те, кто даже не пытался ничего искать. Таким тем более не надо давать готовое, иначе будет именно так, как я написал выше
Тем более он даже читать не будет ваши статьи, тут не ответят он на другом напишет форуме напишет, там помогу