Arduino: Таймер включения/отключения

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cesium137 пишет:

Знаю. зеленый провод с землей коротнуть. 

И нагрузку повесить - не забыть.

bwn
Offline
Зарегистрирован: 25.08.2014

Cesium137 пишет:

Блок питание от компьютера подойдет? там выход на 5 вольт есть. Ток такого выхода 20А. 

Конечно подойдет, только нахрена? По MQ, Eвгений уже сказал, 0,16А. На обычные датчики по 5-10мА на каждый добавьте, экран - даташит смотреть, что то исполнительное (типа двигателей) - тоже даташит. Все суммируете, умножаете на 1,5 и получаете минимальный ток от БП.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Спасибо за совет. Только что про нагрузку прочитал на другом форуме. типо ненужные HDD подключить пару штук. типо нежелательно использовать блок без нагрузки хотябы 10-15 гарузки от общейй. По габбаритам подойдет пока.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

как раз можно реле, датчики сервоприводы питать от блока 5В. Думаю оптимальный вариант БП от ПК. А на ардуино сигнальные провода пускать на входы и выходы

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Так кину похожий код

/* вытяжка цикл 3 часа - 1 работает 2часа нет
#1
реле -> 2 (Relay_pin) 0 вкл/ 1 откл
*/
//#1
const int Relay_pin = 2;
bool Relay; //состояние реле 1 вкл/ 0 нет
void setup() {
  //#1
  pinMode(Relay_pin, OUTPUT);
  digitalWrite(Relay_pin, Relay = 1);
}

void loop() {
  //#1 3 часа вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (Relay && millis() - past_1 >= 1 * 60 * 60 * 1000) // если прошел 1 час
    digitalWrite(Relay_pin, Relay = 0); // выкл вытяжку
  if (millis() - past_1 >= 3 * 60 * 60 * 1000) { // если прошло 3 часа
    past_1 = millis() ;
    digitalWrite(Relay_pin, Relay = 1); // вкл вытяжку
  }
}

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Спасибо за Ваш код. попробую и его сейчас

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cesium137 пишет:

 хотябы 10-15 гарузки от общейй. 

Я вот тоже такое читал, но но показалось, что это неоправданно много. Тогда я взял и померял какую нагрузку даёт включенный, но не работающий CD (его то хватает железно). Так вот, там 200mА по 5-вольтовой линии (что существенно меньше 10-15%, больше похоже на 1%). Так с тех пор я так и поступаю - савлю в 5-вольтовую линию резистор 25 ом / 50 Ватт, грею им атмосферу и не парюсь. Отлично всё работает. Ну не CD же ставить, правда? :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

200mА по 5-вольтовой линии это 1 вт в 25 Ом.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

200mА по 5-вольтовой линии это 1 вт в 25 Ом.

Вы сомневаетесь в том, что могу 2 на 5 умножить?:))))))

1Вт - это правильно, но 25 Ваттный резистор как-то неприлично грелся. Мне не понравилось, стал ставить 50 Ваттные, благо их у меня много. Так те холодные :)

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Согласен что не сиди ставить. Запишука себе номинал резистора ваш. Вопрос такой. А собственно зачем блоку давать нагрузку?  Что будет если ардуину одну запустить? тоесть без резисторад допустим

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не ко мне. Я знаю, что импульсным блокам без нагрузки плохеет, но почему ... спросите у кого-нибудь другого.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Главное что он плохеет а почему пока для мне  ненужно знать. Спаисбо за ответ Евгений.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

А что лучше от 5В или от 12 питать ардуино БП от ПК. всетаки 12 предел. темболее мультиметр 12.03В выдает

bwn
Offline
Зарегистрирован: 25.08.2014

Если имеем 5В стабильных, зачем жарить стабилизатор на Ардуино?

lean_74
Offline
Зарегистрирован: 22.12.2015

Cesium137 пишет:

Знаю. зеленый провод с землей коротнуть. Я ремонтом копмьютеров занимаюсь. В основном программным ремонтов. немного техническим (перепайка конденсаторов)

Ремонт компьютеров... а закон Ома где-нибуть изучали? Может и ток в сети 220 вольт меряли?

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Нет такое не делал. Виноват что мерил тот без нагрузки. В электронике не силен. ПО мнемногу начинюизучать. Единствено что я делал для себя это изменял напряжение ЗУ от телефона с 5в 12 в путе мзамены (выпаивания) стабилитрона

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот еще проще код.

