#1 2023-09-02 10:54:32

Luisianamen
Учасник
З Мукачево
Зареєстрований: 2023-08-31
Повідомлень: 1

Допоможіть будь ласка з скетчем для реле.

Я початківець, нещодавно почав вчити Arduino. Написав скетч для Arduino uno, датчик вібрації SW-420 і Модуль 1 реле 5V для Arduino. Як працює скетч – в стані покою на цифровий вхід 8 від датчика вібрації подається HIGH, реле вимкнуто - на цифровому виході 4 LOW. Коли спрацював датчик на 8 піні LOW, через команду millis() на протязі 5сек., на 4 піні HIGH. В початку скетча використав команду delay так як при подачі напруги на Arduino зразу вмикається реле на 5 сек.,  потім скетч виконується нормально. В чому саме потрібна допомога – хочу зробити цей скетч так, щоб коли на 8 пине з’явилося LOW то на 4 пине HIGH з’являлося лише через 3сек., трималося там 5сек., і вимикалося. Головна умова не використовувати DELAY.
Дякую.



int releyPin = 4;
int vibrationPin = 8;
unsigned long vibr;
int vibrationState = 0;
void setup() {
  delay (5000);
  pinMode (releyPin, OUTPUT);
  pinMode (vibrationPin, INPUT);
}

void loop()

{
  vibrationState = digitalRead(vibrationPin);
  if (vibrationState == HIGH) {
    digitalWrite(releyPin, LOW);
  }
  if (vibrationState == LOW && millis() - vibr > 5000) {
    digitalWrite(releyPin, HIGH);
    vibr = millis();
  }
}

Неактивний

#2 2023-09-02 11:06:58

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 415

Re: Допоможіть будь ласка з скетчем для реле.

Подивіться приклад коду ось тут Скінченний автомат з трьома станами, у Вас також три стани: очікування, затримка, реле

Неактивний

#3 2023-09-02 14:26:15

akapulko
Гість

Re: Допоможіть будь ласка з скетчем для реле.

#include <avr/power.h>

void init_TIM1(void) {
  TCCR1A = 0; /*Normal mode*/
  TCCR1B = 0x85;
  TIMSK1 = 0x20; /*Enable ICIE1*/
  OCR1A = 23438; /*3 sec at 8MHz*/
  OCR1B = 62500; /*3+5=8 sec at 8MHz*/
  TCNT1 = 0;
}

void setup() {
  clock_prescale_set(clock_div_2); /* Set 8MHz CPU clock */
  DDRD |= _BV(4); /*Condigure PD4 as outputs*/
  PORTD &= ~_BV(4); /*Initially LOW on PD4*/  
  PORTB |= _BV(0); /*Pull-up PB0*/
  init_TIM1();
  sei();
}

void loop() {}

ISR(TIMER1_COMPA_vect){
  PORTD |= _BV(4);
}

ISR(TIMER1_COMPB_vect){
  PORTD &= ~_BV(4);
  TIMSK1 = 0x20; /*Clear OCIE1B, OCIE1A*/
}

ISR(TIMER1_CAPT_vect){
  TCNT1 = 0;
  TIMSK1 |= 0x06; /*Enable OCIE1B, OCIE1A*/
}

#4 2023-09-02 15:20:32

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 415

Re: Допоможіть будь ласка з скетчем для реле.

Даю підказку: дільника 2048 можна досягти за допомогою WGM mode=8,9,10,11, не доведеться сповільнювати процесор.
Ну і якщо вже так пропонуєте, використайте фітчу Toggle OC1A on compare match, взагалі буде хардварно вмикатися/вимикатися.

Неактивний

#5 2023-09-02 15:46:48

akapulko
Гість

Re: Допоможіть будь ласка з скетчем для реле.

Даю підказку: дільника 2048 можна досягти за допомогою WGM mode=8,9,10,11, не доведеться сповільнювати процесор.

Дякую, матиму на увазі. Іноді сповільнення теж має свої плюси ;І

Ну і якщо вже так пропонуєте, використайте фітчу Toggle OC1A on compare match, взагалі буде хардварно вмикатися/вимикатися.

Пін 4!

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму