Умная теплица на базе Arduino Mega

Cyoko
Offline
Зарегистрирован: 22.08.2014

К следующему сезону хочу сделать умную теплицу . Нашел на форуме тему об этом и решил создать что то подобное.

Что уже имею :

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.

в этом скетче 

реализовано вывод температуры и влажности на экран и в порт. Вопрос по этому скетчу , правильно ли все написано ? Можно ли улучшить код ? Почему при быстром нажатии на кнопки они иногда не срабатывают? Что с этим можно сделать ?

Что не реализовано : вывод на экран данных с датчика влажности почвы ввиду замороченного опроса этого датчика . 

вот простой скетч для датчика влажности почвы 

не могу их корректно объединить.

Cyoko
Offline
Зарегистрирован: 22.08.2014

Не могу редактировать первое сообщение :(

Итак мой скетч 


// Датчик температуры и влажности 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);
  }
}

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

И еще можно сделать так чтоб циклы работали раздельно. То есть :

1. цикл отслеживания кнопок работает постоянно и без задержек , думаю это даст нам 100% нажатие кнопок .

2. цикл датчика DHT11 работает со своей задержкой , скажем раз в минуту . а при нажатии кнопки выводится последнее записанное значение.

3. цикл опроса показания с датчика влажности почвы со своей задержкой , скажем раз в час . Опять таки для более долговременной работы датчика (при постоянном напряжении на металических стержнях они быстро разрушаются). А полить на час позже , думаю не страшно.

Просто думаю что кнопки начинаю плохо срабатывать из-за того что цикл идет долго . так ли это ?

art100
Offline
Зарегистрирован: 09.03.2014

//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);
  }
}

 

art100
Offline
Зарегистрирован: 09.03.2014

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

я взял прямо с магазина

в отличии от моего стиля преобразование в обьявления и подпрограмму выненсены

писать долше

я сходжу 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;
   }
}
//===============================

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

так я кнопки и прописал через 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);

}

в нем подпрограмма void setSensorPolarity(boolean flip){ идет до loop  , в котором идет опрос значений с изменением полярности 

setSensorPolarity(true);
31
  delay(flipTimer);
32
  int val1 = analogRead(sensorPin);
33
  delay(flipTimer); 
34
  setSensorPolarity(false);
35
  delay(flipTimer);
36
  // invert the reading
37
  int val2 = 1023 - analogRead(sensorPin);
38
  //
39
  reportLevels(val1,val2);

в вашем варианте  подпрограмма void setSensorPolarity(boolean flip){ идет после loop , это нормально ? Если честно я не совсем понимаю как работает скетч датчика влажности почвы :)

 

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

так я его изначально и использовал , а потом ifами переписал :) впринципе это одно и тоже . 

Cyoko
Offline
Зарегистрирован: 22.08.2014

Я все три скетча(экран с кнопками , 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);

}

а в итоге вы мне его и возвращаете :) прикол

Cyoko
Offline
Зарегистрирован: 22.08.2014

мне нужен совет как качественно изменить скетч.

Поэтому я и спрашиваю как сделать : 

1. цикл отслеживания кнопок работает постоянно и без задержек , думаю это даст нам 100% нажатие кнопок .

2. цикл датчика DHT11 работает со своей задержкой , скажем раз в минуту . а при нажатии кнопки выводится последнее записанное значение.

3. цикл опроса показания с датчика влажности почвы со своей задержкой , скажем раз в час . Опять таки для более долговременной работы датчика (при постоянном напряжении на металических стержнях они быстро разрушаются). А полить на час позже , думаю не страшно.

Так можно сделать ? 

Ну и очень хотелось бы чтоб объяснили почему скетч для датчика влажности написан именно так , с использованием подпрограм . Для чего они используются и почему нельзя сделать все в loope ?

art100
Offline
Зарегистрирован: 09.03.2014

Такс понятно. Так дело не пойдет.

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

и т.д.

 

Сидеть мне за Вас пару дней писать Вам код на Теоретичском Вашем железе интереса никакого.

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

я вас не понимаю .

