Датчик влажности почвы ( залипание значения)
- Войдите на сайт для отправки комментариев
Пнд, 02/03/2015 - 21:00
Здравствуйте товарищи, прошу Вашей помощи.
Подскажите что не так? Запили код датчика влажности почвы на ардуино, через com порт показывает стабильные значения как надо было, а вот через LCD 16х2 происходит залипания последнего числа, тоесть влажность показывает как в com порту но остается еще рандомное какое то чисто и все выглядит так ( в ком порте HUN: 143 , а вот на lcd HUM:143* где * залипшее рандомное число). Как это исправить?
http://ru.aliexpress.com/item/Soil-Hygrometer-Humidity-Detection-Module-...
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); int SensorHum = A0; int Hum = 0; void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); } void loop() { Hum = analogRead(SensorHum); lcd.setCursor(0, 0); lcd.print("HUM:"); lcd.setCursor(4, 0); lcd.print(Hum); Serial.print("HUM: "); Serial.println(Hum); delay(1000); }
1. lcd.clear()
2. lcd.setCursor(4,0); lcd.print( " "); lcd.setCursor (4,0); lcd.print(Hum);
Для начала нужно понять как работает любой текстовый экран на контроллере hd44780
а точнее особенность вывода на экран:
После включения питания и инициализации дисплея единажды выполнив команду (точнее две) например
дисплей будет отображать текст HUM: начиная с 0 строки и 0 символа до тех пор пока вы не выведете в место него другой текст или не выполните полную очистку дисплея.
в соответствии с выше изложенным ваш код может выглядеть так:
А для того чтобы избавиться от лишних циферек или хвостиков в общем называйте как хотите их нужно стереть сделать это можно двумя способами для моего кода приведенного выше между строкой 21 и 22 вставить строки
Для вашего кода будет достатачно такой строки:
Вставленной между строкой 21 и 22
Спасибо. Буду уже дома попробую.
Для начала нужно понять как работает любой текстовый экран на контроллере hd44780
а точнее особенность вывода на экран:
После включения питания и инициализации дисплея единажды выполнив команду (точнее две) например
дисплей будет отображать текст HUM: начиная с 0 строки и 0 символа до тех пор пока вы не выведете в место него другой текст или не выполните полную очистку дисплея.
в соответствии с выше изложенным ваш код может выглядеть так:
А для того чтобы избавиться от лишних циферек или хвостиков в общем называйте как хотите их нужно стереть сделать это можно двумя способами для моего кода приведенного выше между строкой 21 и 22 вставить строки
Для вашего кода будет достатачно такой строки:
Вставленной между строкой 21 и 22
Я понял Вашу мысль :) обнулять полностью lcd от каких либо артефактов при цикле луп, да бы не было залипаний :) Сразу не подумал (практика.....)
И простите за вопрос, а что означает значение F в данной строке
lcd.print(F(
"HUM:"
));
Del
Если делать lcd.clear() в каждом проходе, будет неприятное мерцание. Лучше перед выводом очищать знакоместа и туда выводить.
Ну и считывание данных проводить через разумные интервалы - для обычного помещения, влажность и температура 2-5минут.
О как, чет сайт колбасит((((
Для начала нужно понять как работает любой текстовый экран на контроллере hd44780
а точнее особенность вывода на экран:
После включения питания и инициализации дисплея единажды выполнив команду (точнее две) например
дисплей будет отображать текст HUM: начиная с 0 строки и 0 символа до тех пор пока вы не выведете в место него другой текст или не выполните полную очистку дисплея.
в соответствии с выше изложенным ваш код может выглядеть так:
А для того чтобы избавиться от лишних циферек или хвостиков в общем называйте как хотите их нужно стереть сделать это можно двумя способами для моего кода приведенного выше между строкой 21 и 22 вставить строки
Для вашего кода будет достатачно такой строки:
Вставленной между строкой 21 и 22
Спасибо еще раз) то что нужно :)
Товарищи извените еще раз, возник вопрос который я сам не могу переварить :( Прощу Вашей помощи.
В данном коде хотелось реализовать что бы питания пина 11 (5v - Pvcc) подавать на датчик влажности почвы (ссылка выше) раз в 5 минут и снимать показания с него. При постоянном включенном датчике я то понял как был (считать), а вот как сделать так что бы с пинов питания не пойму :( Объясните....
P.S. Просто если постоянно держать датчик в земле включенным электролиз его съест :(
Пин на питание модуля (только токи сперва замерьте), перед измерением в HIGH, выждать паузу для нормализации значения, замерить, пин в LOW. Только по картинке не понял, у вас цифровой и аналоговый выход?
Датчик кстати все равно сгниет, только медленнее.
lcd.print(F(
"HUM:"
));
F это макрос который хранит массив символов (он же char[]) в памяти программ (PROGMEM) можно использовать в функциях например:
Но у макроса есть недостатки
он может быть использован только как параметр передаваемый в функцию
нет оптимизации - Если вы используете ту же строку снова и снова в вашем коде, каждый экземпляр будет потреблять некоторое количество PROGMEM.
Подробней на английском http://www.baldengineer.com/arduino-f-macro.html
по поводу питания переферии с цифрового пина ардуины
на рисунке:
Транзистор например BC327 (допустимый ток 800мА) (можно взять любой PNP Транзистор)
Резистор для данного транзистора нормальным будет номинал в 1кОм
PS картинка не моя взята с googl первая подходящая
и еще немного полезной информации (правда на английском но там все в картинках и то что написанно легко понимается при помощи https://translate.google.ru) http://homes-smart.ru/upload/arduino/arduinoBasicConnections.pdf
Пин на питание модуля (только токи сперва замерьте), перед измерением в HIGH, выждать паузу для нормализации значения, замерить, пин в LOW. Только по картинке не понял, у вас цифровой и аналоговый выход?
Датчик кстати все равно сгниет, только медленнее.
Да, он и аналог A0 и цифровой D0. Вот кусок где я подумал так сделать как написали Вы. Если порт ардуино выдает максимальный ток в 50ma, потребуется ли этому датчику ток больше чем в 50ma? Описание в коде правильно ли?
в куске
Del
Для начала, зачем int-ы, у вас больше 255 пинов? А так вроде правильно. После 18 строки надо задержку подбирать, шилд вряд ли моментально в рабочий режим войдет. А ток тестером от +5В померяйте во время замера. И вроде как 40мА рекомендуют не превышать. Если больше, то пост выше, ток транзистор странно подключен. Такой структуры, обычно эмитер на GND, база правильно, а шилд GND к коллектору Vcc на +5В.
Да, обратно в LOW забыли перевести.
вот неплохой примерчик хотя и не совершенный
Да, обратно в LOW забыли перевести.
В таком плане?
А что Вы имели ввиду int-ы ? #define что ли? Замерив ток оказалось, что он тянет на 173-176ma. Остаеться только через транзистор или нержавеющие спицы.
вот неплохой примерчик хотя и не совершенный
Даже не знаю что сказать) Большое Спасибо за данный пример :) залив Ваш код был удивлен тем, что если нечего мерить(сухо) он не измеряет, а как только (влажно) начинается замер :)
P.S. Я пытался добится именно этого) этого кода :)
Вместо int я имел в виду byte или const byte, последнее лучше. Нержавеющие спицы ток не снизят, так что транзисторный ключ. Не думал, что эта зараза столько жрет.
Ну а 2009Shef вместо просто задержки, сделал по методу усреднения + снял нагрузку с блока вывода(не выводит не потому что сухо, а потому что не меняется значение) . Изучайте))).
Вместо int я имел в виду byte или const byte, последнее лучше. Нержавеющие спицы ток не снизят, так что транзисторный ключ. Не думал, что эта зараза столько жрет.
Ну а 2009Shef вместо просто задержки, сделал по методу усреднения + снял нагрузку с блока вывода(не выводит не потому что сухо, а потому что не меняется значение) . Изучайте))).
На счет int я просто не на сколько познал програмирование, что бы ставить const byte (вернее еще толком не понимаю куда и когда ставить). На счет нержавеющих спиц, я просто могу давать отдельное питание на сам датчик (объединив gnd) постоянно, но думаю это будет излише? Значит буду делать через транзистор. А вот на счет тока сам был удивлен...
Изучаем :)))))
Я и сам месяца четыре как вспоминаю и изучаю. Типы переменных лучше сразу привыкать ставить подходящие. Пинов у вас 20 штук и все положительные, а вы применяете от -32767 до 32767, смысл? Const - не даст вам изменить номер пина или значение переменной.
Я и сам месяца четыре как вспоминаю и изучаю. Типы переменных лучше сразу привыкать ставить подходящие. Пинов у вас 20 штук и все положительные, а вы применяете от -32767 до 32767, смысл? Const - не даст вам изменить номер пина или значение переменной.
Не совсем понял про переменные, когда и в каких местах ставить сразу подходящие (нужны примеры, практика), да я использую пока что меньше 20 пинов на плате (4 реле(2,3,4,5), 1 датчик ds18b20(10) и А0 влажность почвы).
Извиняюсь что нет комментариев, но мне без куда более удобней.
Все объявления пинов - cost byte они нкогда не будут отрицательными и не превысят значение 254.
Все ваши переменные типа currentMillis - unsigned long иначе при переполнении счетчика переменная уйдет в отрицательные значения и начнутся чудеса.
остальные смотрим по значениям которые они могут принять теоретически и под них объявляем нужный тип.
например у вас температура объявлена как float, если не планируете мерять отрицательные значения и десятые градуса, можете объявить ее byte.
от типа переменной зависит объем занимаемой памяти, скорость выполнения кода и корректность результата вычислений.
byte занимает 1байт в памяти, int - два, long и float - четыре.
А комментами зря пренебрегаете, через два месяца сами не вспомните чего нашкодили.
Все объявления пинов - cost byte они нкогда не будут отрицательными и не превысят значение 254.
Все ваши переменные типа currentMillis - unsigned long иначе при переполнении счетчика переменная уйдет в отрицательные значения и начнутся чудеса.
остальные смотрим по значениям которые они могут принять теоретически и под них объявляем нужный тип.
например у вас температура объявлена как float, если не планируете мерять отрицательные значения и десятые градуса, можете объявить ее byte.
от типа переменной зависит объем занимаемой памяти, скорость выполнения кода и корректность результата вычислений.
byte занимает 1байт в памяти, int - два, long и float - четыре.
А комментами зря пренебрегаете, через два месяца сами не вспомните чего нашкодили.
Как я Вас понял, что лучше всегда пины контактов объявлять через cost byte вместо int. Просто я писал стандартно как указано в примерах :(
unsigned long с этим я не понял, что Вы имели ввиду :( А вот на счет типа переменных я уже понял что играет роль тип.
На счет измерения float я об этом думал как избавится от десятых градуса (от ненадобности) но Вы мне пролили свет :) Спасибо!
Но тут делема, так как для моей задачи что 1байт, что 2 байта не кретично, ведь памяти как я понял у желески хватит. Но скорость конечно же важна как я думаю.
Видите ли в чем дело, когда много коментов я в них теряюсь хД, а когда вижу сам код голышем мне как то проще, а то что я не вспомню) это вряд ли, сделав сам не когда не забуду) поглатитель информации)
P.S Я бы и содрал у кого то код и не парился) но мной движет познание) по этому делаю сам с приведенных примеров.
unsigned long с этим я не понял, что Вы имели ввиду
long это знаковая переменная, unsigned long беззнаковая - принмающая только положительные значения и при переполнении начиная снова с 0. Знаковая при положительном переполнении станет не 0, а отрицательным значением. Там цифири большие, на память не напишу. Для примера знаковый int от -32767 до 32767. Беззнаковый от 0 до 65535.