/* вытяжка цикл 3 часа - 1 работает 2часа нет
#1
реле -> 2 (Relay_pin) 1 вкл/ 0 откл
*/
//#1
const int Relay_pin = 2;
const uint32_t period = 3 * 60 * 60 * 1000; // время цикла 3 часа
const uint32_t time_ON = 1 * 60 * 60 * 1000; // время когдв включено 1 час
void setup() {
  //#1
  pinMode(Relay_pin, OUTPUT);;
}

void loop() {
  //#1
  digitalWrite(Relay_pin, millis()%period < time_ON); 
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

минимализм

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, millis()%(3 * 60 * 60 * 1000)< (1 * 60 * 60 * 1000)); 
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

минимализм  

Класно!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

минимализм

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, millis()%(3 * 60 * 60 * 1000)< (1 * 60 * 60 * 1000)); 
}

vosara пишет:

минимализм  

Класно!!!

Действительно, классно!

Жаль только, что не работает.

Но, это может и ничего, первый закон Скотта даже Клапауций не отменял, а он гласит: «Неважно, что что-то идёт неправильно. Возможно, это хорошо выглядит»

 
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:

Жаль только, что не работает.

Всегда завидовал людям, для которых личное мнение выше окружающий действительности. Сказал, как отрезал.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

ЕвгенийП пишет:

Жаль только, что не работает.

Всегда завидовал людям, для которых личное мнение выше окружающий действительности. Сказал, как отрезал.

...тут и к бабке не ходи - по гороскопу ВЕСЫ прослеживаются (если астрология нам не врёт)

Проверил изменив на 3 и 1 секунда, действительно светодиод зажёгся и не гаснет )))

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В протеусе проверил все РАБОТАЕТ, только время уменьшил

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, millis()%(5000)< (1000)); 
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

vosara пишет:

В протеусе проверил все РАБОТАЕТ, только время уменьшил

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, millis()%(5000)< (1000)); 
}

А я на ардуино нано - не работает
 

void setup() {
  pinMode(3, OUTPUT);
}

void loop() {
  digitalWrite(2, millis()%(3 * 1 * 1 * 1000)< (1 * 1 * 1 * 1000)); 
}

В чём подвох?

уВИДЕЛ САМ, ПИН ВВЕРХУ СМЕНИЛ В ЛУПЕ НЕТ, ЗАМЕНИЛ НА 3-ТИЙ РАБОТАЕТ КАК ЧАСЫ

"еСЛИ БЫ Я НЕ СПЕШИЛ ОНА УСПЕЛА СНЯТЬ КОЛГОТКИ"

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Так там время большое, может не дождались? Попробуйте тот где я уменьшил

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ТАК Я ВРЕМЯ ПОПРАВИЛ НА 3 И 1 СЕКУНДА, ВСЁ РАБОТАЕТ!
ЕВГЕНИЙ ПЕТРОВИЧ, ОБЪЯСНИТЕСЬ )))

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Ну да! А я не смотрел, думал Вы взяли готовый "qwone"

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

vosara пишет:

Ну да! А я не смотрел, думал Вы взяли готовый "qwone"

Нееее...медитировать я предпочитаю с приятными тактильными ощущениями )))
Ждать четыре часа это слишком )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Коллеги, Ваши проверки некорректны. Вы уменьшали время и тем самым устраняли ошибку.

Программа действительно не работает ни с третьим пином, ни с десятым, ни в протеусе, ни где-либо ещё.

Хотите корректную проверку? Извольте. Оставляем условие в точности как было в исначалном посте, только вместо миллиса ставим точно такого же типа переменную и увеливаем её минут на 15 за каждый проход. Тогда час будет пробегать за 4 прохода.

Смотрите:

void setup() {
  Serial.begin(115200);
}

void loop() {
	static unsigned long _millis = 0;
	const static unsigned long _15_minutes = 900000ul;
 
 	Serial.println(_millis%(3 * 60 * 60 * 1000)< (1 * 60 * 60 * 1000)); 
 	_millis += _15_minutes;
}

Все согласны, что проверка корректна?

А вот её результат:

1
1
1
1
1
1
1
1
1
1
1
1
 
Как видите, всегда true.
 
А вот как надо было это писать (найдите разницу)
 
void setup() {
  Serial.begin(115200);
}

void loop() {
	static unsigned long _millis = 0;
	const static unsigned long _15_minutes = 900000ul;
 
 	Serial.println(_millis%(3ul * 60 * 60 * 1000)< (1ul * 60 * 60 * 1000)); 
 	_millis += _15_minutes;
 }