вы попытались мне помочь в меру своих способностей . 

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

Задал более понятно вопросы , которые меня интересуют.

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

А как мне надо было ответить вам чтоб вас не обитеть ?

код за меня писать не надо . просто ответьте зависит ли отклик на кнопки от длительности выполнения loopа? как правильно написать чтоб опрос одного датчика был с одной задержкой , а другого с другой? Ну и как бонус объяснить на техническом языке работу скетча датчика влажности почвы. :) Ну не въеду я никак в причинно-следственные связи в этом скетче .

И вообще я рассчитывал на подсказки тех , кто занимается похожим проектом.

vdk
Offline
Зарегистрирован: 14.04.2013

Cyoko пишет:

 просто ответьте зависит ли отклик на кнопки от длительности выполнения loopа? 

Возьмите и замерьте, за сколько выполняется loop, тогда и будет понятно, зависит или нет

Cyoko пишет:

как правильно написать чтоб опрос одного датчика был с одной задержкой , а другого с другой?

используя millis()

Cyoko
Offline
Зарегистрирован: 22.08.2014

millis() для того чтоб замерить я так понял ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

вот скетч в которм все 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 .

И как же так сделать чтоб и кнопки реагировали быстро , и датчики опрашивать пореже ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не проще ли выводить на экран все данные на одну секунду в цикле ? 5 данных - за 5 секунд ничего не нажимая вы их все увидите... как на двухтарифном счётчике электроэнергии с электронным табло.... ( только там каждое выводимое значение уж слишком долго высвечивается :(

экран 4 строки по 20 символов - t воэдуха, влажность воздуха и влажность почвы - за один раз всё вывести на отображение может... 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

на время выполнения delay() - процессор глух и нем ( типа кушает ) - вот и задержки в обработке нажатий кнопок....

Cyoko
Offline
Зарегистрирован: 22.08.2014

Согласен что так проще . С этого я начинал . Именно так и сделал , только выводил 2 значения , экран 1602 :)

Непонравилось то , что экран мигает. Раз в секунду когда обновляется инфа.

А так как хотелось время тоже показывать , да и кнопки не выбрасывать же :) вот решил придумать как сделать лучше.

Cyoko
Offline
Зарегистрирован: 22.08.2014

SU-27-16 пишет:

на время выполнения delay() - процессор глух и нем ( типа кушает ) - вот и задержки в обработке нажатий кнопок....

это я уже понял :)

Вот и вопрос как же так сделать чтоб кнопочки работали независимо от интервала опроса датчиков ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

А в дальнейшем планировалось сделать меню . В котором должно быть много пунктов . Не только просмотр параметров , но и управление например открытием форточки вручную . 

Cyoko
Offline
Зарегистрирован: 22.08.2014

мысли в слух . может в loopе надо только кнопки оставить и циклы для регулирования задержек опросов датчиков . а внутри этих циклов переход к функциям опроса датчиков .

Ну типа loop крутится крутится , следит за кнопками и считает время . В определенное время вызывает функцию , которая опрашивает датчик и перезаписывает значение . Так можно сделать ? :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Cyoko пишет:

мысли в слух . может в loopе надо только кнопки оставить и циклы для регулирования задержек опросов датчиков . а внутри этих циклов переход к функциям опроса датчиков .

Ну типа loop крутится крутится , следит за кнопками и считает время . В определенное время вызывает функцию , которая опрашивает датчик и перезаписывает значение . Так можно сделать ? :)

loop крутится достаточно быстро, чтобы уйти от делей-ев примените millis().

не надо делать "...регулирования задержек опросов датчиков..." - засекли время миллисом, сохранили его в переменную, и в ифе смотрите - разницу между сохранённым миллисом и текущим.... если разница больше или равна периоду опроса датчика, то ветка опроса выполнится, если нет - то этот блок не будет выполняться, loop пойдёт дальше... смотрите пример БЛИНК без делей-ев

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

