Умная теплица на базе Arduino Mega
- Войдите на сайт для отправки комментариев
К следующему сезону хочу сделать умную теплицу . Нашел на форуме тему об этом и решил создать что то подобное.
Что уже имею :
http://www.aliexpress.com/snapshot/6171181258.html
http://www.aliexpress.com/snapshot/6171181257.html
http://www.aliexpress.com/snapshot/6171216243.html
http://www.aliexpress.com/snapshot/6171041917.html
Что хочу сделать на данном этапе :
1. К Arduino Mega подключить датчик влажности и температуры(DHT11) , датчик влажности почвы , экран с кнопками.
2. Отправлять данные с двух датчиков в последовательный порт. Будет необходимо в дальнейшем.
3. При работе устройства на экране показывается произвольное приветствие. Потом планирую выводить время.
4. Выводить на экран информацию с датчиков. Пока размышляю как лучше это сделать. На данном этапе использовать 3 кнопки с шилда с экраном для вывода каждого значения . Температуры , влажности и влажности почвы.
Хотелось бы конечно организованть ввиде меню. Например так : на экране время . есть кнопка МЕНЮ , при нажатии на нее попадаем в список с показаниями - температура , влажность , влажность почвы . Кнопачками ВВЕРХ и ВНИЗ перемещаемся по меню . При нажатии на кнопочту ENTER на экран выводиться показание. Это вообще реально на Arduino сделать ? В принципе можно просто кнопачками ВВЕРХ,ВНИЗ листать сразу значения.
Пока это все :)
Что реализовано :
1. Шилд экрана воткнут в Arduino Mega , DHT11 - земля,+5v,цифровой pin 52 . датчик влажности почвы подключен по схеме - питание цифровые пины 50 и 51 , данные через аналоговый пин а7.
в этом скетче
реализовано вывод температуры и влажности на экран и в порт. Вопрос по этому скетчу , правильно ли все написано ? Можно ли улучшить код ? Почему при быстром нажатии на кнопки они иногда не срабатывают? Что с этим можно сделать ?
Что не реализовано : вывод на экран данных с датчика влажности почвы ввиду замороченного опроса этого датчика .
вот простой скетч для датчика влажности почвы
не могу их корректно объединить.
Не могу редактировать первое сообщение :(
Итак мой скетч
// Датчик температуры и влажности dht11 // и вывод информации на LCD //датчик dht11 #include "DHT.h" //библиотека датчика DHT11 #define DHTPIN 52 // ПИН подключения датчика // Выбираем модель датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); //------------- //LCD экран #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); #define POT1 A0 // пин кнопок float var1; void setup(){ lcd.begin(16,2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("DHT11 test!"); // датчик влажности и температуры dht.begin(); pinMode(POT1,INPUT); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); // Если значение правильное , то выводим его в порт if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //--------------------------------------------------- var1=analogRead(POT1); if (var1 < 100) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (var1 < 200) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(t); lcd.print(" *C"); } //--------------------------------------------------------------------------------- }это скетч для датчика влажности почвы
#define voltageFlipPin1 6 #define voltageFlipPin2 7 #define sensorPin 0 int flipTimer = 1000; void setup(){ Serial.begin(9600); pinMode(voltageFlipPin1, OUTPUT); pinMode(voltageFlipPin2, OUTPUT); pinMode(sensorPin, INPUT); } void setSensorPolarity(boolean flip){ if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } void loop(){ // setSensorPolarity(true); delay(flipTimer); int val1 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading int val2 = 1023 - analogRead(sensorPin); // reportLevels(val1,val2); } void reportLevels(int val1,int val2){ int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); }а это скетч предложенный пользователем art100
//art100 20140823 обьединяем соответсвенно секциям и смотрим чтобы ноги и переменки не перехлестнулись //подключим все внешние либы #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> #include "DHT.h" //библиотека датчика DHT11 // Датчик температуры и влажности dht11 // и вывод информации на LCD //pins--ноги распределим------------------------------------------------------------ #define BUTTON1 2//хрен его знает где эта нога не вижу #define voltageFlipPin1 6 #define voltageFlipPin2 7 #define sensorPin 0//??? это че какая нога //датчик dht11 #define DHTPIN 52 // ПИН подключения датчика LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );//стиль корявый но краткий #define POT1 A0 // пин кнопок а откуда уверенность что кноппи это ряд резисторов а не просто на землю //consts павыделяем памяти для постоянок переменок смотрим перехлесты ---------------- // Выбираем модель датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); float var1=0; int var2=0;// можно косяк получить если забыть что далше int var3=0;// можно косяк получить если забыть что далше int flipTimer = 1000; //-инициализация однократная ------------------------------------------------------------------ void setup(){ pinMode(BUTTON1,INPUT_PULLUP); // типа датчик влажности опросить lcd.begin(16,2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("DHT11 test!"); // датчик влажности и температуры dht.begin(); pinMode(POT1,INPUT); // Serial.begin(9600); pinMode(voltageFlipPin1, OUTPUT); pinMode(voltageFlipPin2, OUTPUT); pinMode(sensorPin, INPUT); } // собственно класический main в стиле микропроцесорра полупим процессор постоянно========== void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); //--------------------------------------------------------- if(digitalRead(BUTTON1)==LOW){// типа датчик влажности опросить delay(flipTimer); // int val1 = analogRead(sensorPin); // вынесем выделение памяти на глаза var2 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading // int val2 =1023 - analogRead(sensorPin); // вынесем выделение памяти на глаза var3 = 1023 - analogRead(sensorPin); // reportLevels(var2,var3); Serial.print(var2);Serial.print(";");Serial.print(var3);Serial.println(";");//test in out usb } // //--------------------------------------------------------- // Если значение правильное , то выводим его в порт if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //--------------------------------------------------- var1=analogRead(POT1); if (var1 < 100) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (var1 < 200) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(t); lcd.print(" *C"); } //--------------------------------------------------------------------------------- } //-подпрограммы вызываемые многократно ---------------------------------------------- void setSensorPolarity(boolean flip){ if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } //------------------------------------------------ void reportLevels(int val1,int val2){ int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); } //-----------------------------------------------сейчас буду его смотреть , тестить.
Посмотрел скетч art100 внес в него изменения и вроде постарался объяснить как чего .
//art100 20140823 обьединяем соответсвенно секциям и смотрим чтобы ноги и переменки не перехлестнулись //подключим все внешние либы #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> // экран #include "DHT.h" //библиотека датчика DHT11 //pins--ноги распределим------------------------------------------------------------ //#define BUTTON1 2//хрен его знает где эта нога не вижу #define voltageFlipPin1 51// пин питания датчика влажности почвы #define voltageFlipPin2 52// пин питания датчика влажности почвы #define sensorPin a7//пин считывания значения влажности почвы #define DHTPIN 52 // ПИН подключения датчика DHT11 LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );//стиль корявый но краткий #define POT1 A0 // пин кнопок а откуда уверенность что кноппи это ряд резисторов а не просто на землю //consts павыделяем памяти для постоянок переменок смотрим перехлесты ---------------- // Выбираем модель датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); float var1=0; int var2=0;// можно косяк получить если забыть что далше int var3=0;// можно косяк получить если забыть что далше int flipTimer = 1000; //-инициализация однократная ------------------------------------------------------------------ void setup(){ //pinMode(BUTTON1,INPUT_PULLUP); // типа датчик влажности опросить //не знаю откуда этот баттон затисался я же переделал кнопки через POT1 lcd.begin(16,2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("go go go"); // начало работы dht.begin();// запускаем датчик DHT11 pinMode(POT1,INPUT);// говорим что это кнопка pinMode(voltageFlipPin1, OUTPUT);// это питание датчика влажности почвы pinMode(voltageFlipPin2, OUTPUT);// и они меняются местами для точности измерений или для уменьшения скорости разрушения датчика из-за гидролиза pinMode(sensorPin, INPUT);//значения с датчика влажности почвы } // собственно класический main в стиле микропроцесорра полупим процессор постоянно========== void loop() { float h = dht.readHumidity();//значение влажности с датчика DHT11 float t = dht.readTemperature();//значение температуры с датчика DHT11 /*------------------что то здесь не так . это часть кода для считывания значений с датчика влажности почвы , чтоб потом в подпрограмме void reportLevels выводил среднее значение--------------------------------------- if(digitalRead(BUTTON1)==LOW){// типа датчик влажности опросить delay(flipTimer); // int val1 = analogRead(sensorPin); // вынесем выделение памяти на глаза var2 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading // int val2 =1023 - analogRead(sensorPin); // вынесем выделение памяти на глаза var3 = 1023 - analogRead(sensorPin); // reportLevels(var2,var3); Serial.print(var2);Serial.print(";");Serial.print(var3);Serial.println(";");//test in out usb } // --------------это видимо из-за недопонимания------------------------------------------*/ // Если значение правильное , то выводим его в порт if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //------------------а тут наши две кнопки при нажатии на которые выводятся на экран показания температуры и влажности--------------------------------- var1=analogRead(POT1); if (var1 < 100) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (var1 < 200) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(t); lcd.print(" *C"); } //-------------------------сюда бы третью кнопку добавить для вывода значения влажности почвы , значение влажности почвы это msg который-------------------------------------------------------- } //-подпрограммы вызываемые многократно ---------------------------------------------- void setSensorPolarity(boolean flip){//это меняет палярность на пинах для питания датчика влажности почвы , может поэтому в скетче примере и идет до loop, чтоб знать как считать val1 и val2 ? if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } //------------------------------------------------ void reportLevels(int val1,int val2){// это усредняет значение с датчика влажности почвы и выводит в порт int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); } //------------------------------------------------копаю дальше....
Основной вопрос это
if(digitalRead(BUTTON1)==LOW){// типа датчик влажности опросить delay(flipTimer); // int val1 = analogRead(sensorPin); // вынесем выделение памяти на глаза var2 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading // int val2 =1023 - analogRead(sensorPin); // вынесем выделение памяти на глаза var3 = 1023 - analogRead(sensorPin); // reportLevels(var2,var3);можно до этого вставлять
void setSensorPolarity(boolean flip){//это меняет палярность на пинах для питания датчика влажности почвы , может поэтому в скетче примере и идет до loop, чтоб знать как считать val1 и val2 ? if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } }И еще можно сделать так чтоб циклы работали раздельно. То есть :
1. цикл отслеживания кнопок работает постоянно и без задержек , думаю это даст нам 100% нажатие кнопок .
2. цикл датчика DHT11 работает со своей задержкой , скажем раз в минуту . а при нажатии кнопки выводится последнее записанное значение.
3. цикл опроса показания с датчика влажности почвы со своей задержкой , скажем раз в час . Опять таки для более долговременной работы датчика (при постоянном напряжении на металических стержнях они быстро разрушаются). А полить на час позже , думаю не страшно.
Просто думаю что кнопки начинаю плохо срабатывать из-за того что цикл идет долго . так ли это ?
//art100 20140823 обьединяем соответсвенно секциям и смотрим чтобы ноги и переменки не перехлестнулись
//подключим все внешние либы //судя по обнаруженному коду я тут где-то им нагадил на этом щитке жки кнопки резистивные значит там 6 показаний соспротивлений надо помнить. Как я понимаю 1023/6=~100 единий шаг. то есть в if(var1>0 ||var1<100){ нажат батон такойто и рубим тут-то }. Зачем тебе попрограммами заниматься для однократноого запуска выверять через попу постянно проще сплошным текстов раздув if-ы . Писать все равно не 1000строк . Отдалывать быстрей . Переменки все в кучке.//подключим все внешние либы
#include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> // экран #include "DHT.h" //библиотека датчика DHT11 //pins--ноги распределим------------------------------------------------------------ //#define BUTTON1 2//хрен его знает где эта нога не вижу #define voltageFlipPin1 51// пин питания датчика влажности почвы #define voltageFlipPin2 52// пин питания датчика влажности почвы #define sensorPin a7//пин считывания значения влажности почвы #define DHTPIN 52 // ПИН подключения датчика DHT11 LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );//стиль корявый но краткий #define POT1 A0 // пин кнопок а откуда уверенность что кноппи это ряд резисторов а не просто на землю //consts павыделяем памяти для постоянок переменок смотрим перехлесты ---------------- // Выбираем модель датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); float var1=0; int var2=0;// можно косяк получить если забыть что далше int var3=0;// можно косяк получить если забыть что далше int flipTimer = 1000; //-инициализация однократная ------------------------------------------------------------------ void setup(){ //pinMode(BUTTON1,INPUT_PULLUP); // типа датчик влажности опросить //не знаю откуда этот баттон затисался я же переделал кнопки через POT1 lcd.begin(16,2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("go go go"); // начало работы dht.begin();// запускаем датчик DHT11 pinMode(POT1,INPUT);// говорим что это кнопка pinMode(voltageFlipPin1, OUTPUT);// это питание датчика влажности почвы pinMode(voltageFlipPin2, OUTPUT);// и они меняются местами для точности измерений или для уменьшения скорости разрушения датчика из-за гидролиза pinMode(sensorPin, INPUT);//значения с датчика влажности почвы } // собственно класический main в стиле микропроцесорра полупим процессор постоянно========== void loop() { float h = dht.readHumidity();//значение влажности с датчика DHT11 float t = dht.readTemperature();//значение температуры с датчика DHT11 /*------------------что то здесь не так . это часть кода для считывания значений с датчика влажности почвы , чтоб потом в подпрограмме void reportLevels выводил среднее значение--------------------------------------- if(digitalRead(BUTTON1)==LOW){// типа датчик влажности опросить delay(flipTimer); // int val1 = analogRead(sensorPin); // вынесем выделение памяти на глаза var2 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading // int val2 =1023 - analogRead(sensorPin); // вынесем выделение памяти на глаза var3 = 1023 - analogRead(sensorPin); // reportLevels(var2,var3); Serial.print(var2);Serial.print(";");Serial.print(var3);Serial.println(";");//test in out usb } // --------------это видимо из-за недопонимания------------------------------------------*/ // Если значение правильное , то выводим его в порт if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //------------------а тут наши две кнопки при нажатии на которые выводятся на экран показания температуры и влажности--------------------------------- var1=analogRead(POT1); if(var>800 || var1<1000){//кнопка некая резистивная из 6-ти setSensorytyхрентам еще чего } if (var1 < 100) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (var1 < 200) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(t); lcd.print(" *C"); } //-------------------------сюда бы третью кнопку добавить для вывода значения влажности почвы , значение влажности почвы это msg который-------------------------------------------------------- } //-подпрограммы вызываемые многократно ---------------------------------------------- void setSensorPolarity(boolean flip){//это меняет палярность на пинах для питания датчика влажности почвы , может поэтому в скетче примере и идет до loop, чтоб знать как считать val1 и val2 ? if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } //------------------------------------------------ void reportLevels(int val1,int val2){// это усредняет значение с датчика влажности почвы и выводит в порт int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); } //------------------------------------------------void setSensorPolarity(boolean flip){//это меняет палярность на пинах для питания датчика влажности почвы , может поэтому в скетче примере и идет до loop, чтоб знать как считать val1 и val2 ?
if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } }на ваш дки и резстивне кнопки у вас должен быть такой пример
я взял прямо с магазина
в отличии от моего стиля преобразование в обьявления и подпрограмму выненсены
писать долше
я сходжу if-вами разбираю
вы это код для вашего индикатора видели
вставляй в касы ни хачу
//Пример программного кода------------------------------- #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); // Нажатые кнопки int button; const int BUTTON_NONE = 0; const int BUTTON_RIGHT = 1; const int BUTTON_UP = 2; const int BUTTON_DOWN = 3; const int BUTTON_LEFT = 4; const int BUTTON_SELECT = 5; //----------------------------------------------- int getPressedButton(){ int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue < 100){return BUTTON_RIGHT;} else if (buttonValue < 200){return BUTTON_UP;} else if (buttonValue < 400){return BUTTON_DOWN;} else if (buttonValue < 600){return BUTTON_LEFT;} else if (buttonValue < 800){return BUTTON_SELECT;} return BUTTON_NONE; } //----------------------------------------------- void setup(){ lcd.begin(16, 2); lcd.print("zelectro.com.ua"); } //=============================================== void loop(){ button = getPressedButton(); switch (button){ case BUTTON_RIGHT: // при нажатии кнопки выводим следующий текст lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: RIGHT"); break; case BUTTON_LEFT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: LEFT"); break; case BUTTON_UP: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: UP"); break; case BUTTON_DOWN: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: DOWN"); break; case BUTTON_SELECT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: SELECT"); break; } } //===============================так я кнопки и прописал через var . и все правильно <100 одна кнопка , от 100 до 200 вторая и т.д. С этим вроде проблем нет . Фишка вот в чем : например у меня в скетче стоит пауза 5 секунд . я нажимаю на кнопку , var меняет значение . но пока не пройдут эти 5 секунд на экран не выведиться нужная инфа . Так или нет ? Вопрос то вот в чем ардуино постоянно отслеживает var или 1 раз за цикл(loop) ?
второе
опять скетч пример для датчика влажности почвы
#define voltageFlipPin1 6 #define voltageFlipPin2 7 #define sensorPin 0 int flipTimer = 1000; void setup(){ Serial.begin(9600); pinMode(voltageFlipPin1, OUTPUT); pinMode(voltageFlipPin2, OUTPUT); pinMode(sensorPin, INPUT); } void setSensorPolarity(boolean flip){ if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } void loop(){ // setSensorPolarity(true); delay(flipTimer); int val1 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading int val2 = 1023 - analogRead(sensorPin); // reportLevels(val1,val2); } void reportLevels(int val1,int val2){ int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); }в нем подпрограмма
voidsetSensorPolarity(boolean flip){ идет до loop , в котором идет опрос значений с изменением полярностив вашем варианте подпрограмма
voidsetSensorPolarity(boolean flip){ идет после loop , это нормально ? Если честно я не совсем понимаю как работает скетч датчика влажности почвы :)так я его изначально и использовал , а потом ifами переписал :) впринципе это одно и тоже .
Я все три скетча(экран с кнопками , DHT11 и датчик влажности почвы) объединял . Получилось так же как у вас . Но с таким скетчем кнопки плохо работают , редко срабатывают на нажатие . Так же не доконца обнуляется экран, остаются символы от предыдущей информации.
Вот мой скетч с которым я просил помощи изначально
/* Программа для вывода информации о влажности и температуре на экран */ //Датчик DHT11------------------------------------------------------------------------------------------- #include "DHT.h" //подключаем библиотеку для работы с датчиком DHT11 #define DHTPIN 52 // указываем № контакта к которому подключен датчик // Выбираем модель датчика , в нашем примере DHT11 #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); //---------------------------------------------------------------------------------------------------------------- //LCD экран---------------------------------------------------------------- #include <Wire.h> // добавляем две библиотеки #include <LiquidCrystal.h> //для работы с экраном LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); // подключаем экран //------------------------------------------------------------------------------- // Наши кнопки--------------------------------------------------------------------------------------------------- int button; const int BUTTON_NONE = 0; const int BUTTON_RIGHT = 1; const int BUTTON_UP = 2; const int BUTTON_DOWN = 3; const int BUTTON_LEFT = 4; const int BUTTON_SELECT = 5; int getPressedButton() { int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue < 100) { return BUTTON_RIGHT; } else if (buttonValue < 200) { return BUTTON_UP; } // для других кнопок на плате LCD 1602 Keypad Shield else if (buttonValue < 400){ return BUTTON_DOWN; } // else if (buttonValue < 600){ // return BUTTON_LEFT; // } // else if (buttonValue < 800){ // return BUTTON_SELECT; // } return BUTTON_NONE; } //-------------------------------------------------------------------------------------------------------------------------- // датчик влажности почвы------------------------------------------------------- #define voltageFlipPin1 50 //цифровые пины для питания датчика #define voltageFlipPin2 51 //цифровые пины для питания датчика #define sensorPin 7 // аналоговый пин для снятия показаний int flipTimer = 1000; //время опроса датчика //------------------------------------------------------------------------------ void setup() { lcd.begin(16, 2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("DHT11 test!"); // выводим сообщение в последовательный порт dht.begin(); //запускаем датчик DHT11 //------------------датчик влажности почвы----------------- pinMode(voltageFlipPin1, OUTPUT); //два цифровых пина pinMode(voltageFlipPin2, OUTPUT); //это питание , тоесть out pinMode(sensorPin, INPUT); //аналоговый пин считывает данные , то есть in //--------------------------------------------------------- } //------------------------------------устанавливаем где + а где - ------------------------------ void setSensorPolarity(boolean flip){ if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } //----------------------------------------------------------------------- void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); // Если значения получены , то выводим их в последовательный порт-------------------------- if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); delay(2000); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //--------------------------------------------------- --------------------------------------------------------------------------- //-----------------------датчик влажности почвы----------------------------------------------- setSensorPolarity(true); delay(flipTimer); int val1 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading int val2 = 1023 - analogRead(sensorPin); // reportLevels(val1,val2); //--------------------------------------------------------------------------------------- // при нажатии кнопки выводим нужную информацию на экран----------------- button = getPressedButton(); switch (button) { case BUTTON_RIGHT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); break; case BUTTON_UP: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(t); lcd.print(" *C"); break; } //--------------------------------------------------------------------------------- -------------------------- } void reportLevels(int val1,int val2){ int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); }а в итоге вы мне его и возвращаете :) прикол
мне нужен совет как качественно изменить скетч.
Поэтому я и спрашиваю как сделать :
1. цикл отслеживания кнопок работает постоянно и без задержек , думаю это даст нам 100% нажатие кнопок .
2. цикл датчика DHT11 работает со своей задержкой , скажем раз в минуту . а при нажатии кнопки выводится последнее записанное значение.
3. цикл опроса показания с датчика влажности почвы со своей задержкой , скажем раз в час . Опять таки для более долговременной работы датчика (при постоянном напряжении на металических стержнях они быстро разрушаются). А полить на час позже , думаю не страшно.
Так можно сделать ?
Ну и очень хотелось бы чтоб объяснили почему скетч для датчика влажности написан именно так , с использованием подпрограм . Для чего они используются и почему нельзя сделать все в loope ?
Такс понятно. Так дело не пойдет.
1.300$ вперед на вебманей мне.
2.Высылаете ваши все детали мне .
3.Пишите что вы хотите.
Номер кошелька давать?
Свою электронику пришлете или на aliexpress.com укажете мой адрес получателем?
http://www.aliexpress.com/store/product/1602-LCD-Keypad-Shield-Duemilanove-UNO-MEGA2560-MEGA1280-Free-Shipping/110055_620272375.html
http://www.aliexpress.com/store/product/Moisture-Sensor-kit-urban-garden-tool-Soil-Moisture-Sensor-For-328-uno-1280-2560/110055_676775947.html
http://www.aliexpress.com/item/Freeshipping-Mega-2560-R3-Mega2560-REV3-ATmega2560-16AU-Board-USB-Cable-compatible-for-arduino-good-quality/1304207708.html
и что у на там еще градусник?
http://www.aliexpress.com/item/DHT11-Digital-Temperature-and-Humidity-Sensor-Module-For-Arduino-AVR-PIC-New/1773714030.html
и т.д.
Сидеть мне за Вас пару дней писать Вам код на Теоретичском Вашем железе интереса никакого.
я вас не понимаю .
вы попытались мне помочь в меру своих способностей .
я показал вам что то что вы мне советуете тоже самое с чем я пришел сюда искать помощи.
Задал более понятно вопросы , которые меня интересуют.
Вы зачем то заговорили о деньгах , не виртуальных желазках , написании кода за меня .
А как мне надо было ответить вам чтоб вас не обитеть ?
код за меня писать не надо . просто ответьте зависит ли отклик на кнопки от длительности выполнения loopа? как правильно написать чтоб опрос одного датчика был с одной задержкой , а другого с другой? Ну и как бонус объяснить на техническом языке работу скетча датчика влажности почвы. :) Ну не въеду я никак в причинно-следственные связи в этом скетче .
И вообще я рассчитывал на подсказки тех , кто занимается похожим проектом.
просто ответьте зависит ли отклик на кнопки от длительности выполнения loopа?
Возьмите и замерьте, за сколько выполняется loop, тогда и будет понятно, зависит или нет
как правильно написать чтоб опрос одного датчика был с одной задержкой , а другого с другой?
используя millis()
millis() для того чтоб замерить я так понял ?
вот скетч в которм все 2 датчика
//art100 20140823 обьединяем соответсвенно секциям и смотрим чтобы ноги и переменки не перехлестнулись //подключим все внешние либы #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> // экран #include "DHT.h" //библиотека датчика DHT11 //pins--ноги распределим------------------------------------------------------------ //#define BUTTON1 2//хрен его знает где эта нога не вижу #define voltageFlipPin1 50// пин питания датчика влажности почвы #define voltageFlipPin2 51// пин питания датчика влажности почвы #define sensorPin A7//пин считывания значения влажности почвы #define DHTPIN 52 // ПИН подключения датчика DHT11 LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );//стиль корявый но краткий #define POT1 A0 // пин кнопок а откуда уверенность что кноппи это ряд резисторов а не просто на землю //consts павыделяем памяти для постоянок переменок смотрим перехлесты ---------------- // Выбираем модель датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); float var1=0; int var2=0;// можно косяк получить если забыть что далше int var3=0;// можно косяк получить если забыть что далше int flipTimer = 1000; //-инициализация однократная ------------------------------------------------------------------ void setup(){ //pinMode(BUTTON1,INPUT_PULLUP); // типа датчик влажности опросить //не знаю откуда этот баттон затисался я же переделал кнопки через POT1 lcd.begin(16,2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("go go go"); // начало работы dht.begin();// запускаем датчик DHT11 pinMode(POT1,INPUT);// говорим что это кнопка pinMode(voltageFlipPin1, OUTPUT);// это питание датчика влажности почвы pinMode(voltageFlipPin2, OUTPUT);// и они меняются местами для точности измерений или для уменьшения скорости разрушения датчика из-за гидролиза pinMode(sensorPin, INPUT);//значения с датчика влажности почвы } // собственно класический main в стиле микропроцесорра полупим процессор постоянно========== void setSensorPolarity(boolean flip){//это меняет палярность на пинах для питания датчика влажности почвы , может поэтому в скетче примере и идет до loop, чтоб знать как считать val1 и val2 ? if(flip){ digitalWrite(voltageFlipPin1, HIGH); digitalWrite(voltageFlipPin2, LOW); }else{ digitalWrite(voltageFlipPin1, LOW); digitalWrite(voltageFlipPin2, HIGH); } } void loop() { float h = dht.readHumidity();//значение влажности с датчика DHT11 float t = dht.readTemperature();//значение температуры с датчика DHT11 //что то здесь не так . это часть кода для считывания значений с датчика влажности почвы , чтоб потом в подпрограмме void reportLevels выводил среднее значение--------------------------------------- // setSensorPolarity(true); delay(flipTimer); int val1 = analogRead(sensorPin); delay(flipTimer); setSensorPolarity(false); delay(flipTimer); // invert the reading int val2 = 1023 - analogRead(sensorPin); // reportLevels(val1,val2); //--------------это видимо из-за недопонимания------------------------------------------ // Если значение правильное , то выводим его в порт if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } //------------------а тут наши две кнопки при нажатии на которые выводятся на экран показания температуры и влажности--------------------------------- var1=analogRead(POT1); if (var1 < 100) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (var1 < 200) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(t); lcd.print(" *C"); } //-------------------------сюда бы третью кнопку добавить для вывода значения влажности почвы , значение влажности почвы это msg который-------------------------------------------------------- } //-подпрограммы вызываемые многократно ---------------------------------------------- //------------------------------------------------ void reportLevels(int val1,int val2){// это усредняет значение с датчика влажности почвы и выводит в порт int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); } //------------------------------------------------чтоб информация на экране появилась надо жать на кнопку примерно секунду.
без датчика влажности почвы кнопки срабатывают нормально .
добавил delay в loop , время реакции на клавишу увеличилось . Отсюда делаю вывод что отклик на нажатие кнопки зависит от времени выполнения loopa .
И как же так сделать чтоб и кнопки реагировали быстро , и датчики опрашивать пореже ?
не проще ли выводить на экран все данные на одну секунду в цикле ? 5 данных - за 5 секунд ничего не нажимая вы их все увидите... как на двухтарифном счётчике электроэнергии с электронным табло.... ( только там каждое выводимое значение уж слишком долго высвечивается :(
экран 4 строки по 20 символов - t воэдуха, влажность воздуха и влажность почвы - за один раз всё вывести на отображение может...
на время выполнения delay() - процессор глух и нем ( типа кушает ) - вот и задержки в обработке нажатий кнопок....
Согласен что так проще . С этого я начинал . Именно так и сделал , только выводил 2 значения , экран 1602 :)
Непонравилось то , что экран мигает. Раз в секунду когда обновляется инфа.
А так как хотелось время тоже показывать , да и кнопки не выбрасывать же :) вот решил придумать как сделать лучше.
на время выполнения delay() - процессор глух и нем ( типа кушает ) - вот и задержки в обработке нажатий кнопок....
это я уже понял :)
Вот и вопрос как же так сделать чтоб кнопочки работали независимо от интервала опроса датчиков ?
А в дальнейшем планировалось сделать меню . В котором должно быть много пунктов . Не только просмотр параметров , но и управление например открытием форточки вручную .
мысли в слух . может в loopе надо только кнопки оставить и циклы для регулирования задержек опросов датчиков . а внутри этих циклов переход к функциям опроса датчиков .
Ну типа loop крутится крутится , следит за кнопками и считает время . В определенное время вызывает функцию , которая опрашивает датчик и перезаписывает значение . Так можно сделать ? :)
мысли в слух . может в loopе надо только кнопки оставить и циклы для регулирования задержек опросов датчиков . а внутри этих циклов переход к функциям опроса датчиков .
Ну типа loop крутится крутится , следит за кнопками и считает время . В определенное время вызывает функцию , которая опрашивает датчик и перезаписывает значение . Так можно сделать ? :)
loop крутится достаточно быстро, чтобы уйти от делей-ев примените millis().
не надо делать "...регулирования задержек опросов датчиков..." - засекли время миллисом, сохранили его в переменную, и в ифе смотрите - разницу между сохранённым миллисом и текущим.... если разница больше или равна периоду опроса датчика, то ветка опроса выполнится, если нет - то этот блок не будет выполняться, loop пойдёт дальше... смотрите пример БЛИНК без делей-ев
резистивная клавиатура изи трёх кнопок - каждому состоянию нажатых отжатых кнопок соответствует своё значение на входе АЦП, в лупе ифом проверяем "нет нажатых кнопок" - да=пропускаемХод, нет=уходим в процедуру обработки показаний с клавиатуры.... кататак :)
можете ли вы выложить схему резистивной клавы ? кнопки и резисторы - что как соединено ?
Вот как раз думаю как millis() прикрутить . Не могу понять как условие срабатывания сделать :(
С кнопками вроде все понятно , ifами и отслеживаю .
вот кнопки
//------------------а тут наши две кнопки при нажатии на которые выводятся на экран показания температуры и влажности--------------------------------- buttons=analogRead(POT1); if (buttons < 100) { lcd.clear(); //очищаем экран lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (buttons > 100 && buttons < 200) { lcd.clear(); //очищаем экран lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(k); lcd.print(" *C"); } else if (buttons < 400 && buttons > 200) { lcd.clear(); //очищаем экран lcd.setCursor(0, 0); lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка }millis() ведь постояноо растет до 2 в 32 степени , потом сбрасывается . Вот чтото не вкурю как условие придумать .
пока вот до этого додумался :)
times = times + 0.001; if (times > 10){ times=0; k=readSenseDHT11(); Serial.println(k); }бегло прочитал.... не всегда надо очищать ВЕСЬ экран, распределите экран под текст и меняйте-перезаписывайте ТОЛЬКО значения с датчиков, под которые выделите соответствующие знакоместа.... мерциний экрана будет меньше
millis() ведь постояноо растет до 2 в 32 степени , потом сбрасывается . Вот чтото не вкурю как условие придумать .
засечка времени - TempMillis = millis( )
отслеживание - if ( millis( ) - TempMillis > TzadannoeSlegeniya ) - то уходим в обработку этого события, нет - пропуск хода
полный скетч к чему щас пришел
//подключим все внешние либы #include <Wire.h> // добавляем необходимые библиотеки #include <LiquidCrystal.h> // экран #include "DHT.h" //библиотека датчика DHT11 float temperature; //переменная для вывода температуры float t; float h; //pins--ноги распределим------------------------------------------------------------ #define voltageFlipPin1 50// пин питания датчика влажности почвы #define voltageFlipPin2 51// пин питания датчика влажности почвы #define sensorPin A7//пин считывания значения влажности почвы #define DHTPIN 52 // ПИН подключения датчика DHT11 LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );//стиль корявый но краткий #define POT1 A0 // пин кнопок //consts павыделяем памяти для постоянок переменок смотрим перехлесты ---------------- // Выбираем модель датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); float buttons=0; //переменная для отслеживания нажатия кнопок float times=0; //переменная для подсчета времени int var1=0; // int var2=0;// можно косяк получить если забыть что далше int var3=0;// можно косяк получить если забыть что далше int flipTimer = 1000; //-инициализация однократная ------------------------------------------------------------------ void setup(){ lcd.begin(16,2); //наш экран lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка Serial.begin(9600); // последовательнй порт Serial.println("go go go"); // начало работы dht.begin();// запускаем датчик DHT11 pinMode(POT1,INPUT);// отслеживание нажатий кнопок pinMode(voltageFlipPin1, OUTPUT);// это питание датчика влажности почвы pinMode(voltageFlipPin2, OUTPUT);// и они меняются местами для точности измерений или для уменьшения скорости разрушения датчика из-за гидролиза pinMode(sensorPin, INPUT);//значения с датчика влажности почвы temperature = dht.readTemperature();// первое значение температуры для экрана , чтоб не было 0 пока ждем опрос датчика в цикле } void loop() { //типа таймер для включения функции опроса датчика температуры----------------------- times = times + 0.001; if (times > 100){ times=0; temperature=readSenseDHT11(); Serial.println(temperature); } //--------------------------------------------------------------------------------------------------------------------------- //------------------а тут наши три кнопки при нажатии на которые выводятся на экран показания температуры и влажности--------------------------------- buttons=analogRead(POT1); if (buttons < 100) { lcd.clear(); //очищаем экран lcd.setCursor(0, 0); lcd.print("Humidity: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(h); lcd.print(" %"); } else if (buttons > 100 && buttons < 200) { lcd.clear(); //очищаем экран lcd.setCursor(0, 0); lcd.print("Temperature: "); lcd.setCursor(0, 1); lcd.print(" "); lcd.print(temperature); lcd.print(" *C"); } else if (buttons < 400 && buttons > 200) { lcd.clear(); //очищаем экран lcd.setCursor(0, 0); lcd.print("Meteo"); // начальная lcd.setCursor(0, 1); // lcd.print(" Station"); // заставка } //--------------------------------------------------------------------------------- } //-подпрограммы вызываемые многократно ---------------------------------------------- //--------------функция опроса датчика температуры int readSenseDHT11() { float t = dht.readTemperature();//значение температуры с датчика DHT11 return t; } //--------------------------------------------------------------------покритекуйте плиз .
вниз надо будет добавить функцию для влажности и влажности почвы . Ну и в loope для них сделать свои ifы . Тогда можно будет тестить работу кнопок .
Вопросы :
1. можно ли выводить два значения в функции readSenseDHT11() ? Чтоб в ней не только температура спрашивалась но и влажность .
засечка времени - TempMillis = millis( ) это я так понимаю время прохождения цикла ? если да , то тогда после
отслеживание - if ( millis( ) - TempMillis > TzadannoeSlegeniya ) - то уходим в обработку этого события и здесь присваиваем TempMillis новое значение ?
А то после определенного времени условие будет соблюдаться постоянно .
Но когда millis( ) сбросится надо будет опять присвоить TempMillis новое значение ?
БабушкаМиллис в лупе всё время вяжет носки...
в 11:00 она ещё поставила варить варенье с периодом помешивания его 10 мин...
БабушкаМ запоминает текущее время ( 11:00 ) и период контроля ( 10 мин ), вяжет дальше....
каждую минуту ( это за сколько крутится луп ) она смотрит на часы... видит 11:07 ( прошло 7 мин ) - вяжет дальше...
и вот когда она вычислит, что ( 11:11 - 11:00 > 10 ) она запомнит сначала новое текущее время ( 11:11 ), потом пойдет помешает варенье.....
через ещё 7 мин она будет вычислять разницу ( 11:18 - 11:11 ) - и будет продолжать вязать.... пока разница не станет > 10
.....DI HALT горазд на такие аллегории :)
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
....не надо думать про переполнение миллис(), опрос раз в секунду, а переполнение раз в 50 дней - вы ничего и не заметите :)
присваиваем TempMillis новое значение ?
ДА
замечательный пример :)
спасибо , вроде картинка начинает формироваться.
http://arduino.ru/Reference/Millis
я вот о чем :
TempMillis у нас стал каким то большим числом , а millis( ) сбросился . Ведь теперь нам надо будет очень долго ждать пока выполнится условие . Разве нет ?
вот так в общих чертах
unsigned long TempMillis; void setup(){ Serial.begin(9600); TempMillis = millis(); } void loop(){ if ( millis( ) - TempMillis > 10000 ){ TempMillis = millis(); Serial.print("Time "); } }разве при сбросе millis() не будет долгого ожидания длинной примерно в 50 дней ?
Как мне видиться для исправления этого надо в else поставить проверку на отрицательное значение . Так ? или я не туда копаю ? :)
как то так например
unsigned long TempMillis; float var1; void setup(){ Serial.begin(9600); TempMillis = millis(); } void loop(){ if ( millis( ) - TempMillis > 10000 ){ TempMillis = millis(); Serial.print("Time "); } else { var1=millis( ) - TempMillis; if (var1 отрицательное){ TempMillis = millis(); } }тут вопрос какие переменные использовать и как проверка на отрицательность выглядит ? Тупо <0 ?
так ! если отрицательное - сразу фиксируем новое время.... "сбой" будет каждые 50 дней на 5....10 сек
то есть в последнем сообщении я правильно написал с else ? А переменные я правильно обозначил unsigned long и float соответственно ?
строка 14 - var1 должна быть как в строке 01 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
не надо проверять на отрицательное значение.... унсигнет не может быть отрицательным....
за 5 сек до переполнения запомнили миллис, через 5 сек после переполнения разница будет 5000 - 6500000 = всяко больше 10000, ибо тип беззнаковый, значит сразу выполнится переход к опросу датчиков....
сколько не грозили миру проблемой 2000-го года - все системы её пережили же :) ( такое же переполнение было - только масштаб побольше )
#37
строки 10 и 11 будут выполняться каждые 10 сек, процессор в это время сможет решать другие лупные задачи....
строки13....17 - лишние
так значит else нен нужен и var1 соответственно :)
ух , спасибо за такое подробное объяснения . Теперь буду следующие функции ковырять .
то есть в последнем сообщении я правильно написал с else ? А переменные я правильно обозначил unsigned long и float соответственно ?
целое - целое = целое , зачем здесь флоат ?
да, правильно....
только помните, что на каждое событие нужна своя переменная TempMillis
TempMillisТемпература = 10000
TempMillisВлажность = 20000
TempMillisКлава = 500
и т. и д., и т.п.
и все-таки уточню :)
унсигнет - унсигнет = -650000 , но оно берется по модулю и потом сравнивается с 10000 . Так ? :)
нет не так
беззнаковое трёхбитовое число - 0....7
3 - 6 = ? как думаете ? не говорите, что -3
знаковое трёхбитовое число - -3....+3, старший бит отводится под знак, вот и диапазон представляемых чисел ( по модулю ) меньше в два раза....
беззнаковые
011
-
110
=
101
3 - 6 = 5 ( или 4 ? не помню, надо повторить представление чисел в дополнительном коде :( ) !!!!!!!!!!!!! ибо компилятор следит за типом данных :)
Смотрю назвал сколько это стоит напрягатся начал.
Я то я ему полдня сидел слил все в одну простынку без косяков, а в ответ два дня пофиг: ни схемы кнопок ни схемы влажности.
Я еще недорого назвал. Месяц конструктора ~700-1500$ стоит => 1 неделя 350$
Что вы тут какую-то бадягу у теплици про НЕdelay развели?
1.Тупо влажнсти и температуры постоянно непрерывно выгоняй в жки ОН ВЕДЬ ЗАПОМИНАЮЩИЙ(по крайней мере всегда последние 20лет было)
2.if-ами или сравнивай с заранее установленными максимумами и минимуами
3.если событие наступило 1.врубай фотек-ом лампу ДНАТ 2.грей тяни мотором форточку 3.врубай кран полива
4.если событие наступило 1.вырубай лампу ДНАТ 2. тяни моторм форточку3.вырубай кран полива
5.и пара кнопок также вверз вниз
(свет(фотосинтез) температура и влажность должны буть пропорциоанальными всегда )
все вся логика закончиласл Техническое Задание готово ВЫ мне должны 100$
чего тут думать тут тут трясти надо
тут подпрограммы 5 градусник влажность свет мотор мотор все заночились
вы меня окончательно запутать решили ? :) раз без знаковое значит 3 , верно ? без знака и по модулю это одно и тоже получается .