Ооо! Спасибо за развернутый ответ! Буду его обдумывать. И сразу задам еще такой вопрос вам - я в сетап воткнул: Код (C++): void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // пин датчика в режим выхода pinMode(DAT_PIN, OUTPUT); // выводим AAAA на дисплей qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001); delay(2000); } Воткнул включение пина датчика в режим вывода - теперь силовой ключ моргает - правильно ли я поступил? Ведь, вроде именно так я и долежн контролировать питание датчика?
Вроде сделал все, как вы сказали. Код (C++): // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // имя пина, к которому подключена помпа #define POMP_PIN 4 //имя пина к которому подключен датчик почвы #define DAT_PIN 3 // имя пина к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 200 // максимальный порог влажности почвы #define HUMIDITY_MAX 980 // интервал между проверкой на полив растения #define INTERVAL 5000 // 5 секунд // переменная для хранения показания влажности почвы unsigned int humidity = 0; // статическая переменная для хранения времени unsigned long waitTime = 0; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // пин датчика в режим выхода pinMode(DAT_PIN, OUTPUT); // выводим AAAA на дисплей qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001); delay(2000); } 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 (humidity < HUMIDITY_MIN) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 2 секунды delay(2000); // выключаем помпу digitalWrite(POMP_PIN, LOW); //даю паузу в 5 секунд delay(INTERVAL); } } Но на деле выходит иначе - диод силового ключа горит пока я не сниму хоть какой-нибудь показатель, это странно.
Контакт плохой, или питания не хватает. Бывает такое. Попробуйте в сетапе написать digitalWrite(DAT_PIN, LOW); Если не получится, то точно контакт или питание
Правильно, у вас выключение стоит только если новое показание не равно стараму, а если равно, то датчик так и будет включен. Код (C++): digitalWrite(DAT_PIN, LOW); за скобку, которая строчкой ниже
Точно! Спасибо огромное за помощь! Теперь, вроде, все работает как и должно! Ключ загорается на 0.5 секунды - считывает значение и сразу гаснет! Код (C++): // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // имя пина, к которому подключена помпа #define POMP_PIN 4 //имя пина к которому подключен датчик почвы #define DAT_PIN 3 // имя пина к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 200 // максимальный порог влажности почвы #define HUMIDITY_MAX 980 // интервал между проверкой на полив растения #define INTERVAL 5000 // 5 секунд // переменная для хранения показания влажности почвы unsigned int humidity = 0; // статическая переменная для хранения времени unsigned long waitTime = 0; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // пин датчика в режим выхода pinMode(DAT_PIN, OUTPUT); // выводим AAAA на дисплей qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001); delay(2000); } 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 (humidity < HUMIDITY_MIN) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 2 секунды delay(2000); // выключаем помпу digitalWrite(POMP_PIN, LOW); //даю паузу в 5 секунд } delay(INTERVAL); }
Можете еще вместо строчки Код (C++): int humidityNow = analogRead(HUMIDITY_PIN); Вставить Код (C++): int humidityNow; for(int i=0; i< 100; i++) { humidityNow = analogRead(HUMIDITY_PIN); delay(10); humidityNow += humidityNow; } humidityNow /=100; Показания будут более точные. Будет за секунду 100 показаний считывать и их усреднять
Хм, тогда если опустить датчик в воду он выдает на дисплей 13 вместо 750+, как так? Да и почва уже не 200-300, а 2-3 примерно, чому так?
А вы не могли быть пояснить чуть подробнее, для чайников? UPD: Я попробовал разобрать по строкам для себя: int humidityNow; Обозначали целочисленную переменную for(int i=0; i< 100; i++) Для нее от нуля до 100 мы производим сложение { humidityNow = analogRead(HUMIDITY_PIN); Собираем 100 показаний delay(10); Ждем 10мс humidityNow += humidityNow; Складываем 100 показаний } Делим на 100 и получаем усредненное, заносим его во humidityNow humidityNow /= 100; И я все еще не понял - почему так сильно изменились числа.
Код (C++): int humidityNow(0); Статические переменные по умолчанию инициализированы 0. Автоматические переменные нужно инициализировать явно. Иначе в них может быть любой мусор.
Окей, я задал 0, но числа не изменились. Что не так? Код (C++): // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // имя пина, к которому подключен силовой ключ помпы #define POMP_PIN 4 //имя пина к которому подключен силовой ключ датчика влажности почвы #define DAT_PIN 3 // имя пина к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 350 // максимальный порог влажности почвы #define HUMIDITY_MAX 600 // переменная для хранения показания влажности почвы unsigned int humidity = 0; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // пин датчика в режим выхода pinMode(DAT_PIN, OUTPUT); // выводим AAAA на дисплей qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001); delay(2000); } void loop(void) { //даем питание на силовой ключ датчика почвы digitalWrite(DAT_PIN, HIGH); // считываем текущее показания датчика влажности почвы int humidityNow(0); for(int i=0; i< 100; i++) { humidityNow = analogRead(HUMIDITY_PIN); delay(10); humidityNow += humidityNow; } humidityNow /=100; // если показания текущей влажности почвы // не равняется предыдущему запросу if(humidityNow != humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt(humidityNow); } //отключаем питание датчика почвы digitalWrite(DAT_PIN, LOW); // если значение датчика влажности меньше допустимой границы if (humidity < HUMIDITY_MIN) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 3 секунды delay(3000); // выключаем помпу digitalWrite(POMP_PIN, LOW); //даю паузу в 5 секунд } //задержка в 5 секунд - потом цикл по новой delay(5000); }
Тут ошибка. Код (C++): for(int i=0; i< 100; i++) { humidityNow = analogRead(HUMIDITY_PIN); delay(10); humidityNow += humidityNow;
Замени то на это Код (C++): for(int i=0; i< 100; i++) { delay(10); humidityNow += analogRead(HUMIDITY_PIN);
Заменил, стало еще забавней. В стакане с водой не показывает больше 67, в воздухе показывает 0. Если намочить самый кончик щупа в момент измерения - можно получить значения в духе -25 или -87 или даже -250. Код (C++): // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // имя пина, к которому подключен силовой ключ помпы #define POMP_PIN 4 //имя пина к которому подключен силовой ключ датчика влажности почвы #define DAT_PIN 3 // имя пина к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 350 // максимальный порог влажности почвы #define HUMIDITY_MAX 600 // переменная для хранения показания влажности почвы unsigned int humidity = 0; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup(void) { // начало работы с дисплеем qd.begin(); // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // пин датчика в режим выхода pinMode(DAT_PIN, OUTPUT); // выводим AAAA на дисплей qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001); delay(2000); } void loop(void) { //даем питание на силовой ключ датчика почвы digitalWrite(DAT_PIN, HIGH); // считываем текущее показания датчика влажности почвы int humidityNow(0); for(int i=0; i< 100; i++) { delay(10); humidityNow += analogRead(HUMIDITY_PIN); } humidityNow /=100; // если показания текущей влажности почвы // не равняется предыдущему запросу if(humidityNow != humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt(humidityNow); } //отключаем питание датчика почвы digitalWrite(DAT_PIN, LOW); // если значение датчика влажности меньше допустимой границы if (humidity < HUMIDITY_MIN) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 3 секунды delay(3000); // выключаем помпу digitalWrite(POMP_PIN, LOW); //даю паузу в 5 секунд } //задержка в 5 секунд - потом цикл по новой delay(5000); }
И сразу я хочу задать очередной глупый вопрос, вот я прикупил дальномер (HC-SR04) и успешно его подключил. Хоче его использовать как вещь для определения уровня воды. Прибор смотрит расстояние до воды и в зависимости от этого что-то делает. Вопрос таков, как мне загнать показание дальномера в переменную, чтобы использовать в дальнейшем? Код ниже, вопрос про датчик влажности (выше по теме) все еще остается открытым. Код (C++): // Подключаем библиотеку для работы с дальномером #include <NewPing.h> // Подключаем библиотеку для работы с дисплеем #include <QuadDisplay2.h> // Задаем имя пина, к которому подключен силовой ключ помпы #define POMP_PIN 4 // Задаем имя пина, к которому подключен силовой ключ датчика влажности почвы #define DAT_PIN 3 // Задаем имя пина, к которому подключен Триг, который посылает звук #define trig_pin 9 // Задаем имя пина, к которому подключено Эхо, принимающее звук #define echo_pin 8 // Задаем имя пина, к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // Задаем переменную минимального порога влажности почвы #define HUMIDITY_MIN 350 // Задаем переменную максимального порога влажности почвы #define HUMIDITY_MAX 600 // Задаем максимальную дистанцию, что мы хотим пингануть в сантиметрах (150 см), предел нашего модуля 400-500 см #define max_dist 150 // Создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(10); // Задаем переменнуя для хранения показания влажности почвы unsigned int humidity = 0; // NewPing setup of pins and maximum distance. NewPing sonar(trig_pin, echo_pin, max_dist); void setup(void) { // Включаем пин силового ключа помпы в режим выхода pinMode(POMP_PIN, OUTPUT); // Включаем пин силового ключа датчика влажности почвы в режим выхода pinMode(DAT_PIN, OUTPUT); // Начинаем работать с дисплеем qd.begin(); // Open serial monitor at 115200 baud to see ping results. Serial.begin(9600); // Выводим "Load" на дисплей qd.displayDigits(0b11100011, 0b11000101, 0b00000101, 0b10000101); } void loop(void) { delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. Serial.print("Ping: "); Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range) Serial.println("cm"); //даем питание на силовой ключ датчика почвы digitalWrite(DAT_PIN, HIGH); // считываем текущее показания датчика влажности почвы int humidityNow(0); for(int i=0; i< 100; i++) { delay(10); humidityNow += analogRead(HUMIDITY_PIN); } humidityNow /=100; // если показания текущей влажности почвы // не равняется предыдущему запросу if(humidityNow != humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt(humidityNow); } //отключаем питание датчика почвы digitalWrite(DAT_PIN, LOW); // если значение датчика влажности меньше допустимой границы if (humidity < HUMIDITY_MIN) { // включаем помпу digitalWrite(POMP_PIN, HIGH); // ждём 3 секунды delay(3000); // выключаем помпу digitalWrite(POMP_PIN, LOW); } //задержка в 5 секунд - потом цикл по новой delay(5000); }
наверное датчик влажности почвы должен находится в почве. тела, которые касаются датчика, но не замыкают контакты могут создавать электрические наводки и нарушать работу датчика.