Помогите выбрать сенсор воды.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Puhlyaviy пишет:

jeka_tm пишет:

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

а что бы загадочней было :)

ну может что то более оправданное, а то как то странно

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

ну может что то более оправданное, а то как то странно

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Puhlyaviy пишет:

jeka_tm пишет:

ну может что то более оправданное, а то как то странно

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

ну если так то хоть HX711 добавить если уж анализатор, а с 10битами и рабочим участом например 300-800 в еденицах ацп маловато

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

Да просто нашел эту тему , вроде подходит , новую не стал открывать :)

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

До подсоединения этого датчика и использования кнопок было так 

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

void setup() {
  lcd.begin(16, 2);             
  lcd.print("Meteo");
  lcd.setCursor(0, 1);
  lcd.print("     Station");
  Serial.begin(9600); 
  Serial.println("start");
 
  dht.begin();
  }

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
    } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    lcd.setCursor(0, 0); 
    lcd.print("                 "); 
    lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print(" %");
    
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
   lcd.setCursor(0, 1); 
   lcd.print("                 "); 
   lcd.setCursor(0, 1); 
   lcd.print("Temp: ");
   lcd.print(t);
   lcd.print(" *C");
    
    }
}

Единственное что не устраивало , так это что экран мигал. Видимо при обновлении цикла .

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

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

// Нажатые кнопки
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("Meteo");                      //   начальная
  lcd.setCursor(0, 1);                     //
  lcd.print("     Station");               //             заставка
  Serial.begin(9600);                     //    последовательнй порт
  Serial.println("DHT11 test!");           //  датчик влажности и температуры
 
  dht.begin();
  }

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

Этот вариант очень понравился :) кнопки срабатывали с вероятностью 90% примерно :) но при подключении датчика влажности почвы кнопки плохо реагируют. Вот решил обратиться к спецам. 

И кстати два цифровых пина используются для точности измерений имхо . В коде то с одного + подают , то с другого . И потом находят среднее арифметическое . Я так понял для точности .

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

почти угадал с диапазоном)))

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

почти угадал с диапазоном)))

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

на кикстартере чувак пообешал с этих двух электродов еще кислотность почвы высчитывать и выдавать рекомендации сколько и каких удобрений нужно добавить :)

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

ничего я не калибровал. нашел в этой теме ссылку . подключил датчик как рекомендовано. взял их скетч. посмотрел значения на воздухе и в политом горшке . обрадовался :)

Но потом не получилось нормально добавить в мой скетч :(

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Puhlyaviy пишет:

jeka_tm пишет:

почти угадал с диапазоном)))

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

на кикстартере чувак пообешал с этих двух электродов еще кислотность почвы высчитывать и выдавать рекомендации сколько и каких удобрений нужно добавить :)

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

Puhlyaviy пишет:

на кикстартере чувак пообешал с этих двух электродов еще кислотность почвы высчитывать и выдавать рекомендации сколько и каких удобрений нужно добавить :)

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

ну еще по расходу бензина можно высчитать стаж и возраст водителя :) а так же цвет глаз и волос

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

to art100

Я решил начать с малого , вот переписал код по вашему образцу 

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

об этом вы говорили ? Это код без датчика влажности почвы .

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

art100 пишет:

4.ваши подпрограммы с ЛСД  уже живые? показывают?

вот и открылось. чувак на кислоте торчит.

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

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

Но раз есть кнопки , почему бы их не задействовать :)

Поэтому я и решил повесить на каждую кнопку свое значение. POT1 как раз и ловит нажатие кнопок . Если меньше 100 , то кнопка1 , если от 100 до 200 то кнопка2 и т.д. Я так понял что это из-за того что у меня не отдельные кнопки со своим пином каждая , а все 6 кнопок подключены к А0 видимо через разное сопротивление(знаний не хватает говорить точно) , отсюда и разное напряжение при нажатии кнопок, которое ловит POT1.

