Ви не увійшли.
Я початківець, нещодавно почав вчити 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();
}
}
Неактивний
Подивіться приклад коду ось тут Скінченний автомат з трьома станами, у Вас також три стани: очікування, затримка, реле
Неактивний
#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*/
}
Даю підказку: дільника 2048 можна досягти за допомогою WGM mode=8,9,10,11, не доведеться сповільнювати процесор.
Ну і якщо вже так пропонуєте, використайте фітчу Toggle OC1A on compare match, взагалі буде хардварно вмикатися/вимикатися.
Неактивний
Даю підказку: дільника 2048 можна досягти за допомогою WGM mode=8,9,10,11, не доведеться сповільнювати процесор.
Дякую, матиму на увазі. Іноді сповільнення теж має свої плюси ;І
Ну і якщо вже так пропонуєте, використайте фітчу Toggle OC1A on compare match, взагалі буде хардварно вмикатися/вимикатися.
Пін 4!