///// результат
//	1
//	1
//	1
//	1
//	0
//	0
//	0
//	0
//	0
//	0
//	0
//	0
//	1
//	1
//	1
//	1
//	0
//	0
//	0
//	0
//	0
//	0
//	0
//	0
//	1
//	1
//	1

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

Всегда завидовал людям, для которых личное мнение выше окружающий действительности. Сказал, как отрезал.

Не понял этого пассажа. Моё мнение о работоспособности данного скетча находится в полном соответсвии с действительностью. Скетч в действительности не работает, и мнение моё о нём точно такое же. Вы с этим не согласны? Или у Вас с этим какие-то проблемы? Хотите об этом поговорить?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Запись времени - да! Лучше использовать константу. Но само решение - интересно. Кстати с константой тоже работает

void setup() {
  Serial.begin(9600);
}

void loop() {
	static unsigned long _millis = 0;
	const static unsigned long _15_minutes = 900000;
 
 	Serial.println(_millis%(10800000)< (3600000)); 
 	_millis += _15_minutes;
 }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vosara пишет:

Запись времени - да! Лучше использовать константу. 

Так, Вы разницу-то в строке условия уяснили? В чём ошибка была поняли?

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Понятно, результат будет иметь тип первой цифры.

Но в таком выражении переход через ноль не учитывается.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nosferatu пишет:

Понятно, результат будет иметь тип первой цифры.

Не совсем, но общая идея - да, в оригинальном скетче числовые константы были не того типа.

Nosferatu пишет:

Но в таком выражении переход через ноль не учитывается.

Да, это так. При переходе через 0, здесь возникает сбой.

Очень хорошо, что Вы это заметили. Я об этом даже не подумал.

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016
Я прочитал последние ваши страницы с другим кодом. Как думаете этот код вполне нормальный? Если задавать часы работы реле а не секунды как на примере здесь
int rele =2;

unsigned long currentPause = millis();   //массив данных.
bool fl_pause;//массив данных.
//unsigned long time = millis();
void setup()
{
pinMode(rele, OUTPUT);

}
void loop()
{
 
 time5_10(); //ЗАпуск функции самого таймера циклично повторяя ее

  
}
  

void time5_10() // сама функция таймера, ее тело
{
if (fl_pause == 0 && millis() - currentPause >= 5000)  //В начале запуска Вытяжка не работает  5 секунд
    {
        digitalWrite(rele, HIGH);//по достижении 5 секунд она включается командой HIGH
        currentPause = millis();
        fl_pause = 1;
    }
    if (fl_pause == 1 && millis() - currentPause >= 10000)  //Если прошло 10 секунд то
    {
        digitalWrite(rele, LOW);// то вытяжка отключается, т.е получается она проработает 10 секунд.
        fl_pause = 0;
        currentPause = millis();
    
}
}

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

А кк сделать чтобы в лупе выполнялись еще параллельные задачи (функции) одновременно. а то я делаю например две функции отдельные. заношу их в луп  но пока не выполнится первая не запустится вторая. Я читал что в ардуино так аппаратно устроено изначально. Что программно надо решать проблему. Но как можно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Cesium137 пишет:

чтобы в лупе выполнялись еще параллельные задачи (функции) одновременно ...

Что программно надо решать проблему. Но как можно?

Можно по-всякому, но боюсь, Вам пока лучше постараться придумать такой алгоритм, который этого не требует - обойтись псевдопараллельностью. Сами Вы пока  этого не сделаете, а если возьмёте готовую библиотеку (их есть у нас №1, №2, №3 и ещё стопиццот), то пока не сможете её грамотно использовать. Параллельное программирование - это высшая лига, Вам пока рано. Не обижайтесь, но это пока так.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Спасибо. НЕ обижаюсь. Потому что я несилен в ардуино программировании, но потихоньку изучаю. раньше на делфи по нужде программировал. Просто придумал такой алгоритм небольшой. НАпример вытяжка управляется по таймеру и в этот момент датчик температуры работает измеряя температуру и выводя ее на экран или лед дисплей. ПОнимаю что пока цикл с вытяжкой не пройдет датчик не начнет считывать температуру. 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Вроде код нашел в гугле параллельной работы  тонового динамика и светодиода. Незнаю насколько он хорош буду пробовать. 

