С ардуино имею дело вторую неделю.. есть задача сделать авто теплицу с полной автоматизацией полива, освещения и поддержанием микроклимата. Были приобретены (жалею что не оригинал): Мега 2560 с СН340, TFT 2.4 9328, датчики DHT11, модуль на 8 реле, ESP8266-07 и модуль влажности почвы. С горем пополам и танцами с бубном получилось подключить и запустить дисплей. Собрал по кускам код из примеров и форумов... но мозгов хватило только на вывод данных на экран и управления релюшками... а надо еще чтоб параметры с сенсора регулировались(время включения света, время полива, режим полива и т.д.) и вывести все это на сервер(ну или хз как еще получать данные через вайфай модуль).
Код (C++): #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #include <stdio.h> #include <SPFD5408_Adafruit_GFX.h> #include <SPFD5408_Adafruit_TFTLCD.h> #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 #define LCD_RESET A4 #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF //Бирюзовый #define MAGENTA 0xF81F //Сиреневый #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define DHTPIN 53 // DHT11 data pin #define DHTTYPE DHT11 Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; // инициализация реле и выводов int Relay_1 = 28; int Relay_2 = 29; int Relay_3 = 26; int Relay_4 = 27; int Relay_5 = 24; int Relay_6 = 25; int Relay_7 = 22; int Relay_8 = 23; void setup() { dht.begin(); sensor_t sensor; dht.temperature().getSensor(&sensor); dht.humidity().getSensor(&sensor); delayMS = sensor.min_delay / 1000; { tft.reset(); pinMode(13, OUTPUT); tft.begin(0x9328); tft.fillScreen(BLACK); tft.setRotation(1); { pinMode(Relay_1, OUTPUT); pinMode(Relay_2, OUTPUT); pinMode(Relay_3, OUTPUT); pinMode(Relay_4, OUTPUT); pinMode(Relay_5, OUTPUT); pinMode(Relay_6, OUTPUT); pinMode(Relay_7, OUTPUT); pinMode(Relay_8, OUTPUT); } } } void loop() { sensors_event_t event; dht.temperature().getEvent(&event); dht.humidity().getEvent(&event); { int mostureSensor = A15; int sensorValue = analogRead(mostureSensor); unsigned int value = sensorValue; unsigned int invValue = ~value;// инвертировали invValue=value ^ 0x3FF ; // инвертнули 10-ть битов. 0x3FF=B1111111111 unsigned int DISPLEY = invValue / 10; //вывод значения в % на дисплей { Serial.begin(9600); } if (DISPLEY >= 50) { digitalWrite(Relay_1, HIGH); } else { digitalWrite(Relay_1, LOW); }delay(1000); { digitalWrite(Relay_2, HIGH); digitalWrite(Relay_3, HIGH); digitalWrite(Relay_4, HIGH); digitalWrite(Relay_5, HIGH); digitalWrite(Relay_6, HIGH); digitalWrite(Relay_7, HIGH); digitalWrite(Relay_8, HIGH); // } { tft.drawRect(0, 0, 320, 240, YELLOW); // Прямоугольник tft.drawLine(0, 80, 320, 80, YELLOW); // Линии горизонт tft.drawLine(0, 160, 320, 160, YELLOW); // Линии горизонт // вывод данных temperature_to_lcd (event.temperature, 5); humidity_to_lcd (event.relative_humidity, 85); mosture_to_lcd (DISPLEY, 165); } } delay(2000); } // вывод данных на экран void temperature_to_lcd (float temperature, unsigned char text_position ) { sensors_event_t event; dht.temperature().getEvent(&event); { Serial.print("Temperatura = "); Serial.print(event.temperature); Serial.println(" *C"); int text_color; tft.setCursor(60, text_position); tft.setTextColor(GREEN, BLACK); tft.setTextSize(3); tft.print(utf8rus("СдлодпЯстпЯ")); tft.setTextSize(4); if (event.temperature >= 28 && event.temperature <= 30) { text_color = YELLOW; } else if (event.temperature >= 31) { text_color = RED; } else if (event.temperature < 25 && event.temperature >= 23) { text_color = MAGENTA; } else if (event.temperature < 23) { text_color = BLUE; } else { text_color = GREEN; } tft.setCursor(70, text_position + 30); fix_number_position(temperature); tft.setTextColor(text_color, BLACK); tft.print(event.temperature, 1); tft.setCursor(220, text_position + 30); tft.print("C"); tft.drawChar(205, text_position + 27, 237, text_color, BLACK, 2); //degree symbol } } //outputs humidity to LCD void humidity_to_lcd (float humidity, unsigned char text_position ) { sensors_event_t event; dht.humidity().getEvent(&event); { Serial.print("Humidity = "); Serial.print(event.relative_humidity); Serial.println(" %"); tft.setTextColor(GREEN, BLACK); tft.setCursor(80, text_position); tft.setTextSize(3); tft.println(utf8rus("БкЯемнрсы")); tft.setTextSize(4); tft.setCursor(70, text_position + 40); fix_number_position(humidity); tft.print(event.relative_humidity, 1); tft.print(" %"); } } void mosture_to_lcd (float mosture, unsigned char text_position) { Serial.print("Mosture = "); Serial.print(mosture); Serial.println(" %"); //float(DISPLEY); { tft.setTextColor(GREEN, BLACK); tft.setCursor(30, text_position); tft.setTextSize(3); tft.println(utf8rus("БкЯемнрсы онцбъ")); tft.setTextSize(4); tft.setCursor(80, text_position + 40); fix_number_position(mosture); tft.print(mosture, 1); tft.print(" % "); } } void fix_number_position(float number) { if ((number >= 0.0 ) && (number < 100)) { tft.print(" "); } } /* Recode russian fonts from UTF-8 to Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB8; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break; } } } m[0] = n; target = target + String(m); } return target; }
Теплицу вы в этом году сделать уже не успеете. Так что садитесь и спокойно изучайте программирование, делайте простые проекты. А к сентябрю, с новыми знаниями, принимайтесь за разработку теплицы. И DHT11 выкиньте в ведро, они паршивые. На форуме полно тем.
ну почему не успеет? С нуля за 2 месяца вполне реально сделать чтение влажности почвы и датчика DHT22, отображение на дисплее и клацанье реле по расписанию. А по осени уже и требования поменяются на основе эксплуатации, тогда и к остальному приступать.
Остаентся только корпус, монтаж, грабли с дерьмовыми датчиками, грабли с питанием 8 реле, и изучение сложнейшей теории регуляторов, без которой микроклимат не поддержать.
Ну я и предлагаю набраться, просто не губя времени и нервов, не работая под давлением. Не пытаться выдать готовый прибор к высадке, не получится. А спокойно поэкспериментировать в процессе лета и с датчиками, и с реле, и с общим программированием.
Я за сезоном не гонюсь... Это все скорее для себя... а теплица просто как мотивация.. так уже вроде...за неделю. мне бы еще понять как тачскрин опрашивается и как меню замутить, пробовал на примерах... но там какая то борода... все чего добился это калибровка корявая (почему-то пэинт рисует точку в сантиметре от пальца)