Последний скетч без датчика влажности почвы . Только датчик DHT11 и шилд экрана с 6-тью кнопками . Думаю начать стоит с него. Он по крайней мере работает :) Но , если кнопку нажимать достаточно быстро , то она может не сработать . Если держишь кнопку примерно пол секунды , то срабатывает в 99% , может и в 100% .

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

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-температура , кнопка2-влажность, кнопка3-влажность почвы, кнопка4-приветствие. Помимо этого все 3 значения (влажность , температура и влажность почвы )должны передаваться в последовательный порт.

Что реализовано :

в этом скетче (не кусок , полный)

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

}

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

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

У меня это не работает.

alexbmd
Offline
Зарегистрирован: 15.01.2016

Dima85 пишет:

Помогите разобраться в коде, комментарии в самом коде:

#define voltageFlipPin1 6
#define voltageFlipPin2 7
#define sensorPin 0

void setup(){
  Serial.begin(9600);
  pinMode(voltageFlipPin1, OUTPUT);
  pinMode(voltageFlipPin2, OUTPUT);
  pinMode(sensorPin, INPUT);
}

void setSensorPolarity(boolean flip){ // Здесь мы чередуем: 6 включаем 7 выключаем, 7 включаем 6 выключаем. Зачем? Почему не подходит просто допустим 6 включать выключать, зачем их два?
  if(flip){
    digitalWrite(voltageFlipPin1, HIGH);
    digitalWrite(voltageFlipPin2, LOW);
  }else{
    digitalWrite(voltageFlipPin1, LOW);
    digitalWrite(voltageFlipPin2, HIGH);
  }
}

void loop(){
  setSensorPolarity(true);
  delay(1000);
  int val1 = analogRead(sensorPin);
  delay(1000);  
  setSensorPolarity(false);
  delay(1000);
  // 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);
}

отвечать скорее буду не вам а умникам и умницам решившим блеснуть своей смекалкой  и остротой ума.

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

1. от переменны мест слогаемых сумма не меняется. поэтому хоть плюс справа хоть слева в обоих случаях результат примерно одинаков должен быть. а по данному коду получается: при диапозоне 0..10

val1 = 4

val2 = 10-4 = 6  //а зачем ?

(6+4) /2 = 5   //  важно что среднее всегда будет 5.  1 и 9 , 2 и 8, 3 и 7 и т.д.

 

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

 

ИТОГ:  инверсия хорошо. арифметика из рук вон плохо в данном скетче.

 

imho

inspiritus
Offline
Зарегистрирован: 17.12.2012

Гыы, не прошло и года :)

всегда поражаюсь воскрешающим. Всегда хочется спросить:" какими судьбами ?"

alexbmd
Offline
Зарегистрирован: 15.01.2016

и всегда очень легко ответить. гуглил свою проблемму. читал разные форумы статьи. на некоторые (не смотря на дату) хочеться ответить.  вед задача и её решения не привязанны ко времени ;)

ВН
Offline
Зарегистрирован: 25.02.2016

Недавно провел простенький опыт по изменению емкости электродов сухих и в воде. Получилось, что емкость изменилась примерно вдвое с 2-2,5пФ до 5пФ

ниже модель сенсора, выходные уровни OUT-хх устанавливаются примерно за 10мс. В качестве генератора любой собранный на цифре,

частота влияет на время установления, чем выше, тем быстрее.

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

https://yadi.sk/i/MM90ciV7pwU7V

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Puhlyaviy пишет:
и кстати они делают более хитро чем на приведеной схеме... они запитывают от цифровых пинов.. и получается что гвозди не постоянно под напряжением а только в момент измерения.. тоесть по расписанию... что позволит экономить энергию и не производить гидролиз :)

Правильнее, ИМХО,  будет электролиз.

tomato
Offline
Зарегистрирован: 21.07.2016

alexbmd пишет:

ведь задача и её решения не привязанны ко времени ;)

Согласен! Мне вот помогла инфа, спасибо :)