#1 2018-03-13 19:30:15

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Для меня сложно, а для вас нет)

В общем не могу вместить в голове всё это... Только начал разбираться... Вот что нужно: При значении 500 с фоторезистора (Вечером)
включается подсветка на n-времени, после сама выключается. Скетч нужен с функцией milis а не delay. Нужно всё это для автодосвета растения. delay не подходит, потому что будет реализован ещё и автополив, так бы и сам написал).

Неактивний

#2 2018-03-13 19:50:33

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Re: Для меня сложно, а для вас нет)

Ну если не сложно

Неактивний

#3 2018-03-13 20:28:53

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Для меня сложно, а для вас нет)

а как вы автополив сделаете, если это осилить не можете.

Неактивний

#4 2018-03-13 20:35:27

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Для меня сложно, а для вас нет)

Если при составлении алгоритма вы оперируете понятиями ==  " ... после сама выключается. " то даже не знаю чем помочь...

Неактивний

#5 2018-03-14 00:00:16

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Re: Для меня сложно, а для вас нет)

vvr пише:

а как вы автополив сделаете, если это осилить не можете.

if (A1 < 500) {
  digitalWrite(13, 1);
}
if (A1 > 800) {
  digitalWrite(13, 0);
Вот автополив
А для автовыключение света, нужно сделать задержку, причем без влияния на работу остального кода

Остання редакція NEW_NOOB (2018-03-14 00:03:02)

Неактивний

#6 2018-03-14 10:36:12

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Для меня сложно, а для вас нет)

NEW_NOOB пише:
vvr пише:

а как вы автополив сделаете, если это осилить не можете.

if (A1 < 500) {
  digitalWrite(13, 1);
}
if (A1 > 800) {
  digitalWrite(13, 0);
Вот автополив
А для автовыключение света, нужно сделать задержку, причем без влияния на работу остального кода

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

Неактивний

#7 2018-03-14 13:56:44

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Re: Для меня сложно, а для вас нет)

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

Остання редакція NEW_NOOB (2018-03-14 13:57:00)

Неактивний

#8 2018-03-14 15:26:28

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: Для меня сложно, а для вас нет)

Вячеслав Азаров пише:

Справочник по ядру Ардуино, на русском, есть здесь: https://doc.arduino.ua/ru/prog/ . А по билиотекам гуглите и читайте исходники и документацию на https://www.arduino.cc/reference/en/.

Кроме того, стандартная библиотека avr-libc намного шире, чем то, что доступно из описаний Arduino. Но всё это доступно для использования в коде скетча.
Описание API avr-libc на русском языке (хоть и несколько горбатом) см. здесь.

Неактивний

#9 2018-03-14 15:51:55

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: Для меня сложно, а для вас нет)

Вячеслав Азаров пише:
Olej пише:

Описание API avr-libc на русском языке (хоть и несколько горбатом) см. здесь.

Ага. Пошлите, еще, новичка к Atmel Software Framework, он еще богаче чем avr-libc.

А чего же не послать? big_smile
В библиотеках есть множество достаточно элементарных вещей, которые:

1. Очень упрощают написание кода ... например вместо 20 штук последовательно друг за другом вызовов:

Serial.print(...);
// ... и ещё так же 25 раз ...
Serial.println(...);

Записать:

char msg[ 80 ];
sprintf( msg, "%s%d%x%x%x", "это будет ", n, " штук HEX чисел:", x1, x2, x3 );
println( msg );

(я бы мог это записать ещё проще, без промежуточного буфера msg, через printf() ... но это будет уже действительно посложнее).

2. Вот такие примеры, как выше - они очень соответствуют тому, что пишут во всех книгах и статьях по языку C. А отсутствие того, что написано во всех книжках, Arduino IDE - будет вызывать смущение в уме.
И это ещё важнее.

Неактивний

#10 2018-03-14 16:04:44

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: Для меня сложно, а для вас нет)

Olej пише:

2. Вот такие примеры, как выше - они очень соответствуют тому, что пишут во всех книгах и статьях по языку C.

А вот такая запись:

uint32_t x;

В ряде случаев, это будет куда содержательнее для читающего (да и пишущего тоже ... через 2 недели после написания), чем просто:

int x;

И поможет избежать очень досадных и тяжёлых ошибок ... типа таких:

if( x < 0 ) { ... };

Неактивний

#11 2018-03-14 16:27:44

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Re: Для меня сложно, а для вас нет)

После неоднократного вскипания, мой мозг додумался до этого.

const int ledPin = 13;  
long previousMillis = 0;
int Photorez = A6;
long interval = 1000*60*60*6; 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(button, INPUT); 
  int val = 1;                                                          //Если день, val=1. Если ночь, val=0. 
} 
void loop() {
 if (val==1 && analogRead(Photorez)==500) {        //Сработает вечером
  digitalWrite(ledPin, 1);                                         //Вкл свет
  unsigned long currentMillis = millis();
  if(millis() - previousMillis > interval) {                   //Подождать 6 часов
    previousMillis = currentMillis; 
     digitalWrite(ledPin, 0);                                      //Выкл свет
   }
  } else { digitalWrite(ledPin, 0);              
 }
 if (analogRead(Photorez)==200) {
  val = 0 }                                                            //Если темно, вкл режим "ночь"
 if (analogRead(Photorez)==800) {
  val = 1 }                                                            //Если светло, вкл режим "день"
 }

