Ви не увійшли.
В общем не могу вместить в голове всё это... Только начал разбираться... Вот что нужно: При значении 500 с фоторезистора (Вечером)
включается подсветка на n-времени, после сама выключается. Скетч нужен с функцией milis а не delay. Нужно всё это для автодосвета растения. delay не подходит, потому что будет реализован ещё и автополив, так бы и сам написал).
Неактивний
а как вы автополив сделаете, если это осилить не можете.
if (A1 < 500) {
digitalWrite(13, 1);
}
if (A1 > 800) {
digitalWrite(13, 0);
Вот автополив
А для автовыключение света, нужно сделать задержку, причем без влияния на работу остального кода
Остання редакція NEW_NOOB (2018-03-14 00:03:02)
Неактивний
vvr пише:а как вы автополив сделаете, если это осилить не можете.
if (A1 < 500) {
digitalWrite(13, 1);
}
if (A1 > 800) {
digitalWrite(13, 0);
Вот автополив
А для автовыключение света, нужно сделать задержку, причем без влияния на работу остального кода
открываете среду разработки.
идёте в примеры.
там есть пример мигаем без задержек.
на его основе и пишите свой код.
Неактивний
Справочник по ядру Ардуино, на русском, есть здесь: https://doc.arduino.ua/ru/prog/ . А по билиотекам гуглите и читайте исходники и документацию на https://www.arduino.cc/reference/en/.
Кроме того, стандартная библиотека avr-libc намного шире, чем то, что доступно из описаний Arduino. Но всё это доступно для использования в коде скетча.
Описание API avr-libc на русском языке (хоть и несколько горбатом) см. здесь.
Неактивний
Olej пише:Описание API avr-libc на русском языке (хоть и несколько горбатом) см. здесь.
Ага. Пошлите, еще, новичка к Atmel Software Framework, он еще богаче чем avr-libc.
А чего же не послать?
В библиотеках есть множество достаточно элементарных вещей, которые:
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 - будет вызывать смущение в уме.
И это ещё важнее.
Неактивний
2. Вот такие примеры, как выше - они очень соответствуют тому, что пишут во всех книгах и статьях по языку C.
А вот такая запись:
uint32_t x;
В ряде случаев, это будет куда содержательнее для читающего (да и пишущего тоже ... через 2 недели после написания), чем просто:
int x;
И поможет избежать очень досадных и тяжёлых ошибок ... типа таких:
if( x < 0 ) { ... };
Неактивний
После неоднократного вскипания, мой мозг додумался до этого.
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 } //Если светло, вкл режим "день"
}
Неактивний
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)
Неактивний
А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.
Неактивний
NEW_NOOB пише:А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.
При этом ещё держать в уме, что примерно через 50 дней millis превратится в ноль через переполнение.
И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.
Неактивний
А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
Сбросить-то его элементарно, другое дело, что в природе не существует реальной необходимости делать это. Если Вам кажется, что Вам это нужно, значит Вы где-то ошиблись или чего-то не понимаете.
А сбросить вот так:
1. На верхнем уровне описываете внешнюю переменную
extern volatile unsigned long timer0_millis;
Затем в любом месте, где Вам нужно, присваиваете ей любое значение. Вот с этого значения миллис и будет с этого момента считать (пока снова чего-то не присвоите). Например,
timer0_millis = 123ul;
Остання редакція Kaka (2018-03-21 11:59:19)
Неактивний
и тут великий страх перед переполнением...
на великах никто не ездит? только начали придумывать?
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
первый пост ну или так: если "по-домашнему"
uint16_t period = 2000; // заданый интервал 2сек.
void loop()
if ((currentMillis = millis()) - startTime > period)
{
тута будет все делатса аш больше 50ти дней подряд! интервалом через 2 секунды
startTime = millis(); // сброс, чтоб отсчет пошел после выполнения последнего вкл лампы ато мало ли что, вдруг затяжное
//действие
}
Неактивний
и тут великий страх перед переполнением...
Как-то объяснить нужно бы всем, в 1000001 раз снова и снова спрашивающих про переполнение, что:
- во всех случаях (95%), когда вас интересуют временные интервалы, нужно просто забыть про любые переполнения...
unsigned long prev, next;
...
if( ( next = millis() ) - prev ) > period ) {
prev = next;
...
}
(не забыть, что ключевое здесь слово unsigned)
- и только когда вас каким-то образом вас интересуют значения временных меток millis() нужно вспомнить вот про те 50 суток... например, когда нужно время/дату uptime от времени включения;
- удивляет почему так много и часто уделяется преувеличенного внимания в обсуждениях этому переполнению ... кто никогда до того и не слышал про переполнения вообще.
Неактивний
Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.
В принципе, да.
Но и эта потребность достаточно просто решается.
P.S. Но и такая потребность, как мне кажется, решается без учёта что там и как происходит с переполнением - инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит.
Неактивний
инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит.
А как же время? Длительность loop непредсказуема и ничем не определяется. Нет, ни фига - это не решение.
Неактивний