Здравствуйте, уважаемые обитатели этого славного форума. Я только вкатываюсь в само понятие Ардуино и буду задавать здесь много странных, глупых и абсурдных вопросов. Вопрос №1 Вот у меня есть: http://amperka.ru/product/soil-moisture-sensor http://amperka.ru/product/troyka-quad-display http://amperka.ru/product/arduino-uno Бессчетное количество проводов всех цветов и размеров BreadBoard Вот я могу: Вывести на дисплей 4 цифры Вот я сделал: Подключил дисплей (http://wiki.amperka.ru/_media/продукты:troyka:troyka_quad_spi.png Вот по этой картинке, но без шилда, напрямую) Подключил датчик Вопрос: Как вывести на дисплей показания датчика?
Библиотека для работы с дисплеем https://github.com/amperka/QuadDisplay2 там же и скетч с примером есть.
Да, скетч и библиотеку я нашел и успешно вывел на дисплей пару чисел. Но я все еще не осознаю - как вывести на дисплей показания датчика влажности почвы.
Вот так выводить в сериал порт Код (C++): #define H_DATA A0 // Подключаем пин датчика на A0 void setup() { Serial.begin(9600); // Активируем Сериал порт } void loop() { float humidity = analogRead(H_DATA); // Получаем значение с пина humidity = (1.0 - humidity / 102300.0) * 100.0; // Конвертируем полученное значение в проценты Serial.println(String(humidity, 2)+" %"); // Выводим в сериал порт delay(1000); // Ждем секунду и повторяем все заново } На монитор сами выведите, раз цифры уже получилось вывести
Но это не точные показания будут. Я циклом брал 100 показаний за секунду и их усреднял. Это во-первых, а во-вторых включал на эту секунду датчик с помощью реле, а все остальное время он был обесточен, так как он может быстро окислиться и выйти из строя
Окей, я понял основной посыл, тогда позвольте задать еще один вопрос. Вопрос №2 Мне следует подключить датчик влажности через силовой ключ - чтобы я мог подавать на него питание раз в 5-10 минут (чтобы датчик прожил как можно дольше)? Как это сделать, если отверстие 5V занято силовым ключом для помпы? Следует использовать breadboard?
Паяльник, это хорошо, но на этапе создания первого прототипа - хочу обойтись без него. В дальнейшем он, безусловно, понадобиться. И тем не менее - ответье, пожалуйста на мой второй вопрос, если вас не затруднит это.
Вопрос №3 Вот я подключил два силовых ключа, ключ с помпой воткнул в 4-ый, ключ для датчика воткнул в 3. Оба ключа получают питание через breadboard из отверстий шилда 5v и gnd. Как мне теперь грамотно подключить датчик влажности почвы? Питание в силовой ключ, а передачу данных - куда? Оставить там, где и была - в разъеме передачи данных (S) в A0 (Речь идет об этом шилде http://amperka.ru/product/arduino-troyka-shield )?
Код (C++): // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // даём разумное для пина, к которому подключена помпа #define POMP_PIN 4 //имя пина к которому подключен датчик почвы #define DAT_PIN 3 // даём разумное для пина, к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 600 // максимальный порог влажности почвы #define HUMIDITY_MAX 700 // интервал между проверкой на полив растения #define INTERVAL 5000 // переменная для хранения показания влажности почвы unsigned int humidity = 0; // статическая переменная для хранения времени unsigned long waitTime = 0; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // выводим 0 на дисплей qd.displayInt(0); } void loop(void) { //даем питание на силовой ключ датчика почвы digitalWrite(DAT_PIN, HIGH); // считываем текущее показания датчика влажности почвы int humidityNow = analogRead(HUMIDITY_PIN); // если показания текущей влажности почвы // не равняется предыдущему запросу if(humidityNow != humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt(humidityNow); //отключаем питание датчика почвы digitalWrite(DAT_PIN, LOW); } // если прошёл заданный интервал времени // и значения датчика влажности меньше допустимой границы if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 2 секунды delay(2000); // выключаем помпу digitalWrite(POMP_PIN, LOW); // приравниваем переменной waitTime // значение текущего времени плюс 3 минуты waitTime = millis(); } } Вот я попробовал сделать так, как описал выше - но красный огонек на силовом ключе от датчика почвы не загорается, где я ошибся? Сам код я взял готовый отсюда: http://wiki.amperka.ru/projects:irrigator
Может проблема в том, что я не поставил туда задержку? А в какое место ее надо ставить? Успеет ли датчик собрать показания?
UPD: Дал задержку в 2 секунды, теперь датчик все красиво считывает и все работает, хотя силовой ключ датчика не горит. Вопрос - правильно ли я воткнул задержку? Как правильно подбирать задержку? Что она вообще дает? Разве без нее команда digitalWrite(POMP_PIN, HIGH) не будет работать - пока я не скажу digitalWrite(POMP_PIN, LOW)? Код (C++): // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // даём разумное для пина, к которому подключена помпа #define POMP_PIN 4 //имя пина к которому подключен датчик почвы #define DAT_PIN 3 // даём разумное для пина, к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 600 // максимальный порог влажности почвы #define HUMIDITY_MAX 700 // интервал между проверкой на полив растения #define INTERVAL 5000 // переменная для хранения показания влажности почвы unsigned int humidity = 0; // статическая переменная для хранения времени unsigned long waitTime = 0; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // выводим 0 на дисплей qd.displayInt(0); } void loop(void) { //даем питание на силовой ключ датчика почвы digitalWrite(DAT_PIN, HIGH); //даю паузу в 2 секунды delay(2000); // считываем текущее показания датчика влажности почвы int humidityNow = analogRead(HUMIDITY_PIN); // если показания текущей влажности почвы // не равняется предыдущему запросу if(humidityNow != humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt(humidityNow); //отключаем питание датчика почвы digitalWrite(DAT_PIN, LOW); } // если прошёл заданный интервал времени // и значения датчика влажности меньше допустимой границы if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 2 секунды delay(2000); // выключаем помпу digitalWrite(POMP_PIN, LOW); // приравниваем переменной waitTime // значение текущего времени плюс 3 минуты waitTime = millis(); } }
У вас получилось так. Подали питание на датчик, подождали 2 сек. ничего не делая. Считали показания, отключили. Поставьте не 2000, а 500. Этого хватит. Либо, если хотите уж 2 сек. ждать то через millis().
Только у вас включается датчик в каждом цикле loop. Смысл так делать? Можно в конце loop поставить delay(INTERVAL);, а проверку на интервал Код (C++): (waitTime == 0 || millis() - waitTime > INTERVAL) && убрать. И этот кусок тоже Код (C++): waitTime = millis(); . Тогда получится, что при включении платы включится ключ, подождет 0.5 сек, снимет показания и выключится, если влажность низкая, то польет 2 сек., и будет ждать 5 сек., потом снова