void loop() {
    // Управление звуком:
    tone(soundPin, 700); 
    delay(200);
    tone(soundPin, 500); 
    delay(200);
    tone(soundPin, 300);
    delay(200);
    tone(soundPin, 200);
    delay(200);
     
    // Мигание светодиодом:
    // время с момента включения Arduino, мсек:
    unsigned long currentMillis = millis(); 
    // Если время мигать пришло,
    if (currentMillis - previousMillis >= ledInterval) {
        previousMillis = currentMillis;  // то запоминаем текущее время
        if (ledState == LOW) {  // и инвертируем состояние светодиода
              ledState = HIGH;
        } else {
              ledState = LOW;
        }
        digitalWrite(ledPin, ledState); // переключаем состояние светодиода
    }
}

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Забыл начало кода скинуть.

const int soundPin = 3;  // переменная с номером пина пьезоэлемента
const int ledPin = 13;  // переменная с номером пина светодиода
const long ledInterval = 200; // интервал мигания светодиодом, мсек.

int ledState = LOW;  // начальное состояние светодиода
unsigned long previousMillis = 0;  // храним время предыдущего срабатывания светодиода

void setup() {
    pinMode(soundPin, OUTPUT); // задаём пин 3 как выход.
    pinMode(ledPin, OUTPUT);   // задаём пин 13 как выход.
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Берите датчик (почти параллельный)))))

bwn
Offline
Зарегистрирован: 25.08.2014

Cesium137 пишет:

Вроде код нашел в гугле параллельной работы  тонового динамика и светодиода.

В течении куска из tone и delay ничего мигать не будет.

Кто и как собрался там мигать с интервалом в 200мС непонятно.

В сущности можете заменить весь кусок мигания одной строкой:
digitalWrite(ledPin,!digitalRead(ledPin));

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Только что проверил код на ардуино. также в порядке очереди все идет. я так понял 200мс это настолько мало что происходит проверка незапущена ли ардуино с самого начала, если это премя равно или юольше то вторая операция запускается. а первая итак уже запущена.  

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

DS18B20 такой к счастью есть у меня. в герм корпусе)))

bwn
Offline
Зарегистрирован: 25.08.2014

Cesium137 пишет:

Только что проверил код на ардуино. также в порядке очереди все идет. я так понял 200мс это настолько мало что происходит проверка незапущена ли ардуино с самого начала, если это премя равно или юольше то вторая операция запускается. а первая итак уже запущена.  

Еще раз: пока не отработают строки с 03 по 10, ничего не мигнет, приведенный код исполняется последовательно и проверка интервала в 200мС бессмысленна. Измените на 5 секунд, смысл появится.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Я уже понял про это. А как можно реализовать одновременно два процесса? Не подскажите пожалуйста. Очень хочу понять как это работает и в чем смысл зкаключается. Через функцию millis() нужно выполнять или иначе?

bwn
Offline
Зарегистрирован: 25.08.2014

Двух одновременных процессов здесь нет и быть не может. Самое простое, как говорил выше: Каждый блок описываете в своей функции, на входе стоит условие проверки временного интервала или флага. Из основного цикла последовательно вызываются все функции. В зависимости от выполнения заданного условия идет либо тело функции, либо возврат в основной цикл. Функции должны быть достаточно быстрыми, без делеев и бесконечных циклов. Тогда создается впечатление параллельности процессов.
В сущности можно все это прописать и в loop, но код получается громоздкий и трудно читаемый-модифицируемый.
Гуру возможно подскажут что то более оптимальное, но я делаю так.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Спасибо за информацию. Попробую изменить код как вы выше сказали с 200мс на 5 сек как я понял смысл поменяется.. можете хорошую книгу посоветовать по программированию ардуино? Мне бы начальные азы усвоить как устроено все, а не урывками браться. У меня есть книга автор Джереми Блюм. Ролики его смотрел. Незнаю хорошая на ваш взгляд или не очень для начального освоения.

bwn
Offline
Зарегистрирован: 25.08.2014

Керниган с Ритчи. И начинать писать, понемногу и опыт наберется.
При написании для дома, для семьи, если программа работает как хотелось, она не может быть говонокодом. Верно и наоборот, если программа написана с соблюдением всех догм, ужасно оптимизированна, но не работает, это и есть говонокод. ИМХО.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Спасибо за книжку огромное.
Я ссылку нашел как делать псевдопараллельность через Thread . Буду пробывать. http://www.kakprosto.ru/kak-918733-kak-vypolnyat-parallelnye-zadachi-thr.... Это тот самый код который я присылал там где про 200мс))) но ниже уже описывали как через Thread реализовать задачу