Неактивний

#12 2018-03-14 16:41:15

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Re: Для меня сложно, а для вас нет)

Вячеслав Азаров пише:
NEW_NOOB пише:

После неоднократного вскипания, мой мозг додумался до этого.

...
 if (val==1 && analogRead(Photorez)==500) {        //Сработает вечером
...
 if (analogRead(Photorez)==200) {
...                                                           //Если темно, вкл режим "ночь"
 if (analogRead(Photorez)==800) {
...                                                           //Если светло, вкл режим "день"
 }

Для начала неплохо. Только не используйте равенство при определении порога освещенности, такого в природе не бывает.

А как же тогда ?
Так?
if (800>analogRead(Photorez)>810)

Остання редакція NEW_NOOB (2018-03-14 16:44:04)

Неактивний

#13 2018-03-14 16:57:15

NEW_NOOB
Учасник
Зареєстрований: 2018-03-13
Повідомлень: 7

Re: Для меня сложно, а для вас нет)

Аа всё, врубился. Вместо == лучше поставить <,> или >=, <=

Неактивний

#14 2018-03-14 21:27:44

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Для меня сложно, а для вас нет)

правильно врубились)))

Неактивний

#15 2018-03-15 15:41:52

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Для меня сложно, а для вас нет)

NEW_NOOB пише:

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.

Неактивний

#16 2018-03-15 16:53:46

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: Для меня сложно, а для вас нет)

alex_dol пише:
NEW_NOOB пише:

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.

При этом ещё держать в уме, что примерно через 50 дней millis превратится в ноль через переполнение.
И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.

Неактивний

#17 2018-03-15 17:52:37

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Для меня сложно, а для вас нет)

А что здесь сложного?
if (millis() < save_millis) ...

Неактивний

#18 2018-03-15 19:39:16

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Для меня сложно, а для вас нет)

Olej пише:

И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.

Работать может сколько хош. СОБЫТИЕ не должно превышать 50 суток.

Неактивний

#19 2018-03-21 11:58:17

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Для меня сложно, а для вас нет)

NEW_NOOB пише:

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

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

А сбросить вот так:

1. На верхнем уровне описываете внешнюю переменную

extern volatile unsigned long timer0_millis;

Затем в любом месте, где Вам нужно, присваиваете ей любое значение. Вот с этого значения миллис и будет с этого момента считать (пока снова чего-то не присвоите). Например,

timer0_millis = 123ul;

Остання редакція Kaka (2018-03-21 11:59:19)

Неактивний

#20 2018-03-21 13:40:46

maxmix
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 10

Re: Для меня сложно, а для вас нет)

и тут великий страх перед переполнением... lol
на великах никто не ездит? только начали придумывать?
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
первый пост ну или так: если "по-домашнему"

uint16_t period = 2000; // заданый интервал 2сек.
void loop()
if ((currentMillis = millis()) - startTime > period)

{
  тута будет все делатса аш больше 50ти дней подряд! интервалом через 2 секунды
  startTime = millis(); //  сброс, чтоб отсчет пошел после выполнения последнего вкл лампы ато мало ли что, вдруг затяжное
   //действие
  }

Неактивний

#21 2018-03-21 14:31:58

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Для меня сложно, а для вас нет)

Ну это смотря от какого момента считать первый период. Если от включения, то cойдёт.

Неактивний

#22 2018-03-21 14:54:56

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: Для меня сложно, а для вас нет)

maxmix пише:

и тут великий страх перед переполнением... lol

Как-то объяснить нужно бы всем, в 1000001 раз снова и снова спрашивающих про переполнение, что:

- во всех случаях (95%), когда вас интересуют временные интервалы, нужно просто забыть про любые переполнения...

unsigned long prev, next;
...
if( ( next = millis() ) - prev ) > period ) {
   prev = next;
   ...
}

(не забыть, что ключевое здесь слово unsigned)

- и только когда вас каким-то образом вас интересуют значения временных меток millis() нужно вспомнить вот про те 50 суток... например, когда нужно время/дату uptime от времени включения;

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

Неактивний

#23 2018-03-21 15:03:56

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Для меня сложно, а для вас нет)

Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.

Неактивний

#24 2018-03-21 15:15:02

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: Для меня сложно, а для вас нет)

Kaka пише:

Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.

В принципе, да.
Но и эта потребность достаточно просто решается.

P.S. Но и такая потребность, как мне кажется, решается без учёта что там и как происходит с переполнением - инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит. big_smile

Неактивний

#25 2018-03-21 17:26:23

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Для меня сложно, а для вас нет)

Olej пише:

инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит. big_smile

А как же время? Длительность loop непредсказуема и ничем не определяется. Нет, ни фига - это не решение.

Неактивний

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

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

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