резистивная клавиатура изи трёх кнопок - каждому состоянию нажатых отжатых кнопок соответствует своё значение на входе АЦП, в лупе ифом проверяем "нет нажатых кнопок" - да=пропускаемХод, нет=уходим в процедуру обработки показаний с клавиатуры.... кататак :)

можете ли вы выложить схему резистивной клавы ? кнопки и резисторы - что как соединено ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

Вот как раз думаю как millis() прикрутить . Не могу понять как условие срабатывания сделать :(

С кнопками вроде все понятно , ifами и отслеживаю .

Cyoko
Offline
Зарегистрирован: 22.08.2014

вот кнопки 

  //------------------а тут наши две кнопки при нажатии на которые выводятся на экран показания температуры и влажности---------------------------------   
     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");               //             заставка
  }

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

millis() ведь постояноо растет до 2 в 32 степени , потом сбрасывается . Вот чтото не вкурю как условие придумать . 

Cyoko
Offline
Зарегистрирован: 22.08.2014

пока вот до этого додумался :) 

times = times + 0.001;
if (times > 10){
  times=0;
  k=readSenseDHT11();
  Serial.println(k);
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

бегло прочитал.... не всегда надо очищать ВЕСЬ экран, распределите экран под текст и меняйте-перезаписывайте ТОЛЬКО значения с датчиков, под которые выделите соответствующие знакоместа.... мерциний экрана будет меньше

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Cyoko пишет:

millis() ведь постояноо растет до 2 в 32 степени , потом сбрасывается . Вот чтото не вкурю как условие придумать . 

засечка времени - TempMillis = millis( )

отслеживание - if ( millis( ) - TempMillis > TzadannoeSlegeniya ) - то уходим в обработку этого события, нет - пропуск хода

Cyoko
Offline
Зарегистрирован: 22.08.2014

полный скетч к чему щас пришел 

//подключим все внешние либы
#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() ? Чтоб в ней не только температура спрашивалась но и влажность .

Cyoko
Offline
Зарегистрирован: 22.08.2014

засечка времени - TempMillis = millis( ) это я так понимаю время прохождения цикла ? если да , то тогда после 

отслеживание - if ( millis( ) - TempMillis > TzadannoeSlegeniya ) - то уходим в обработку этого события и здесь присваиваем TempMillis новое значение ?

А то после определенного времени условие будет соблюдаться постоянно .

Но когда millis( ) сбросится надо будет опять присвоить TempMillis новое значение ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

БабушкаМиллис в лупе всё время вяжет носки...

в 11:00 она ещё поставила варить варенье с периодом помешивания его 10 мин...

БабушкаМ запоминает текущее время ( 11:00 ) и период контроля ( 10 мин ), вяжет дальше....

каждую минуту ( это за сколько крутится луп ) она смотрит на часы... видит 11:07 ( прошло 7 мин ) - вяжет дальше...

и вот когда она вычислит, что ( 11:11 - 11:00 > 10 ) она запомнит сначала новое текущее время ( 11:11 ), потом пойдет помешает варенье.....

через ещё 7 мин она будет вычислять разницу ( 11:18 - 11:11 ) - и будет продолжать вязать.... пока разница не станет > 10

.....DI HALT горазд на такие аллегории :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

....не надо думать про переполнение миллис(), опрос раз в секунду, а переполнение раз в 50 дней - вы ничего и не заметите :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

присваиваем TempMillis новое значение ?

ДА

Cyoko
Offline
Зарегистрирован: 22.08.2014

замечательный пример :) 

спасибо , вроде картинка начинает формироваться.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
Cyoko
Offline
Зарегистрирован: 22.08.2014

я вот о чем :

TempMillis у нас стал каким то большим числом , а millis( ) сбросился . Ведь теперь нам надо будет очень долго ждать пока выполнится условие . Разве нет ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

вот так в общих чертах 


unsigned long TempMillis;


void setup(){
  Serial.begin(9600);
  TempMillis = millis();
}
void loop(){
  if ( millis( ) - TempMillis > 10000 ){
    TempMillis = millis();
    Serial.print("Time ");
  }  
    
}

разве при сбросе millis() не будет долгого ожидания длинной примерно в 50 дней ?

