Ви не увійшли.
У меня к одной ардуине подключено 2 реле. Нужно, чтобы одно включалось и выключалось 1 раз в сутки, а другое - каждые пол часа. Но время просто суммируется и оба реле включаются и выключаются раз в сутки + полчаса. Есть возможность разделить?
#define PIN_RELAY1 5
#define PIN_RELAY2 3
void setup()
{
pinMode(PIN_RELAY1, OUTPUT);
digitalWrite(PIN_RELAY1, HIGH);
pinMode(PIN_RELAY2, OUTPUT);
digitalWrite(PIN_RELAY2, HIGH);
}
void loop()
{
digitalWrite(PIN_RELAY1, LOW);
delay(43200000);
digitalWrite(PIN_RELAY1, HIGH);
delay(43200000);
digitalWrite(PIN_RELAY2, LOW);
delay(300000);
digitalWrite(PIN_RELAY2, HIGH);
delay(1800000);
}
Неактивний
Всем здравствуйте.
Тут даже я понимаю, что ваш код работает не так, как вы задумали. Если я правильно понимаю, то у вас сперва подаётся низкий уровень на реле 1, после этого контроллер НЕ делает ничего, кроме как мотает делаем 43200000, потом ставит высокий уровень, точно также не делает ничего, кроме как опять же выжидает 43200000 и ТОЛЬКО после этих двух периодов начинает работать с вторым реле.
С моей точки зрения, наверное стоит поступить так:
перекинуть значение первого реле, перекинуть значение второго реле и поставить его работу в цикл FOR, для 24 часов надо поставить счет 48. И после окончания этого счетчика перекинуть состояние первого реле в противоположное и повторить цикл FOR на заданные промежутки.
Я совсем новичок в этом деле, но читал что дэлай на большую выдержку это совсем зло.
Второй вариант как мне видится - использовать таймеры. пока не умею, но гугл знает об этом много.
третий вариан использовать функцию миллис (?).
Скорее всего меня сейчас во многом поправят, но это даже хорошо.
Функцию миллис также весьма просто загуглить.
Неактивний
Всем спасибо за ответы!
Нашёл решение у AlexGyver. Слепил из двух кусочков. Проверял на секундах - вроде работает, но только со второго периода. Вот если кому интересно.
#define RELAY1 3
#define RELAY2 5
#define PERIOD_1 86400000 // период первой задачи
#define PERIOD_2 1800000 // период второй задачи
unsigned long timer_1, timer_2, timer_3;
void setup() {
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
}
if (millis() - timer_1 > PERIOD_1) { // условие таймера
timer_1 = millis(); // сброс таймера
uint32_t now = millis();
while (millis () - now < 36000000) {
digitalWrite(RELAY1, HIGH)
}
digitalWrite(RELAY1, LOW)
}
if (millis() - timer_2 > PERIOD_2) {
timer_2 = millis();
uint32_t now2 = millis();
while (millis () - now2 < 300000) {
digitalWrite(RELAY2, HIGH)
}
digitalWrite(RELAY2, LOW)
}
}
Остання редакція Alexs (2019-09-12 21:08:45)
Неактивний
Гайвер? ФИ!!!! Уж лучше на ардуиновской библиотеке
#include <SimpleTimer.h>
#define RELAY1 3
#define RELAY2 5
#define PERIOD_1 86400000 // период первой задачи
#define PERIOD_2 1800000 // период второй задачи
SimpleTimer timer1;
SimpleTimer timer2;
void rele_1() {
digitalWrite(RELAY1, !digitalRead(RELAY1));
}
void rele_2() {
digitalWrite(RELAY2, !digitalRead(RELAY2));
}
void setup() {
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
// digitalWrite(RELAY1,HIGH); // если нужно задаем
// digitalWrite(RELAY2,HIGH); // начальное состояние реле при старте
timer1.setInterval(PERIOD_1, rele_1);
timer2.setInterval(PERIOD_2, rele_2);
}
void loop() {
timer1.run();
timer2.run();
}
Неактивний
Если Вы посмотрите во внутрь https://github.com/jfturcot/SimpleTimer/blob/master/SimpleTimer.cpp
То увидите там тот же millis() и еще не совсем понятный код.
А вообще лучше использовать часы реального времени придать большую точность и возможно учесть ту вероятность что электричество может пропадать
Остання редакція Avazart (2019-09-13 00:30:26)
Неактивний
Причём тут библиотеки участвуют или нет? Ошибка в этом коде точно такая же, как и ошибка в коде той библиотеки. И также время подвирает. Просто человек так пишет.
Остання редакція Kaka (2019-09-14 11:19:23)
Неактивний
Да, но в том коде, что я у него взял, библиотеки вообще не участвуют
То, что вы вырвали http://forum.arduino.ua/viewtopic.php?pid=29162#p29162 (пост #8) может в исходной программе и работает.
Но в том виде который вы привели это просто набор символов.
У вас получилось из этого решить свою задачу ?
Неактивний
Как по мне это придирка это не существенно ибо точность такого метода замера все равно желает лучшего.
Там где нужна точность ms стоит использовать реальный таймер + прерывания.
Да new кажется в Arduino не стоит использовать.
Думаю есть более серьезные вещи достойные критики.
Например Си стайл кода, когда пишем то на С++.
Библиотека для кнопок и энкодера у меня вызывает улыбку. Лично я не считаю что для таких вещей стоит писать библиотеки.
Уж больно их обработка может разнится от проекта к проекту.
Естественно что бы не было нагромождения можно выводить код в отделньные модули / классы но что бы презентовать как ....
Остання редакція Avazart (2019-09-14 12:53:33)
Неактивний
То, что вы вырвали http://forum.arduino.ua/viewtopic.php?pid=29162#p29162 (пост #8) может в исходной программе и работает.
Но в том виде который вы привели это просто набор символов.У вас получилось из этого решить свою задачу ?
Да, всё чётко работает. Даже если точность +- минута, меня всё-равно устраивает
Неактивний
Гайвер? ФИ!!!! Уж лучше на ардуиновской библиотеке
#include <SimpleTimer.h> #define RELAY1 3 #define RELAY2 5 #define PERIOD_1 86400000 // период первой задачи #define PERIOD_2 1800000 // период второй задачи SimpleTimer timer1; SimpleTimer timer2; void rele_1() { digitalWrite(RELAY1, !digitalRead(RELAY1)); } void rele_2() { digitalWrite(RELAY2, !digitalRead(RELAY2)); } void setup() { pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); // digitalWrite(RELAY1,HIGH); // если нужно задаем // digitalWrite(RELAY2,HIGH); // начальное состояние реле при старте timer1.setInterval(PERIOD_1, rele_1); timer2.setInterval(PERIOD_2, rele_2); } void loop() { timer1.run(); timer2.run(); }
Хорошо. А как она мне отключит реле в течение суток на 10 часов? А для второго реле включит на 5 минут?
Остання редакція Alexs (2019-09-14 13:00:08)
Неактивний
Вам нужно было раз в сутки и раз в 30 минут. Откуда взялось 10 ч и 5 минут? Для начала объясните подробно и точно что нужно делать. Ну и посмотрите примеры и описание библиотеки https://playground.arduino.cc/Code/SimpleTimer/
Неактивний
Неактивний
Странная статья и код, так и не сказано откуда взято такое заключение.
Можно писать более человеко-читаемо:
typedef unsigned long ulong;
const ulong period_1= 24*60*60*1000UL; // 24 часа
const ulong period_2= 30*60*1000UL; // 30 мин
Остання редакція Avazart (2019-09-14 14:44:13)
Неактивний
Вам нужно было раз в сутки и раз в 30 минут. Откуда взялось 10 ч и 5 минут? Для начала объясните подробно и точно что нужно делать. Ну и посмотрите примеры и описание библиотеки https://playground.arduino.cc/Code/SimpleTimer/
Виноват. Подумал, что тут умеют читать мысли.
Надо чтобы раз в сутки одно реле включалось на 10 часов, остальное время оно выключено. А второе выключалось на 5 минут в течение каждых 30 минут, а остальные 25 минут оно включено.
Неактивний
Странная статья и код, так и не сказано откуда взято такое заключение.
Это может показаться, для вас, странным но некоторые люди умеют соображать сами.
/**/
class cl_aaa {
protected:
byte pin;
static const byte sON = 0; // состояние вкл
static const byte sOFF = 1; // состояние выкл
unsigned long time1, time, past;
byte state;
void set(byte s) {
past = millis();
state = s;
if (state == sON) digitalWrite(pin, HIGH);
else digitalWrite(pin, LOW);
}
public:
cl_aaa(byte p, unsigned long t1, unsigned long t): pin(p), time1(t1), time(t) {}
void init() {
pinMode(pin, OUTPUT);
set(sON);
}
void run() {
if (state == sON && millis() - past >= time1)set(sOFF);
if (state == sOFF && millis() - past >= (time - time1))set(sON);
}
};
cl_aaa aaa1(/*пин*/13,/*время вкл*/(unsigned long )500,/*время цикла*/(unsigned long )1000);
cl_aaa aaa2(/*пин*/12,/*время вкл*/(unsigned long )1000,/*время цикла*/(unsigned long )2000);
//----------------------------------------------------
void setup() {
aaa1.init();
aaa2.init();
}
void loop() {
aaa1.run();
aaa2.run();
}
Неактивний