Здравствуйте пользователи этого интересного форума . Ардуино и датчики получил неделю назад ,программирование только начал осваивать . Предлагаю к вашему вниманию свой проект (первые зачатки умной теплицы ).. Скетчи в этом проекте были собраны с нескольких форумов и доработаны методом подбора (тыка ) мною . Хотел бы посоветоваться с знающими участниками что в нем лишнее или неправильно .Вся система работает всё функционирует ,но взгляд профи будет интересен .На данный момент не включен дисплей (не хватает 3 провода ,они пошли на фоторезистор )он показывает темп и влажность и в дальнейшем будет заменен датчик DHT11 на DHT22,переделаны датчики влажности почвы (слишком быстро окисляются) Принцип работы 1 )датчик влажности включается и делает замеры .2) Согласно замерам плата ардуино включает светодиод (красн-сухо,желтый - влажно ,зеленый- норма )3) При включении красн светодиода (пин 2 в скетче) включается и реле в который подключен насос с омывателя автомобиля (12V). 4 ) Выводится темп и влажность в помещении на дисплей . 5 ) Фотореле при затемнении включает второе реле где подключены 3 фито лампы (220V). Представляю скетч на ваш суд . Код (C++): int sensorPin = A2; // устанавливаем входную ногу для АЦП unsigned int sensorValue = 0; // цифровое значение фоторезистора int diodBlue=7; int diodRed=2; int diodGreen=4; int sensor=8; // питание датчика подключить к пину 8 #include <Wire.h> // Добавляем необходимые библиотеки #include <LiquidCrystal_I2C.h> #include "DHT.h" #define DHTPIN A1 // пин для сигнала поступающего с датчика //выбор используемого датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) //инициализация датчика DHT dht(DHTPIN, DHTTYPE); byte degree[8] = // кодируем символ градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея void setup() { Serial.begin(9600); pinMode(diodBlue,OUTPUT); pinMode(diodGreen,OUTPUT); pinMode(diodRed,OUTPUT); pinMode(sensor,OUTPUT); digitalWrite(sensor, HIGH); pinMode(12, OUTPUT); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(1, degree); // Создаем символ под номером 1 Serial.begin(9600); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(2000); // 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(); // Read temperature as Celsius float t = dht.readTemperature(); // Read temperature as Fahrenheit float f = dht.readTemperature(true); // Выводим показания влажности и температуры lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Hum = % "); // Выводим текст lcd.setCursor(7, 0); // Устанавливаем курсор на 7 символ lcd.print(h, 1); // Выводим на экран значение влажности lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("Temp = \1C "); // Выводим текст, \1 - значок градуса lcd.setCursor(7, 1); // Устанавливаем курсор на 7 символ lcd.print(t,1); // Выводим значение температуры Serial.println(analogRead(0)); digitalWrite(sensor, HIGH); delay(2000); // время за котор digitalWrite(sensor, LOW); if (analogRead(0) <= 600) { Serial.print("Ochen Vlagno ");// Очень влажная почва digitalWrite(diodBlue, HIGH); //Включаем синий диод на 2 сек delay(3000); digitalWrite(diodBlue, LOW); digitalWrite(diodGreen, LOW); digitalWrite(diodRed, LOW); } else if( analogRead(0)>600 && analogRead(0)<800) { Serial.print("Vlagnaya pochva ");// Влажная почва digitalWrite(diodGreen,HIGH);//Включаем зелёный диод на 2 сек delay(3000); digitalWrite(diodGreen,LOW); digitalWrite(diodBlue, LOW); digitalWrite(diodRed, LOW); } else { Serial.print("Suhays pochva ");// Сухая почва digitalWrite(diodRed,HIGH);//Включаем красный диод на 2 сек delay(4000); digitalWrite(diodRed,LOW); digitalWrite(diodBlue, LOW); digitalWrite(diodGreen, LOW); } { sensorValue = analogRead(sensorPin); // считываем значение с фоторезистора if(sensorValue<500) digitalWrite(12, HIGH); // включаем else digitalWrite(12, LOW); // выключаем } }
да ладно, еще полно свободных пинов. А на проводки удобно раздербанить витую пару серого цвета - там жилки идеальные по диаметру, цвету и жесткости. Чтобы датчики меньше окислялись, на них надо подавать напряжение только на время измерения, плюс лучше использовать "симуляцию" переменного напряжения (нужно два пина): при четных измерениях подаем на два пина HIGH и LOW, при нечетных - LOW и HIGH. Все остальное время - LOW и LOW. Этого в коде не обнаружено Если реле тупо подключено параллельно светодиоду, удобнее разделить - тогда можно будет включать их на разное время (например, моргать красным). Немного правил "джентельменского кода": Старайся не использовать int для определения пинов - это избыточно. Или const byte или #define В коде нежелательно использовать конкретные числовые значения - их все надо выносить в самое начало, т.е.: digitalWrite(12, HIGH) - это допустимо по синтаксису, но недружелюбно (analogRead(0)<=600) - это дважды плохо. Через полгода не вспомнишь что подключено к (0) и почему 600. analogRead(0)>600&& analogRead(0)<800) Код удобнее разделить на блоки (функции), тогда одним движением можно при отладке отключить ненужное, не затрагивая остальное. Повторяющиеся куски кода тоже удобно закинуть в отдельный блок - и править придется в одном месте и визуально код читать проще. Ну и готовые функции затем можно быстро переносить в другие проекты Код (C++): #define SENSOR_PIN A0 // влажность почвы #define DHT_PIN A1 // пин для сигнала с датчика DHT #define LUMI_PIN A2 // фоторезистор #define SENSOR_PWR 8 // питание датчика DHT #define LED_BLUE 7 #define LED_RED 2 #define LED_GREEN 4 #define RELAY_FITO_LEDS 12 const unsigned int soilMin = 600; const unsigned int soilMax = 800; const unsigned int lumiMin = 500; #include <Wire.h> // Добавляем необходимые библиотеки #include <LiquidCrystal_I2C.h> #include "DHT.h" //выбор используемого датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) unsigned int soilValue; // значение влажности почвы unsigned int lumiValue; // значение с фоторезистора float h; float t; float f; //инициализация датчика DHT dht(DHT_PIN, DHTTYPE); byte degree[8] = // кодируем символ градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаем адрес и размерность дисплея void setup() { Serial.begin(9600); pinMode(LED_BLUE, OUTPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_RED, OUTPUT); pinMode(SENSOR_PWR, OUTPUT); digitalWrite(SENSOR_PWR, HIGH); // <-- не нужно, оно и так в loop есть pinMode(RELAY_FITO_LEDS, OUTPUT); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(1, degree); // Создаем символ под номером 1 Serial.begin(9600); dht.begin(); } // setup void loop() { readSensors(); displayData2LCD(); displayData2Serial(); checkValues(); delay(2000); // Wait a few seconds between next measurements. } // loop void readSensors() { // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) h = dht.readHumidity(); // Read temperature as Celsius t = dht.readTemperature(); // Read temperature as Fahrenheit f = dht.readTemperature(true); // <-- зачем, если нигде не используется? digitalWrite(SENSOR_PWR, HIGH); delay(100); // время для стабилизации АЦП soilValue = analogRead(SENSOR_PIN); digitalWrite(SENSOR_PWR, LOW); lumiValue = analogRead(LUMI_PIN); // считываем значение с фоторезистора } // readSensors void displayData2LCD() { static byte nextScreen; // Выводим показания на дисплей, чередуя экраны if (nextScreen == 0) { lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Humi: % "); // Выводим текст lcd.setCursor(5, 0); // Устанавливаем курсор на 7 символ lcd.print(h, 1); // Выводим на экран значение влажности lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("Temp: \1C "); // Выводим текст, \1 - значок градуса lcd.setCursor(5, 1); // Устанавливаем курсор на 7 символ lcd.print(t, 1); // Выводим значение температуры } else if (nextScreen == 1) { lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Soil: "); // Выводим текст lcd.setCursor(5, 0); // Устанавливаем курсор на 7 символ lcd.print(soilValue, 1); // Выводим значение влажности почвы lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("Lumi: "); // Выводим текст lcd.setCursor(5, 1); // Устанавливаем курсор на 7 символ lcd.print(lumiValue, 1); // Выводим значение освещенности } nextScreen++; if (nextScreen > 1) nextScreen = 0; } // displayData2LCD void displayData2Serial() { // Выводим показания в Serial Serial.print("Humi: "); Serial.print(h); Serial.print("\tTemp: "); Serial.print(t); Serial.print("C\tSoil: "); Serial.print(soilValue); Serial.print("\tLumi: "); Serial.println(lumiValue); } // displayData2Serial void checkValues() { if (analogRead(SENSOR_PIN) <= soilMin) { Serial.print("Ochen Vlagno ");// Очень влажная почва digitalWrite(LED_BLUE, HIGH); //Включаем синий диод на 2 сек delay(3000); ledsOff(); } else if ( analogRead(SENSOR_PIN) > soilMin && analogRead(SENSOR_PIN) < soilMax) { Serial.print("Vlagnaya pochva ");// Влажная почва digitalWrite(LED_GREEN, HIGH); //Включаем зелёный диод на 2 сек delay(3000); ledsOff(); } else { Serial.print("Suhays pochva ");// Сухая почва digitalWrite(LED_RED, HIGH); //Включаем красный диод на 2 сек delay(4000); ledsOff(); } if (lumiValue < lumiMin) digitalWrite(RELAY_FITO_LEDS, HIGH); // включаем else digitalWrite(RELAY_FITO_LEDS, LOW); // выключаем } // checkValues void ledsOff() { digitalWrite(LED_BLUE, LOW); digitalWrite(LED_GREEN, LOW); digitalWrite(LED_RED, LOW); }
DHT22 почти такая же гадость как и DHT11. Датчики влажности почвы, чтобы не окислялись слишком быстро, должны включаться один раз на мгновение перед замером, результат записываться в переменную и уже она обрабатываться. И замеры не должны быть слишком частыми, хотя зависит от размеров горшка конечно, какой то можно и за пару секунд залить. В реальной же теплице достаточен один замер в несколько минут.
Не так уж они плохи, например у меня, работает пара штук на улице с лета 14 года. Ну и потом, говорите "А" - скажите и "Б" Альтернативный вариант, раз уж вы противник DHTшек. Вот напрмер Si7021.
Спасибо всем кто откликнулся на мой пост . Как я уже говорил что это мой первый проект и вообще первое знакомство с ардуино поэтому в скетче такое безобразие ).1)По поводу проводков то дома на этот момент самый тонкий провод был ПВС 2х1.5 а его применять не охота было ,поэтому я брал проводки с дисплея .Реле на включение насоса лежало отдельно т.к проверил что оно срабатывает и убрал (провода опять же нужны были ).За идею витой пары спасибо (сегодня поищу ,хотя заказал уже штатные ).2)Реле полива будет подцеплено именно к крас светодиоду т.к горшок не большого объёма и задействовать ему еще одну ногу будет жирно ) ,да и всё это работать будет на Nano 3 .0 . В дальнейшем когда 2 проект переедет на полив газона в доме с 4 секторами то уже будет отдельно (газон большой площади с 4 переделанными датчиками ). 3)По поводу датчика темп то датчик ДНТ 11 очень сильно завирает (да и читал что ДНТ 22 поточнее будет .вообще лучше подключу DS18b20 в корпусе (как придет ). 4 ) По поводу опроса датчика влажности я с вами согласен что частый опрос быстрее убивает его (но в малом горшке и с подключенным реле к красн светодиоду это необходимость ) для газона будет изменен скетч .Для дальнейшего приходится учить программирование в нуля т.к я не разу не сталкивался с подобным (мне кажется что в таких проектах быстрее начнешь понимать что есть что )ну мне лично так легче ). Еще раз всем спасибо за рекомендации и критику буду стараться все учесть в дальнейшем )
Вам повезло. У меня их сдохло штук 5 и я на них махнул рукой. Советовать альтернативу дело не брагодарное, лично мне понравился типа вот такого, но он дороже ощутимо.
Меня вот напугали жалобы на форумах на DHT22, я подсуетился и заказал другие (Si7021). Но DHTшки продолжают упорно работать По поводу вашей ссылки на датчик: он же Гога, он же Жора...... (с). SHT21, HTU21, Si7021 - примерно одинаковые клоны разных производителей. http://ru.aliexpress.com/item/NEW-H...62,searchweb201560_1,searchweb1451318400_6150
Может от условий эксплуатации DHT зависит, когда живут долго, когда дохнут быстро. Влажность, по слухам, убивает их.
Хочу отчитаться по совместной эксплуатации 2х датчиков одновременно. Датчики установлены под крышей дачного домика (деревянного), 1.DHT22 - установлен с северо-западной стороны, работает с августа 2014 года. 2.Si7021 - с юго-восточной стороны, установлен в июне 2016 года. DHT22 горазда быстрее уходит к значению 100% влажности и долго удерживает это цифру, обычно это к ночи или во время дождя, Si7021 более плавно выходит на 100% влажности и гораздо быстрее начинает снижать показания. При обычных дневных условиях, Si7021 зачастую выдает несколько более высокую влажность, но это может быть следствием того, что солнце уходит за дом примерно в 11 часов дня. https://thingspeak.com/channels/120642