Как мне видиться для исправления этого надо в else поставить проверку на отрицательное значение . Так ? или я не туда копаю ? :)

Cyoko
Offline
Зарегистрирован: 22.08.2014

как то так например

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 ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

так ! если отрицательное - сразу фиксируем новое время.... "сбой" будет каждые 50 дней на 5....10 сек

Cyoko
Offline
Зарегистрирован: 22.08.2014

то есть в последнем сообщении я правильно написал с else ? А переменные я правильно обозначил unsigned long и float соответственно ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строка 14 - var1 должна быть как в строке 01 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

не надо проверять на отрицательное значение.... унсигнет не может быть отрицательным.... 

за 5 сек до переполнения запомнили миллис, через 5 сек после переполнения разница будет 5000 - 6500000 = всяко больше 10000, ибо тип беззнаковый, значит сразу выполнится переход к опросу датчиков....

 

сколько не грозили миру проблемой 2000-го года - все системы её пережили же :) ( такое же переполнение было - только масштаб побольше )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#37

строки 10 и 11 будут выполняться каждые 10 сек, процессор в это время сможет решать другие лупные задачи....

строки13....17 - лишние

Cyoko
Offline
Зарегистрирован: 22.08.2014

так значит else нен нужен и var1 соответственно :)

Cyoko
Offline
Зарегистрирован: 22.08.2014

ух , спасибо за такое подробное объяснения . Теперь буду следующие функции ковырять .

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Cyoko пишет:

то есть в последнем сообщении я правильно написал с else ? А переменные я правильно обозначил unsigned long и float соответственно ?

целое - целое = целое , зачем здесь флоат ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

да, правильно....

только помните, что на каждое событие нужна своя переменная TempMillis

TempMillisТемпература = 10000

TempMillisВлажность = 20000

TempMillisКлава = 500

и т. и д., и т.п.

Cyoko
Offline
Зарегистрирован: 22.08.2014

и все-таки уточню :) 

унсигнет - унсигнет = -650000 , но оно берется по модулю и потом сравнивается с 10000 . Так ? :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

нет не так 

беззнаковое трёхбитовое число - 0....7

3 - 6 = ? как думаете ? не говорите, что -3

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

знаковое трёхбитовое число - -3....+3, старший бит отводится под знак, вот и диапазон представляемых чисел ( по модулю ) меньше в два раза....

беззнаковые

  011

-

  110

=

  101

3 - 6 = 5 ( или 4 ? не помню, надо повторить представление чисел в дополнительном коде :(    ) !!!!!!!!!!!!! ибо компилятор следит за типом данных :) 

art100
Offline
Зарегистрирован: 09.03.2014

Смотрю назвал сколько это стоит напрягатся начал.

Я то я ему полдня сидел слил все в одну простынку без косяков, а в ответ два дня пофиг: ни схемы кнопок ни схемы влажности.

Я еще недорого назвал. Месяц конструктора ~700-1500$ стоит => 1 неделя 350$

Что вы тут какую-то бадягу у теплици про НЕdelay развели?

1.Тупо влажнсти и температуры постоянно непрерывно выгоняй в жки ОН ВЕДЬ ЗАПОМИНАЮЩИЙ(по крайней мере всегда последние 20лет было)

2.if-ами или сравнивай с заранее установленными максимумами и минимуами

3.если событие наступило 1.врубай фотек-ом лампу ДНАТ 2.грей тяни мотором форточку 3.врубай кран полива

4.если событие наступило 1.вырубай лампу ДНАТ 2. тяни моторм форточку3.вырубай кран полива

5.и пара кнопок также вверз вниз 

(свет(фотосинтез) температура и влажность должны буть пропорциоанальными всегда )

все вся логика закончиласл Техническое Задание готово ВЫ мне должны 100$

чего тут думать тут тут трясти надо

тут подпрограммы 5 градусник влажность свет мотор мотор все заночились

 

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

вы меня окончательно запутать решили ? :) раз без знаковое значит 3 , верно ? без знака и по модулю это одно и тоже получается .