Помощь со скетчем
- Войдите на сайт для отправки комментариев
Всем доброго времени суток.
Прошу сразу не гнать прочь и не кидаться камнями.
Появилась острая необходимость сделать автополив для моей Черимойи.
Помогите, пожалуйста подредактировать скетч. Понимаю что примеров систем автополива в интернете масса, но прошла неделя, эмоции на пределе, микросхемы ночью снятся. Не думал что для меня это будет так сложно.
Были куплены:
1. Arduino mega 2560 (как я понимаю китайский аналог). Как я уже понял для моей задачи подошло бы что-то попроще, но устройство уже у меня.
2. PWM&Servo shield. Думал с помощью нее смогу размножить контакты с основной платы, но опять же уже в процессе понял что для меня штука бесполезная.
3. Драйвер L298N для запуска 12V насоса перистальтического.
4. Два щупа для замера влажности почвы. Тоже уже понял что они жутко быстро окисляются, пока попробовал две никелированные скрепки попробовать, но думаю и их на долго не хватит. Думаю как можно сократить количество замеров до 2-х в день.
5. Экранчик OLED
6. Трехцветный светодиод. Больше для побаловаться, но и он может пригодиться.
7. Модуль WiFi. Думал в итоге приспособить для передачи данных о влажности по WIFI, но пока смутно представляю как это реализовать.
Задача, как вы понимаете проста, при достижении нижнего порога влажности включить на время насос, при этом отображать данные на OLED экранчик.
Помогите, пожалуйста подредактировать скетч.
какой скетч?
Вот, что у меня получилось:
int redLed=12; int greenLed=13; int blueLed=11; int enA = 10; int in1 = 7; int in2 = 6; int sensorValue1; int sensorValue2; int waterMax=450; int waterMin=950; #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; void setup() { Serial.begin(9600); pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(blueLed, OUTPUT); pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); myOLED.begin(); } void loop() { // read the input on analog pin 0: sensorValue1 = analogRead(A0); sensorValue2 = analogRead(A1); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("XTHBVJQZ", CENTER, 0 ); // Выводим надпись "ЧЕРИМОЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensorValue1), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее delay(1000); // Пауза 1 секунда myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("GFGFQZ", CENTER, 0 ); // Выводим надпись "ПАПАЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensorValue2), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее delay(1000); // Пауза 1 секунда Serial.println(sensorValue1); if (sensorValue1>waterMin) { digitalWrite(redLed, HIGH); digitalWrite(greenLed, LOW); digitalWrite(blueLed, LOW); //полив digitalWrite(in1, HIGH); digitalWrite(in2, LOW); delay(10*1000); //льем 10 секунд digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(30*1000); //ждем 10 секунд analogWrite(enA, 1000); } else if (sensorValue1<waterMax) { digitalWrite(redLed, LOW); digitalWrite(greenLed, HIGH); digitalWrite(blueLed, LOW); digitalWrite(in1, LOW); digitalWrite(in2, LOW); } Serial.println(sensorValue2); if (sensorValue2>waterMin) { digitalWrite(redLed, HIGH); digitalWrite(greenLed, LOW); digitalWrite(blueLed, LOW); //полив //digitalWrite(in1, HIGH); //digitalWrite(in2, LOW); //delay(10*1000); //льем 10 секунд //digitalWrite(in1, LOW); //digitalWrite(in2, LOW); //delay(30*1000); //ждем 10 секунд //analogWrite(enA, 1000); } else if (sensorValue2<waterMax) { digitalWrite(redLed, LOW); digitalWrite(greenLed, LOW); digitalWrite(blueLed, HIGH); digitalWrite(in1, LOW); digitalWrite(in2, LOW); } delay(100); }Прошу прощения за медлительность, разбирался как вставить его правильно на форум.
Этот скетч как Франкенштейн - сборная солянка с кучи форумов и сайтов.
Задача, как вы понимаете проста, при достижении нижнего порога влажности включить на время насос, при этом отображать данные на OLED экранчик.
ну, и в чём проблема?
if (нижний порог влажности) {if (!время работы насоса) {включить насос; печать на эеран;}}
Задача, как вы понимаете проста, при достижении нижнего порога влажности включить на время насос, при этом отображать данные на OLED экранчик.
ну, и в чём проблема?
if (нижний порог влажности) {if (!время работы насоса) {включить насос; печать на эеран;}}
Проблема: данные на экран выводятся только когда датчики показывают "НОРМУ". Может быть это изза Delay который насос тормозит..
ТАкже если один датчик в воде а второй на суше, с того который в воде показываются какие то усредненные данные с тем что в воде..
а, зачем ты что-то печатаешь в лупе, а не по событиям.
нафиг, вообще, тебе делей нужен?
а, зачем ты что-то печатаешь в лупе, а не по событиям.
нафиг, вообще, тебе делей нужен?
А по событиям это как? :|
Имеете ввиду, как Вы выше написали, заменить Delay на "if (нижний порог влажности) {if (!время работы насоса) {включить насос; печать на экран;}}"?
а, зачем ты что-то печатаешь в лупе, а не по событиям.
нафиг, вообще, тебе делей нужен?
А по событиям это как? :|
Имеете ввиду, как Вы выше написали, заменить Delay на "if (нижний порог влажности) {if (!время работы насоса) {включить насос; печать на экран;}}"?
события у тебя
if(sensorValue*по ним и печатай
if(sensorValue*) {myOLED.print();}*менять делай ни на что не нужно - забудь, что он, вообще, существует.
ты же дёргаешь пинами digitalWrite(* по событиям? - там же и печатай.
а, зачем ты что-то печатаешь в лупе, а не по событиям.
нафиг, вообще, тебе делей нужен?
А по событиям это как? :|
Имеете ввиду, как Вы выше написали, заменить Delay на "if (нижний порог влажности) {if (!время работы насоса) {включить насос; печать на экран;}}"?
события у тебя
if(sensorValue*по ним и печатай
if(sensorValue*) {myOLED.print();}*менять делай ни на что не нужно - забудь, что он, вообще, существует.
ты же дёргаешь пинами digitalWrite(* по событиям? - там же и печатай.
Может если знать хотя бы азы программирования, это все звучит просто, а я вот 95% в этом них не понимаю. Могу только на примере чего-то разобраться.
Уважаемый, Клапауций, не сочтите за труд, хоть один блочок для примера напечатайте, а я по аналогии все и поправлю.
И я может что-то пойму и Вам плюсик в карму =)
Уважаемый, Клапауций, не сочтите за труд, хоть один блочок для примера напечатайте, а я по аналогии все и поправлю.
я тебе дал пример кода
if(sensorValue*) {myOLED.print();}что здесь непонятного?
ок. словами перескажу, что в этой строчке происходит: если значение сенсора чему-то соответствует, то нужно напечатать на экране это что-то и, возможно, сделать что-то ещё.
Может если знать хотя бы азы программирования, это все звучит просто, а я вот 95% в этом них не понимаю.
Ну так изучайте, чтобы понимать.
http://arduino.ru/Reference
http://wiki.amperka.ru/видеоуроки:джереми-блюм
https://drive.google.com/file/d/0B9r7cRXQ4DU4XzVLeUVkNHdiaVU/
http://www.programming1189.ru/files/Kern_Ritch.pdf
http://www.programming1189.ru/files/Kern_Ritch.pdf
Жека, а есть что-то более вменяемое?
меня выбешивает и мешает переключиться на поглощение знаний с желания надавать тупой блондинке этой книгой по голове:
1.1. Начнем, пожалуй Единственный способ выучить новый язык программирования — это писать на нем программы.
ять!
Вот код. Но я не проверял. Я просто переработал ваш.
const int waterMin = 500;// величина по которой надо поливать //#1 const int sensor1_pin = A0; // нога датчика 1 int sensor1_Value; // величина на датчике 1 const int pump1_pin = 7; // насос 1 вкл 1/ нет 0 const int Led1_pin = 13; // индикатор работы насоса 1 вкл 1/ нет 0 uint8_t Led1; const int time1_1 = 10 * 1000; // время полива const int time2_1 = 30 * 1000; // время паузы между полививом static uint32_t past1 ; //#2 const int sensor2_pin = A1; // нога датчика 2 int sensor2_Value; // величина на датчике 2 const int pump2_pin = 6; // насос 2 вкл 1/ нет 0 const int Led2_pin = 11; // индикатор работы насоса 2 вкл 1/ нет 0 uint8_t Led2; const int time1_2 = 10 * 1000; // время полива const int time2_2 = 30 * 1000; // время паузы между полививом static uint32_t past2 ; //#3 #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; void setup() { Serial.begin(9600); //#1 pinMode(pump1_pin, OUTPUT); pinMode(Led1_pin, OUTPUT); digitalWrite(pump1_pin, Led1=0); digitalWrite(Led1_pin, Led1); past1 = millis(); sensor1_Value = analogRead(sensor1_pin); //#2 pinMode(pump2_pin, OUTPUT); pinMode(Led2_pin, OUTPUT); digitalWrite(pump2_pin, Led2=0); digitalWrite(Led2_pin, Led2); sensor2_Value = analogRead(sensor2_pin); past2 = millis(); //#3 myOLED.begin(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 if (Led1 && millis() >= past1 + time1_1) { digitalWrite(pump1_pin, Led1 = 0); digitalWrite(Led1_pin, Led1); } static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + time1_1 + time2_1 ; sensor1_Value = analogRead(sensor1_pin); if (sensor1_Value < waterMin) { digitalWrite(pump1_pin, Led1 = 1); digitalWrite(Led1_pin, Led1); past1 = millis(); } MILLIS = millis() ; } //#2 if (Led2 && millis() >= past2 + time2_2) { digitalWrite(pump2_pin, Led2 = 0); digitalWrite(Led2_pin, Led2); } static uint32_t future2 = 0 ; if (MILLIS >= future2) { future2 = MILLIS + time1_2 + time2_2 ; sensor2_Value = analogRead(sensor2_pin); if (sensor2_Value < waterMin) { digitalWrite(pump2_pin, Led2 = 1); digitalWrite(Led2_pin, Led2); past2 = millis(); } MILLIS = millis() ; } //#3 static uint8_t PC_3 = 1 ; static uint32_t future3 = 0 ; if (MILLIS >= future3) { future3 = MILLIS + 1000 ; switch (PC3) { case 1: PC_3 = 2; future1 = MILLIS + 1000 ; myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("XTHBVJQZ", CENTER, 0 ); // Выводим надпись "ЧЕРИМОЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor1_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; case 2: PC_3 = 1; myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("GFGFQZ", CENTER, 0 ); // Выводим надпись "ПАПАЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor2_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; } MILLIS = millis() ; } }Жека, а есть что-то более вменяемое?
Для новичков - первые три ссылки. Потом можно и к Кернигану&Ритчи приступать. Хотя, например, ЕвгенийП советует наоборот - начинать с этой книги.
Жека, а есть что-то более вменяемое?
Для новичков - первые три ссылки.
я не просил для новичков.
Эээ, ну тогда не знаю. Керниган&Ритчи - это же библия у программистов :-)
Вот код. Но я не проверял. Я просто переработал ваш.
Спасибо Вам, попробую разобраться.
Эээ, ну тогда не знаю. Керниган&Ритчи - это же библия у программистов :-)
ты лично читал? - это может и библия, но для слабоумных.
или, возможно, для детей - что есть существенная разница.
Уважаемый Jeka_M
На сегодняшний день я не готов настолько глубоко погружаться в изучение программирования для создания системы автополива, у меня просто нет на это времени.
Но за направление на путь истинный и рекомендации спасибо =)
Может я слабо понимаю всю сложность данного вопроса и в данном случае проще заплатить какую-то сумму для того, чтобы мне написали рабочую программу?
Посоветуйте.
Может я слабо понимаю всю сложность данного вопроса и в данном случае проще заплатить какую-то сумму для того, чтобы мне написали рабочую программу?
Посоветуйте.
процесс не прост, но вам будет мучительно больно платить за свою ленью
AlexTS Даже вопрос не в лени. В любой программе есть ошибки, даже банальные описки. Но из-за них даже рабочая программы станет не рабочей. Вот по этому и учат программирование. Не для написания программ, а для выявление ошибок в них, а потом их устранения. Что и занимает большую часть рабочего времени программиста.
Клапауций 232
Согласен, полностью.
Я же повторюсь, мне сложно оценить всю сложность процесса для опытного человека.
И если это, как вы выразились не просто. Здесь уже все будет зависеть от суммы.
qwone
Все верно, чтобы найти ошибки, нужно быть программистом. А если я инженер в далекой от программирования области, и свободного времени очень не много, а девайс необходим, приходится из чего-то выбирать и рассматривать разные варианты.
И если это, как вы выразились не просто. Здесь уже все будет зависеть от суммы.
дело в том, что сумма будет не адекватна сложности.
*тем более, тебе уже что-то написали бесплатно.
Клапауций 232
Именно после того, что мне написал qwone, я и задумался о таком варианте =)
Там просто все по-другому!
Рабочая программа это программа которая загружена в изделие работает. Вот только если у программиста нет этого изделия, то определить почему программа не работает сложно. А мой стиль еще и не привычен многим. Так что вылавливать в моем коде ошибки даже мне сложно. Так что скину последний вариант моего кода с комментариями, для отладки.
const int waterMin = 500;// величина по которой надо поливать //#1 const int sensor1_pin = A0; // нога датчика 1 uint16_t sensor1_Value; // величина на датчике 1 const int pump1_pin = 7; // насос 1 вкл 1/ нет 0 const int Led1_pin = 13; // индикатор работы насоса 1 вкл 1/ нет 0 uint8_t Led1; const int time1_1 = 10 * 1000; // время полива const int time2_1 = 30 * 1000; // время паузы между полививом uint32_t past1 ;// время отключения насоса 1 (past1+time1_1) //#2 const int sensor2_pin = A1; // нога датчика 2 uint16_t sensor2_Value; // величина на датчике 2 const int pump2_pin = 6; // насос 2 вкл 1/ нет 0 const int Led2_pin = 11; // индикатор работы насоса 2 вкл 1/ нет 0 uint8_t Led2; const uint32_t time1_2 = 10 * 1000; // время полива const uint32_t time2_2 = 30 * 1000; // время паузы между полививом uint32_t past2 ; //#3 #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; void setup() { Serial.begin(9600); //#1 pinMode(pump1_pin, OUTPUT); pinMode(Led1_pin, OUTPUT); digitalWrite(pump1_pin, Led1=0); digitalWrite(Led1_pin, Led1); past1 = millis(); sensor1_Value = analogRead(sensor1_pin); //#2 pinMode(pump2_pin, OUTPUT); pinMode(Led2_pin, OUTPUT); digitalWrite(pump2_pin, Led2=0); digitalWrite(Led2_pin, Led2); sensor2_Value = analogRead(sensor2_pin); past2 = millis(); //#3 myOLED.begin(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 опрос и отработка 1 датчика if (Led1 && millis() >= past1 + time1_1) { // когда наступит время digitalWrite(pump1_pin, Led1 = 0); // отключить насос 1 и погасить светодиод digitalWrite(Led1_pin, Led1); } static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + time1_1 + time2_1 ; sensor1_Value = analogRead(sensor1_pin); Serial.print("sensor1:"); Serial.println(sensor1_Value); if (sensor1_Value < waterMin) { // если земля сухая digitalWrite(pump1_pin, Led1 = 1); // включить насос 1 и зажечь светодиод digitalWrite(Led1_pin, Led1); past1 = millis(); // и выставить время отключения насоса 1 (past1 + time1_1) } MILLIS = millis() ; } //#2 опрос и отработка 2 датчика if (Led2 && millis() >= past2 + time2_2) { digitalWrite(pump2_pin, Led2 = 0); digitalWrite(Led2_pin, Led2); } static uint32_t future2 = 0 ; if (MILLIS >= future2) { future2 = MILLIS + time1_2 + time2_2 ; sensor2_Value = analogRead(sensor2_pin); Serial.print("sensor2:"); Serial.println(sensor2_Value); if (sensor2_Value < waterMin) { digitalWrite(pump2_pin, Led2 = 1); digitalWrite(Led2_pin, Led2); past2 = millis(); } MILLIS = millis() ; } //#3 вывод показаний на экран static uint8_t PC_3 = 1 ; static uint32_t future3 = 0 ; if (MILLIS >= future3) { future3 = MILLIS + 1000 ; // обновления идут раз в секунду switch (PC_3) { case 1: PC_3 = 2; // этот раз идет "ЧЕРИМОЙЯ" future1 = MILLIS + 1000 ; myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("XTHBVJQZ", CENTER, 0 ); // Выводим надпись "ЧЕРИМОЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor1_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; case 2: PC_3 = 1; // а в этот раз идет "ПАПАЙЯ" myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("GFGFQZ", CENTER, 0 ); // Выводим надпись "ПАПАЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor2_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; } } }ПС: Извините, если кому-то помешал заработать.
qwone
Огромное спасибо!
буду разбираться.
Всем добрый вечер.
Еще раз спасибо qwone. Хоть для меня ничего и не понятно в Вашем коде, но я умудрился найти пару неточностей, из-за которых не хотело ничего запускаться.
Теперь вопрос: Из-за чего могут усредняться значения при разных показаниях на датчиках? ТОесть изначально два датчика показывают допустим, 1020. Опускаю один в воду и он начинает показывать допустим 300, а второй при этом сухой и показывает 600. Как думаете, в чем проблема?
скорее всего проблема в самом датчике. Попробуйте заменить его двумя грифилями от простых карандашей. Или графитовым стержнем от пальчиковой батарейки.
http://www.youtube.com/watch?v=eKz8a6yCfaU
скорее всего проблема в самом датчике. Попробуйте заменить его двумя грифилями от простых карандашей. Или графитовым стержнем от пальчиковой батарейки.
http://www.youtube.com/watch?v=eKz8a6yCfaU
Любопытный вариант, благодарю! нужно попробовать.
Но я все-таки не думаю что проблема с датчиками, потому что по одиночке они прекрасно работают..
Еще небольшой вопрос, возможно ли програмно реализовать подачу питания на датчик 2 раза в день, или нужно реле?
Можно. Но программа немного усложнится.
Хочу максимально уйти от электролиза датчиков, хотя если применить графитовые стержни из приведенного Вами видео, этой проблемы быть не должно, но и энергопотребление должно снизиться, да и нет надобности снимать показания раз в секунду.
Просто питание датчик берет с Пинов платы, а оно, как я понимаю, на этих пинах постоянное, поэтому програмно можно задать именно высвечивание данных, а ток через щуп будет в любом случае идти постоянно.
Или я ошибаюсь?
ну да. Включить датчик через пин, пауза, замер,полив если надо ,выключить датчик и пауза на пол дня. Датчики можно включать в разное время.
пс:http://masterkit.ru/shop/smarthome/sensors/1333987
http://gruntoff.ru/publ/kontrol/7-1-0-104
http://meandr.org/archives/25973
Добрый день. Есть три геркона и необходимо только при замыкании всех 3х подать сигнал на светодиод. Помогите со скетчем. Весь можно не писать. Я так понимаю там всего пару строк в loop нужно добавить о которых я не вкурсе.
Despot , так?
/* геркон 1 -> pin 2 (gerc1_pin) gnd-> gnd геркон 2b-> pin 3 (gerc2_pin) gnd-> gnd геркон 3 -> pin 4 (gerc3_pin) gnd-> gnd светодиод -> pin 5 (led_pin) 1 горит / 0 нет gnd-> gnd */ //#1 const int gerc1_pin= 2; const int gerc2_pin= 3; const int gerc3_pin= 4; uint8_t a;// состояние герконов const int led_pin= 5; void setup() { //#1 pinMode(gerc1_pin, INPUT_PULLUP); pinMode(gerc2_pin, INPUT_PULLUP); pinMode(gerc3_pin, INPUT_PULLUP); pinMode(led_pin, OUTPUT); digitalWrite(led_pin, 0); } void loop() { //#1 a= digitalRead(gerc1_pin)||digitalRead(gerc2_pin)||digitalRead(gerc3_pin); digitalWrite(led_pin, !a); }Спасибо большое.
Добрый вечер всем.
Уважаемый qwone, можно ли получить ваш e-mail? хотел быть задать частный вопрос.
---
Всем доброго вечера!
на сегодняшний день собрал всю схему, почти все работает. Чтобы уйти от окисления электродов, Анод (оооочень быстро окислялся, буквально на глазах) решено было сделать из двух сединенных между собой графитовых стержней из пальчиковых батареек, катод решено оставить просто из выпрямленной толстой скрепки.
Чтобы уменьшить токопотребление, хочу попробовать питание подавать с цифрового пина Ардуины с определлной задержкой.
Прошу помощи в добавлении нужной строчки в код, а то я чего-то совсем запутался:
const int waterMin = 950;// величина по которой надо поливать //#1 const int sensor1_pin = A0; // нога датчика 1 uint16_t sensor1_Value; // величина на датчике 1 const int pump1_pin = 7; // насос 1 вкл 1/ нет 0 const int Led1_pin = 13; // индикатор работы насоса 1 вкл 1/ нет 0 uint8_t Led1; const int time1_1 = 10 * 1000; // время полива const int time2_1 = 30 * 1000; // время паузы между полививом uint32_t past1 ;// время отключения насоса 1 (past1+time1_1) //#2 const int sensor2_pin = A1; // нога датчика 2 uint16_t sensor2_Value; // величина на датчике 2 const int pump2_pin = 4; // насос 2 вкл 1/ нет 0 const int Led2_pin = 11; // индикатор работы насоса 2 вкл 1/ нет 0 uint8_t Led2; const uint32_t time1_2 = 10 * 1000; // время полива const uint32_t time2_2 = 30 * 1000; // время паузы между полививом uint32_t past2 ; //#3 #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; //#4 //const int time3_1 = 30 * 1000; // время паузы между измерениями //const int Sensor11_pin = 4; // индикатор работы сенсора 1 вкл 1/ нет 0 //uint32_t past3 ;// время отключения сенсора 1 (past3+time3_1) void setup() { Serial.begin(9600); //#1 pinMode(pump1_pin, OUTPUT); pinMode(Led1_pin, OUTPUT); digitalWrite(pump1_pin, Led1=0); digitalWrite(Led1_pin, Led1); past1 = millis(); sensor1_Value = analogRead(sensor1_pin); //#2 pinMode(pump2_pin, OUTPUT); pinMode(Led2_pin, OUTPUT); digitalWrite(pump2_pin, Led2=0); digitalWrite(Led2_pin, Led2); past2 = millis(); sensor2_Value = analogRead(sensor2_pin); //#3 //pinMode(Sensor11_pin, OUTPUT); //digitalWrite(Sensor11_pin=0); //#4 myOLED.begin(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 опрос и отработка 1 датчика if (Led1 && millis() >= past1 + time1_1) { // когда наступит время digitalWrite(pump1_pin, Led1 = 0); // отключить насос 1 и погасить светодиод digitalWrite(Led1_pin, Led1); } static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + time1_1 + time2_1 ; sensor1_Value = analogRead(sensor1_pin); Serial.print("sensor1:"); Serial.println(sensor1_Value); if (sensor1_Value > waterMin) { // если земля сухая digitalWrite(pump1_pin, Led1 = 1); // включить насос 1 и зажечь светодиод digitalWrite(Led1_pin, Led1); past1 = millis(); // и выставить время отключения насоса 1 (past1 + time1_1) } MILLIS = millis() ; } //#2 опрос и отработка 2 датчика if (Led2 && millis() >= past2 + time2_2) { digitalWrite(pump2_pin, Led2 = 0); digitalWrite(Led2_pin, Led2); } static uint32_t future2 = 0 ; if (MILLIS >= future2) { future2 = MILLIS + time1_2 + time2_2 ; sensor2_Value = analogRead(sensor2_pin); Serial.print("sensor2:"); Serial.println(sensor2_Value); if (sensor2_Value > waterMin) { digitalWrite(pump2_pin, Led2 = 1); digitalWrite(Led2_pin, Led2); past2 = millis(); } MILLIS = millis() ; } //#3 //if (millis() >= past3 + time3_1) { // когда наступит время // digitalWrite(Sensor11_pin = 0); // отключить датчик 1 // } //static uint32_t future4 = 0 ; //if (MILLIS >= future4) { // future4 = MILLIS + time3_1; // digitalWrite(Sensor11_pin = 1); // включить сенсор 1 // past3 = millis(); // и выставить время отключения сенсора 1 (past3 + time3_1) // } // MILLIS = millis() ; } //#4 вывод показаний на экран static uint8_t PC_3 = 1 ; static uint32_t future3 = 0 ; if (MILLIS >= future3) { future3 = MILLIS + 1000 ; // обновления идут раз в секунду switch (PC_3) { case 1: PC_3 = 2; // этот раз идет "ЧЕРИМОЙЯ" future1 = MILLIS + 1000 ; myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("XTHBVJQZ", CENTER, 0 ); // Выводим надпись "ЧЕРИМОЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor1_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; case 2: PC_3 = 1; // а в этот раз идет "ПАПАЙЯ" future2 = MILLIS + 1000 ; myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("GFGFQZ", CENTER, 0 ); // Выводим надпись "ПАПАЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor2_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; } } //#4 }Также никак не могу найти причину отображения усредненных значений двух датчиков..если у кого-то появится предположение, прошу откликнуться!
Переработал код
/* #1 датчик вход -> A0 (sensor1_pin) 0..1023 вкл -> 2 (sensor1_on_pin) 1 вкл/ 0 откл насос полива -> 7 (pump1_pin) вкл 1/ нет 0 GND -> GND светодиод -> 13 (Led1_pin) вкл 1/ нет 0 GND -> GND #2 #1 датчик вход -> A1 (sensor2_pin) 0..1023 вкл -> 3 (sensor2_on_pin) 1 вкл/ 0 откл насос полива -> 4 (pump2_pin) вкл 1/ нет 0 GND -> GND светодиод -> 11 (Led2_pin) вкл 1/ нет 0 GND -> GND #3 индикатор OLED GND -> GND +5V -> +5V SDA -> A4(SDA) SCL -> A5(SCL) */ const int waterMin = 950;// величина по которой надо поливать //#1 const int sensor1_pin = A0; // нога датчика 1 uint16_t sensor1_Value; // величина на датчике 1 const int sensor1_on_pin = 2; // нога вкл датчика 1 uint8_t sensor1_on; const int pump1_pin = 7; // насос 1 вкл 1/ нет 0 const int Led1_pin = 13; // индикатор работы насоса 1 вкл 1/ нет 0 uint8_t Led1; const uint32_t time0_1 = 10 * 1000; // время смещения вкл датчика от подачи питания 10 сек const uint32_t time1_1 = 10 * 1000; // время полива 10 сек const uint32_t time2_1 = 60 * 60 * 1000; // время паузы между полививом 1час=60 минут=60*60 сек const uint32_t time3_1 = 1 * 1000; // время между вкл датчика и измерением 1 сек uint32_t past1 ;// время отключения насоса 1 (past1+time1_1) //#2 const int sensor2_pin = A1; // нога датчика 2 uint16_t sensor2_Value; // величина на датчике 2 const int sensor2_on_pin = 3; // нога вкл датчика 1 uint8_t sensor2_on; const int pump2_pin = 4; // насос 2 вкл 1/ нет 0 const int Led2_pin = 11; // индикатор работы насоса 2 вкл 1/ нет 0 uint8_t Led2; const uint32_t time0_2 = 120 * 1000; // время смещения вкл датчика от подачи питания 120 сек const uint32_t time1_2 = 10 * 1000; // время полива 10 сек const uint32_t time2_2 = 60 * 60 * 1000; // время паузы между полививом 1час=60 минут=60*60 сек const uint32_t time3_2 = 1 * 1000; // время между вкл датчика и измерением 1 сек uint32_t past2 ;// время отключения насоса 2 //#3 #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; void setup() { //#1 pinMode(sensor1_on_pin, OUTPUT); // инициализировать датчик digitalWrite(sensor1_on_pin, sensor1_on = 0); // отключить питание датчика pinMode(pump1_pin, OUTPUT); pinMode(Led1_pin, OUTPUT); digitalWrite(pump1_pin, Led1 = 0); digitalWrite(Led1_pin, Led1); past1 = millis(); sensor1_Value = 0; //#2 pinMode(sensor2_on_pin, OUTPUT); // инициализировать датчик digitalWrite(sensor2_on_pin, sensor2_on = 0); // отключить питание датчика pinMode(pump2_pin, OUTPUT); pinMode(Led2_pin, OUTPUT); digitalWrite(pump2_pin, Led2 = 0); digitalWrite(Led2_pin, Led2); past2 = millis(); sensor2_Value = 0; //#3 myOLED.begin(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 опрос и отработка 1 датчика if (Led1 && MILLIS >= past1 + time1_1) { // когда наступит время digitalWrite(pump1_pin, Led1 = 0); // отключить насос 1 и погасить светодиод digitalWrite(Led1_pin, Led1); } if (sensor1_on && MILLIS >= past1 + time3_1) { // когда наступит время sensor1_Value = analogRead(sensor1_pin); // произвести измерение digitalWrite(sensor1_on_pin, sensor1_on = 0); // отключить питание датчика if (sensor1_Value > waterMin) { // если земля сухая digitalWrite(pump1_pin, Led1 = 1); // включить насос 1 и зажечь светодиод digitalWrite(Led1_pin, Led1); past1 = MILLIS; // и выставить время отключения насоса 1 (past1 + time1_1) } static uint32_t future1 = time0_1 ; if (MILLIS >= future1) { future1 = MILLIS + time1_1 + time2_1 + time3_1 ; digitalWrite(sensor1_on_pin, sensor1_on = 1); // включить питание датчика past1 = MILLIS; // и выставить время замера на датчике } MILLIS = millis() ; } //#2 опрос и отработка 2 датчика if (Led2 && MILLIS >= past2 + time1_2) { digitalWrite(pump2_pin, Led2 = 0); digitalWrite(Led2_pin, Led2); } if (sensor2_on && MILLIS >= past2 + time3_2) { // когда наступит время sensor2_Value = analogRead(sensor2_pin); // произвести измерение digitalWrite(sensor2_on_pin, sensor2_on = 0); // отключить питание датчика if (sensor2_Value > waterMin) { // если земля сухая digitalWrite(pump2_pin, Led2 = 1); // включить насос 2 и зажечь светодиод digitalWrite(Led2_pin, Led2); past2 = MILLIS; // и выставить время отключения насоса 2 (past2 + time1_2) } static uint32_t future2 = time0_2 ; if (MILLIS >= future2) { future2 = MILLIS + time1_2 + time2_2 + time3_2 ; digitalWrite(sensor2_on_pin, sensor2_on = 1); // включить питание датчика past2 = MILLIS; // и выставить время замера на датчике } MILLIS = millis() ; } //#3 вывод показаний на экран static uint8_t PC_3 = 1 ; static uint32_t future3 = 0 ; if (MILLIS >= future3) { future3 = MILLIS + 1000 ; // обновления идут раз в секунду switch (PC_3) { case 1: PC_3 = 2; // этот раз идет "ЧЕРИМОЙЯ" myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("XTHBVJQZ", CENTER, 0 ); // Выводим надпись "ЧЕРИМОЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor1_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; case 2: PC_3 = 1; // а в этот раз идет "ПАПАЙЯ" myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("GFGFQZ", CENTER, 0 ); // Выводим надпись "ПАПАЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor2_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; } } }ПС: Я совместил измерение почвы и полив. Хотя лучше их разнести в разные потоки.
Переработал код
ПС: Я совместил измерение почвы и полив. Хотя лучше их разнести в разные потоки.Огромное спасибо, за помощь и отзывчивость! буду тестить =)
Уважаемый, qwone.
Подскажите, пожалуйста, что такое "время смещения вкл датчика от подачи питания" ?
Что это за смещение? не могу понять...
А также, правильно ли я понимаю, что для того, чтобы изменять время проведения измерений, я должен трогать вот эту строчку: "
constuint32_t time2_2 = 60 * 60 * 1000;// время паузы между полививом?Вот последний код
/* #1 датчик вход -> A0 (sensor1_pin) 0..1023 вкл -> 2 (sensor1_on_pin) 1 вкл/ 0 откл #2 насос полива -> 7 (pump1_pin) вкл 1/ нет 0 GND -> GND светодиод -> 13 (Led1_pin) вкл 1/ нет 0 GND -> GND #3 датчик вход -> A1 (sensor2_pin) 0..1023 вкл -> 3 (sensor2_on_pin) 1 вкл/ 0 откл #4 насос полива -> 4 (pump2_pin) вкл 1/ нет 0 GND -> GND светодиод -> 11 (Led2_pin) вкл 1/ нет 0 GND -> GND #5 индикатор OLED GND -> GND +5V -> +5V SDA -> A4(SDA) SCL -> A5(SCL) */ const int waterMin = 950;// величина по которой надо поливать //#1 датчик 1 замер раз в 1 час const int sensor1_pin = A0; // нога датчика 1 uint16_t sensor1_Value = 0; // величина на датчике 1 const int sensor1_on_pin = 2; // нога вкл датчика 1 uint8_t sensor1_on; const uint32_t time1_1 = 60 * 60 * 1000; // время между двумя замерами 1 час=60мин=60*60сек const uint32_t time2_1 = 1 * 1000; // время между вкл датчика и измерением 1 сек //#2 мотор 1 полив 2 раза в сутки const int pump1_pin = 7; // насос 1 вкл 1/ нет 0 const int Led1_pin = 13; // индикатор работы насоса 1 вкл 1/ нет 0 uint8_t Led1; const uint32_t time0_2 = 10 * 1000; // время смещения вкл полива от подачи питания 10 сек const uint32_t time1_2 = 60 * 60 * 1000; // время паузы между полививом 1час=60 минут=60*60 сек const uint32_t time2_2 = 10 * 1000; // время полива 10 сек //#3 датчик 2 замер раз в 1 час const int sensor2_pin = A1; // нога датчика 2 uint16_t sensor2_Value = 0; // величина на датчике 2 const int sensor2_on_pin = 3; // нога вкл датчика 1 uint8_t sensor2_on; const uint32_t time1_3 = 60 * 60 * 1000; // время между двумя замерами 1 час=60мин=60*60сек const uint32_t time2_3 = 1 * 1000; // время между вкл датчика и измерением 1 сек //#4 мотор 2 полив 2 раза в сутки const int pump2_pin = 4; // насос 2 вкл 1/ нет 0 const int Led2_pin = 11; // индикатор работы насоса 2 вкл 1/ нет 0 uint8_t Led2; const uint32_t time0_4 = 120 * 1000; // время смещения вкл полива от подачи питания 120 сек const uint32_t time1_4 = 60 * 60 * 1000; // время паузы между полививом 1час=60 минут=60*60 сек const uint32_t time2_4 = 10 * 1000; // время полива 10 сек //#5 дисплей #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; void setup() { //#1 датчик 1 замер раз в 1 час pinMode(sensor1_on_pin, OUTPUT); // инициализировать датчик digitalWrite(sensor1_on_pin, sensor1_on = 0); // отключить питание датчика //#2 мотор 1 полив 2 раза в сутки pinMode(pump1_pin, OUTPUT); pinMode(Led1_pin, OUTPUT); digitalWrite(pump1_pin, Led1 = 0); digitalWrite(Led1_pin, Led1); //#3 датчик 2 замер раз в 1 час pinMode(sensor2_on_pin, OUTPUT); // инициализировать датчик digitalWrite(sensor2_on_pin, sensor2_on = 0); // отключить питание датчика //#4 мотор 2 полив 2 раза в сутки pinMode(pump2_pin, OUTPUT); pinMode(Led2_pin, OUTPUT); digitalWrite(pump2_pin, Led2 = 0); digitalWrite(Led2_pin, Led2); //#5 myOLED.begin(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 датчик 1 замер раз в 1 час static uint32_t fut1 = 0 ; if (sensor1_on && MILLIS >= fut1) { // когда наступит время sensor1_Value = analogRead(sensor1_pin); // произвести измерение digitalWrite(sensor1_on_pin, sensor1_on = 0); // отключить питание датчика } static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + time1_1 ; digitalWrite(sensor1_on_pin, sensor1_on = 1); // включить питание датчика fut1 = MILLIS + time2_1; // и выставить время замера на датчике MILLIS = millis() ; } //#2 мотор 1 полив 2 раза в сутки static uint32_t fut2 = 0 ; if (Led1 && MILLIS >= fut2) { // когда наступит время digitalWrite(pump1_pin, Led1 = 0); // отключить насос 1 и погасить светодиод digitalWrite(Led1_pin, Led1); } static uint32_t future2 = time0_2 ; if (MILLIS >= future2) { future2 = MILLIS + time1_2 ; if (sensor1_Value > waterMin) { // если земля сухая digitalWrite(pump1_pin, Led1 = 1); // включить насос 1 и зажечь светодиод digitalWrite(Led1_pin, Led1); fut2 = MILLIS + time2_2; // и выставить время отключения насоса 1 } MILLIS = millis() ; } //#3 датчик 2 замер раз в 1 час static uint32_t fut3 = 0 ; if (sensor2_on && MILLIS >= fut3) { // когда наступит время sensor2_Value = analogRead(sensor2_pin); // произвести измерение digitalWrite(sensor2_on_pin, sensor2_on = 0); // отключить питание датчика } static uint32_t future3 = 0 ; if (MILLIS >= future3) { future3 = MILLIS + time1_3 ; digitalWrite(sensor2_on_pin, sensor2_on = 1); // включить питание датчика fut1 = MILLIS + time2_3; // и выставить время замера на датчике MILLIS = millis() ; } //#4 мотор 1 полив 2 раза в сутки static uint32_t fut4 = 0 ; if (Led2 && MILLIS >= fut4) { // когда наступит время digitalWrite(pump2_pin, Led2 = 0); // отключить насос 2 и погасить светодиод digitalWrite(Led2_pin, Led2); } static uint32_t future4 = time0_4 ; if (MILLIS >= future4) { future4 = MILLIS + time1_4 ; if (sensor2_Value > waterMin) { // если земля сухая digitalWrite(pump2_pin, Led2 = 1); // включить насос 1 и зажечь светодиод digitalWrite(Led2_pin, Led2); fut2 = MILLIS + time2_4; // и выставить время отключения насоса 1 } MILLIS = millis() ; } //#5 вывод показаний на экран static uint8_t PC_5 = 1 ; static uint32_t future5 = 0 ; if (MILLIS >= future5) { future5 = MILLIS + 1000 ; // обновления идут раз в секунду switch (PC_5) { case 1: PC_5 = 2; // этот раз идет "ЧЕРИМОЙЯ" myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("XTHBVJQZ", CENTER, 0 ); // Выводим надпись "ЧЕРИМОЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor1_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; case 2: PC_5 = 1; // а в этот раз идет "ПАПАЙЯ" myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("GFGFQZ", CENTER, 0 ); // Выводим надпись "ПАПАЙЯ" myOLED.setFont(MegaNumbers); myOLED.print(String(sensor2_Value), CENTER, 12); myOLED.update(); // Обновляем информацию на дисплее break; } } }// время смещения вкл датчика от подачи питания 120 сек
У вас 2 датчика причем совмещены с насосом. Вот я смещаю их работу, что бы они не работали синхронно. То есть один начинает работать с 10 секунд от подачи питания а другой от 120. А так как у них паузы одинаковые, то и дальше они работают не одновременно.
qwone, добрый вечер!
Я Вам очень благодарен, тестирую Ваш новый код)
код в #43?
http://arduino.ru/forum/programmirovanie/pomoshch-so-sketchem#comment-22...
Да, конечно. Именно его.