Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Домашняя теплица

Компоненты и расходные материалы

Arduino MKR1000
× 1
Arduino UNO
× 1
Датчик температуры DHT22
× 1
Arduino Wifi Shield 101
× 1
Android-устройство
× 1
Щит управления двигателем постоянного тока с BTN8982 для Arduino Infineon
× 1

Приложения и онлайн-сервисы

IDE Arduino
Eclipse

Об этом проекте

Обзор

Условия окружающей среды в теплице постоянно меняются, поэтому нам необходим эффективный мониторинг.

Использование автоматической системы дает множество преимуществ, например, меньше работы или, что наиболее важно, пользователи могут проверять свои собственные инвестиции из дома с помощью ПК или смартфона.

Еще одно важное преимущество - возможность хранить данные в базе данных. Это может иметь значение для получения или проигрыша денег.

Кроме того, благодаря контролю системы в реальном времени мы можем немедленно вмешаться, предотвращая проблемы для выращивания.

Автоматическая система мониторинга в теплицах состоит из датчиков, считывающих данные об окружающей среде, и исполнительных механизмов, называемых «подчиненными». Они общаются по беспроводной сети с центральным устройством, называемым «Мастер». Последний отправляет возможные изменения ведомым устройствам (например, изменение пороговых значений), а также данные через Wi-Fi на веб-сервер.

1. Как это работает?

Мы можем разделить этот проект на три части:

  • Мастер
  • Раб
  • Веб-сервер

Мы использовали Arduino / Genuino MKR1000 для ведущего устройства, Arduino / Genuino Uno для ведомого устройства.

Мастер связывается с веб-сервером через Wi-Fi (встроенный WINC1500), подчиненный регистрирует температуру и влажность с помощью датчика DHT22, а затем отправляет эти данные мастеру через Wi-Fi (экран WiFi WINC1500).

2. Мастер

Мастер находится в «режиме точки доступа» и ожидает, пока подчиненное соединение получит данные о температуре и влажности, которые разработаны и отправлены на веб-сервер.

Мастер проверяет, доступны ли данные, в этом случае он создает пакет UDP, сформированный новыми порогами и CRC. Фактически, он вычисляет CRC, который будет использоваться ведомым устройством для проверки полученной настройки.

После того, как мастер выходит из «режима точки доступа», он подключается к Wi-Fi, чтобы отправить данные на веб-сервер, где они будут отображены на графике.

3. Раб

Ведомое устройство измеряет температуру и влажность датчиком DHT22 и через 5 минут отправляет данные ведущему устройству. Он также создает пакет UDP, он подключается к мастеру, а затем отправляет данные.

Позже он ожидает, если будут доступны некоторые данные, например, новые пороговые значения. В этом случае ведомое устройство получает новые настройки и вычисляет CRC по формулам Далласа-Максима.

Впоследствии вычисленный CRC сравнивается с CRC, полученным от Мастера. Если два CRC одинаковы, ведомое устройство сохраняет новую настройку в EEPROM.

4. Веб-сервер

Веб-сервер сохраняет все данные, которые впоследствии могут быть сохранены в истории.

Для этого мы использовали сценарий PHP, который подключается к базе данных и показывает данные двумя разными способами

  • на графике с использованием другого скрипта PHP
  • в приложении для Android в формате JSON с использованием другого скрипта PHP.

5. ПРИЛОЖЕНИЕ

Приложение позволяет нам просматривать данные в базе данных.

На первом экране мы можем выбрать временной диапазон для отображения, и с помощью кнопки «ГРАФИЧЕСКИЙ» он связывается с веб-службой и получает данные.

Приложение отображает данные в графическом виде.


Код

  • Создать графику
  • Скрипт подключения к сайту
  • Создать таблицу
  • Мастер-тепличный домотик
  • Домотик-раб в теплице
  • getdati
Создать графику PHP
Мы использовали это для создания изображения
  SetScale ("textlin"); $ theme_class =new UniversalTheme; $ graph-> SetTheme ($ theme_class); $ graph-> img-> SetAntiAliasing ( false); $ graph-> title-> Set ('Title'); $ graph-> SetBox (false); $ graph-> img-> SetAntiAliasing (); $ graph-> yaxis-> HideZeroLabel (); $ graph -> yaxis-> HideLine (false); $ graph-> yaxis-> HideTicks (false, false); $ graph-> xgrid-> Show (); $ graph-> xgrid-> SetLineStyle ("solid"); $ graph-> xaxis-> SetTickLabels ($ time_axis); $ graph-> xgrid-> SetColor ('# E3E3E3'); $ graph-> xaxis-> SetLabelAngle (90); $ graph-> legend-> SetPos (0.5, 0.08, 'center', 'top'); // Создаем первую строку $ p1 =new LinePlot ($ parameter1); $ graph-> Add ($ p1); $ p1-> SetColor ("# 6495ED"); $ p1-> SetLegend ('your_parameter1'); $ graph-> yscale-> SetGrace (0); // Создаем вторую строку $ p2 =new LinePlot ($ parameter2); $ graph-> Add ($ p2); $ p2 -> SetColor ("# B22222"); $ p2-> SetLegend ('your_parameter2'); $ graph-> yscale-> SetGrace (0); $ graph-> legend-> SetFrameWeight (1); // Вывод строки $ график-> Обводка ();?> 
Скрипт подключения к сайту PHP
Мы использовали это для сохранения данных в БД
 »; эхо «параметр1». $ _GET ['параметр1']. «
»; echo «параметр2». $ _GET ['параметр2']. "
"; // Создаем соединение $ conn =mysqli_connect ($ servername, $ username, $ password, $ dbname); // Проверяем соединение if (! $ conn) {die ("Connection failed:". mysqli_connect_error () );} $ sql ="ВСТАВИТЬ В теплицу (имя, параметр1, параметр2) ЗНАЧЕНИЯ ('". $ name. "', '". $ parameter1. "', '". $ parameter2. "')"; if ( mysqli_query ($ conn, $ sql)) {echo "Новая запись успешно создана";} else {echo "Ошибка:". $ sql. «
». mysqli_error ($ conn);} mysqli_close ($ conn);?>
Создать таблицу SQL
Мы использовали этот сценарий для создания таблицы
 CREATE TABLE IF NOT EXISTS `greenhouse` (` id` int (11) NOT NULL, `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, temp float NOT NULL, `umid` float NOT NULL) ENGINE =MyISAM DEFAULT CHARSET =utf8; 
Мастер-теплица Domotic C / C ++
Это Мастер-код
 / * Проект автоматизации теплицы * // * Авторы:Антонио Ла Мура, Умберто Феста * // * Дата:03.03.2016 * // * Наша идея - разрешить пользователям, покупающим фрукты и овощи, выращенные в теплицах, чтобы точно знать все этапы выращивания продуктов, такие как использование химических удобрений и других подобных продуктов. На проданные товары будет нанесен QR-код, который будет считан конкретным приложением для смартфона. Он предоставляет информацию об условиях окружающей среды, в которой выращивались продукты, и используемых химических продуктах. Автоматическая система мониторинга в теплицах состоит из датчиков, считывающих данные об окружающей среде, и исполнительных механизмов, называемых «подчиненными». Они общаются по беспроводной сети с центральным устройством, называемым Master. Последний отправляет возможные изменения ведомым устройствам (например, изменение пороговых значений), а также данные через Wi-Fi на веб-сервер. Когда продукт будет готов к продаже, веб-сервису будет предложено создание QR-кода, и он будет помещен на упаковку. Последней частью системы является мобильное приложение, которое отвечает за сканирование QR-кодов и показывает пользователю соответствующую информацию. * // * Мастер * // * DEVO AGGIUNGERE SOLO LA PARTE CHE MI SERVE PER RICEVERE LE NUOVE SOGLIE CHE VENGONO INVIATE DALL'APP * // * Используемые библиотеки * / # include  #include  #include  #include  #include  / * Переменные для подключения * / char ssid [] ="SSID"; / * SSID вашей сети (имя) * / char pass [] ="pass"; / * Ваш сетевой пароль (используется для WPA или используется в качестве ключа для WEP) * / int keyIndex =0; / * Номер индекса вашего сетевого ключа (требуется только для WEP) * / char ssid_ap [] ="Arduino"; / * Созданное имя AP * / char pass_ap [] =""; / * (Пока не поддерживается) * / int status =WL_IDLE_STATUS; unsigned int localPort =2390; / * Локальный порт для прослушивания * / char server [] ="www.cormaz.altervista.org"; / * Имя адреса для Google (с использованием DNS) * / WiFiServer server_ap (80); WiFiClient client_ap; WiFiUDP Udp; RTCZero rtc; WiFiClient client; char packetBuffer [255]; / * Буфер для хранения входящего пакета * / char ReplyBuffer [255]; / * Строка для отправки обратно * // * Переменные для новых пороговых значений * / float humax =0; float humin =0; float tumax =0; float tumin =0; / * Работает как точка доступа (flag =false), подключает на WebServer (flag =true) * / boolean flag =false; boolean threeshold_available =false; void setup () {/ * Инициализируйте последовательный порт и дождитесь открытия порта:* / Serial.begin (9600); в то время как (! серийный) {; / * Дождитесь подключения последовательного порта. Требуется только для собственного порта USB * /} Serial.println ();} void loop () {int packetSize; двойная температура; двойной гул; int id; байт crc; String strURL; // Проверяем наличие щита:/ *************************************** ***********************************************/ если ( WiFi.status () ==WL_NO_SHIELD) {Serial.println («WiFi щит отсутствует»); / * Не продолжать:* / while (true); } / *********************************************** ************************************* / // Попытка подключиться к сети WiFi:/ * ************************************************* ********************************** / while (status! =WL_CONNECTED) {Serial.print ("Создание Сеть под названием:"); Serial.println (ssid_ap); / * Подключаемся к сети WPA / WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:* / status =WiFi.beginAP (ssid_ap); / * Подождать 10 секунд подключения:* / delay (10000); server_ap.begin (); } Serial.println («Подключен к Wi-Fi»); / ************************************************ ************************************ / // Запуск связи по UDP / ****** ************************************************* ****************************** / Udp.begin (localPort); printWifiStatus (); client_ap =server_ap.available (); if (client_ap) {/ * Если у вас есть клиент * / / * Жду информации * / Serial.println ("новый клиент"); / * Распечатать сообщение через последовательный порт * / / * Если есть данные, прочитать пакет * / packetSize =Udp.parsePacket (); if (packetSize) {Serial.print ("Размер полученного пакета"); Serial.println (размер пакета); Serial.print («От»); IP-адрес remoteIp =Udp.remoteIP (); Serial.print (удаленный IP); Serial.print (", порт"); Serial.println (Udp.remotePort ()); / * Считываем пакет в packetBuffer * / int len ​​=Udp.read (packetBuffer, 255); если (len> 0) packetBuffer [len] =0; Serial.println ("Содержание:"); Serial.println (packetBuffer); char * command =strtok ((char *) packetBuffer, ";"); int count =0; while (command! =0) {/ * Разделить информацию * / switch (count) {case 0:id =atoi (command); ломать; случай 1:temp =atof (команда) / 10; ломать; случай 2:hum =atof (команда) / 10; ломать; } command =strtok (0, ";"); count ++; } Serial.print («Пакет получен от»); Serial.print (id); Serial.print ("T:"); Serial.print (темп, 1); Serial.print ("H:"); Serial.println (гул, 1); / ************************************************ ************************************ / задержка (20); / * Вычисляем CRC-8, поэтому создаем массив байтов * / / ********************************** ******************************************* / байт bhmax =( байт) humax; byte bhmin =(байт) humin; байт btmax =(байт) tumax; byte btmin =(байт) tumin; byte crc32_str [4] ={bhmax, bhmin, btmax, btmin}; crc =CRC8 (crc32_str); Serial.println ("CRC:"); Serial.println (crc); / ************************************************ ****************************** / if (threeshold_available ==true) {snprintf (ReplyBuffer, sizeof (ReplyBuffer), " % d;% d;% d;% d;% d;% d ", id, (int) humax, (int) humin, (int) tumax, (int) tumin, (int) crc); / * Отправляем ответ на IP-адрес и порт, которые отправили нам полученный пакет * / Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (ReplyBuffer); Udp.endPacket (); }} / * Распечатать его на мониторе последовательного порта * / / * Закрыть соединение:* / client_ap.stop (); Serial.println («клиент отключен»); flag =true; } / * Точная точка доступа * / / ***************************************** ************************************* / / * Подключение к серверу и отправка данных в базу данных * / / ********************************************* ******************************** / if (flag ==true) {/ * Попытка подключиться к сети Wi-Fi :* / while (status! =WL_CONNECTED) {Serial.print ("Попытка подключиться к SSID:"); Serial.println (ssid); / * Подключаемся к сети WPA / WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:* / status =WiFi.begin (ssid, pass); / * Подождать 10 секунд подключения:* / delay (10000); } Serial.println («Подключен к Wi-Fi»); printWifiStatus (); strURL ="ПОЛУЧИТЬ /Ваш адрес.php?id="; strURL + =идентификатор; strURL + ="&параметр1 ="; strURL + =темп; strURL + ="&параметр2 ="; strURL + =гул; strURL + =«HTTP / 1.1»; Serial.println ("\ nНачало подключения к серверу ..."); // если вы установили соединение, сообщите через последовательный порт:if (client.connect (server, 80)) {Serial.println ("connected to server"); // Делаем HTTP-запрос:client.println (strURL); client.println («Хост:www.cormaz.altervista.org»); client.println ("Соединение:закрыть"); client.println (); client.stop (); Serial.println («Хорошо!»); } / * Если сервер отключен, остановить клиента:* / if (! Client.connected ()) {Serial.println (); Serial.println («Отключение от сервера.»); client.stop (); / * Больше ничего не делать:* / while (true); } flag =false; } / *********************************************** ******************************* /} / * Алгоритм вычисления CRC-8 - на основе формул Далласа / Максима * / байт CRC8 (константный байт * данные) {байт crc =0x00; while (* данные) {извлечение байта =* данные ++; for (byte tempI =8; tempI; tempI--) {сумма байтов =(crc ^ extract) &0x01; crc>> =1; если (сумма) {crc ^ =0x8C; } извлекать>> =1; }} return crc;} void printWifiStatus () {/ * Распечатайте SSID сети, к которой вы подключены:* / Serial.print ("SSID:"); Serial.println (WiFi.SSID ()); / * Распечатайте IP-адрес вашего WiFi-экрана:* / IPAddress ip =WiFi.localIP (); Serial.print ("IP-адрес:"); Serial.println (ip); / * Вывести мощность полученного сигнала:* / long rssi =WiFi.RSSI (); Serial.print ("мощность сигнала (RSSI):"); Серийный принт (RSSI); Serial.println ("дБм");} 
Подчиненный домотик теплицы C / C ++
Это код Slave
 / * Проект автоматизации теплицы * // * Авторы:Антонио Ла Мура, Умберто Феста * // * Дата:21.03.2016 * // * Наша идея - разрешить пользователям, покупающим фрукты и овощи, выращенные в теплицах, чтобы точно знать все этапы выращивания продуктов, такие как использование химических удобрений и других подобных продуктов. На проданные товары будет нанесен QR-код, который будет считан конкретным приложением для смартфона. Он предоставляет информацию об условиях окружающей среды, в которой выращивались продукты, и используемых химических продуктах. Автоматическая система мониторинга в теплицах состоит из датчиков, считывающих данные об окружающей среде, и исполнительных механизмов, называемых «подчиненными». Они общаются по беспроводной сети с центральным устройством, называемым Master. Последний отправляет возможные изменения ведомым устройствам (например, изменение пороговых значений), а также данные через Wi-Fi на веб-сервер. Когда продукт будет готов к продаже, веб-сервису будет предложено создание QR-кода, и он будет помещен на упаковку. Последней частью системы является мобильное приложение, которое отвечает за сканирование QR-кодов и показывает пользователю относительную информацию. * // * Slave * // * Используемые библиотеки * / # include  #include  #include  #include  #include  // Определить все PIN # define HUMIDIFIER A4 #define HEATER A5 # define DHT22_PIN 4 // Определить двигатель # определить IS_1 0 #define IS_2 1 # define IN_1 3 #define IN_2 11 #define INH_1 12 # define INH_2 13 #define TCONST 100 // Время задержки между шагами // Переменная для сброса millis () extern unsigned long timer0_millis; int status =WL_IDLE_STATUS; char ssid [] ="Ардуино"; // SSID вашей сети (имя) char pass [] =""; // ваш сетевой пароль (используйте для WPA или используйте как ключ для WEP) int keyIndex =0; // номер индекса вашего сетевого ключа (необходим только для WEP) unsigned int localPort =2390; // локальный порт для прослушивания пакета onchar packetBuffer [255]; // буфер для хранения входящего пакета WiFiUDP Udp; // Define DHT22DHT22 myDHT22 (DHT22_PIN); // Переменная для sendfloat hmin =0; float hmax =0; float tmin =0; float tmax =0; int duty_motor =0; float влажность; float temperature; // Переменная для отправки каждые 10 секундunsigned long interval =600000; void setup () {Serial.begin (9600); в то время как (! серийный) {; // ждем подключения последовательного порта. Требуется только для собственного порта USB} // Инициализировать PIN-код (INPUT - OUTPUT) pinMode (HEATER, OUTPUT); digitalWrite (НАГРЕВАТЕЛЬ, НИЗКИЙ); pinMode (УВЛАЖНИТЕЛЬ, ВЫХОД); digitalWrite (УВЛАЖНИТЕЛЬ, НИЗКИЙ); // Устанавливаем ПИН-код вентилятора pinMode (IN_1, OUTPUT); pinMode (IN_2, ВЫХОД); pinMode (INH_1, ВЫХОД); pinMode (INH_2, ВЫХОД); // Сбросить reset_ports (); digitalWrite (INH_1, 1); digitalWrite (INH_2, 1); Serial.println («Начало ...»); delay (2000);} void loop () {// если есть данные, читать пакет int packetSize =Udp.parsePacket (); беззнаковое долгое время =millis (); беззнаковый длинный currentMillis =millis (); DHT22_ERROR_t errorCode; int я =0; char name [] ="clie1"; влажность =myDHT22.getHumidity () * 10; температура =myDHT22.getTemperatureC () * 10; char toSend [32]; errorCode =myDHT22.readData (); байт crc; int crc_ric; // Проверка датчика влажности и температуры Ошибки DHT22 / *************************************** *************************************** / переключатель (errorCode) {case DHT_ERROR_NONE:char buf [128]; sprintf (buf, "Только целочисленное чтение:Температура% hi.% 01hi C, Влажность% i.% 01i %% RH", myDHT22.getTemperatureCInt () / 10, abs (myDHT22.getTemperatureCInt ()% 10), myDHT22. getHumidityInt () / 10, myDHT22.getHumidityInt ()% 10); ломать; case DHT_ERROR_CHECKSUM:перерыв; case DHT_BUS_HUNG:перерыв; case DHT_ERROR_NOT_PRESENT:перерыв; case DHT_ERROR_ACK_TOO_LONG:break; case DHT_ERROR_SYNC_TIMEOUT:перерыв; case DHT_ERROR_DATA_TIMEOUT:перерыв; case DHT_ERROR_TOOQUICK:перерыв; } / *********************************************** ******************************* / // Распечатать значения при их изменении / ******* ************************************************* *********************** / if (влажность! =myDHT22.getHumidity () * 10 || температура! =myDHT22.getTemperatureC () * 10) { Serial.print ("T:"); Serial.print (myDHT22.getTemperaC (), 1); Serial.print ("C"); Serial.print ("H:"); Serial.print (myDHT22.getHumidity (), 1); Serial.println ("%"); } / *********************************************** ******************************* / // Отправлять параметры каждые 10 минут / ******** ************************************************* ********************** / if (millis ()> interval) {// Подключение к AP / ************ ************************************************* ****************** / // проверяем наличие экрана:if (WiFi.status () ==WL_NO_SHIELD) {Serial.println ("WiFi Shield отсутствует "); // не продолжать:while (true); } // пытаемся подключиться к сети Wi-Fi:while (status! =WL_CONNECTED) {Serial.print ("Попытка подключиться к SSID:"); Serial.println (ssid); // Подключаемся к сети WPA / WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:status =WiFi.begin (ssid); // ждем 10 секунд подключения:delay (10000); } Serial.println («Подключен к Wi-Fi»); / ************************************************ ****************************** / Serial.println ("\ nНачало подключения к серверу ..."); // если вы установили соединение, сообщите через последовательный порт:Udp.begin (localPort); snprintf (toSend, sizeof (toSend), «% s;% d;% d», имя, (int) влажность, (int) температура); // отправляем ответ на IP-адрес и порт, которые отправили нам полученный пакет Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (отправить); Udp.endPacket (); Serial.println («Отправка завершена»); resetMillis (); а (миллис () <10000) {размер пакета =Udp.parsePacket (); if (packetSize) {/ * Прочитать пакет в packetBuffer * / int len ​​=Udp.read (packetBuffer, 255); если (len> 0) packetBuffer [len] =0; Serial.println ("Содержание:"); Serial.println (packetBuffer); char * command =strtok ((char *) packetBuffer, ";"); int count =0; while (command! =0) {/ * Разделить информацию * / switch (count) {case 0:snprintf (name, sizeof (name), "% s", command); ломать; случай 1:hmax =atof (команда) / 10; // atof (char *) mi конвертирует un tipo char * в двойной разрыв; случай 2:hmin =atof (команда) / 10; ломать; случай 3:tmax =atof (команда) / 10; ломать; случай 4:tmin =atof (команда) / 10; ломать; case 5:crc_ric =atoi (команда); ломать; } command =strtok (0, ";"); count ++; } Serial.print ("Ответ:"); Serial.print (имя); Serial.print (";"); Серийный принт (hmax, 1); Serial.print (";"); Serial.print (hmin, 1); Serial.print (";"); Серийный отпечаток (tmax, 1); Serial.print (";"); Serial.println (tmin, 1); Serial.print ("Получена CRC:"); Serial.println (crc_ric); // вычисляем CRC-8, и я получаю массив байтов / *********************************** ******************************************* / байт bhmax =(байт ) hmax; байт bhmin =(байт) hmin; байт btmax =(байт) tmax; byte btmin =(байт) tmin; byte crc32_str [4] ={bhmax, bhmin, btmax, btmin}; crc =CRC8 (crc32_str); Serial.println ("CRC:"); Serial.println (crc); / ************************************************ ****************************** / if (crc_ric ==(int) crc) {// Сохраняем в EEPROM EEPROM_writeDouble (0, tmax); EEPROM_writeDouble (4, tmin); EEPROM_writeInt (8, hmax); EEPROM_writeInt (10, чмин); }}} задержка (10); } / *********************************************** ******************************* / WiFi.disconnect (); // Управление УВЛАЖНИТЕЛЕМ, НАГРЕВАТЕЛЕМ и вентилятором в соответствии с показаниями датчика / ********************************* ************************************************* * / // НАГРЕВАТЕЛЬ if (myDHT22.getTemperatureC ()> =tmax) {digitalWrite (НАГРЕВАТЕЛЬ, ВЫСОКИЙ); } если (myDHT22.getTemperatureC () <=tmin + 1) {digitalWrite (НАГРЕВАТЕЛЬ, НИЗКИЙ); } // УВЛАЖНИТЕЛЬ if ((int) myDHT22.getHumidity ()> =hmax) {digitalWrite (УВЛАЖНИТЕЛЬ, ВЫСОКИЙ); } если ((int) myDHT22.getHumidity () <=hmin + 1) {digitalWrite (УВЛАЖНИТЕЛЬ, НИЗКИЙ); } // Вентилятор, бесщеточный двигатель if (myDHT22.getTemperatureC ()> =tmax + 4) {// Вращение двигателя в соответствии с температурой, режим работы -> 0 за t =tmax + 4 и режим работы -> 100 за t> tmax + 10 // Rotazione del motore al variare della temperatura, duty -> 0 per t =tmax + 4 e duty -> 100 per t> tmax + 10 duty_motor =map (i, tmax + 4, tmax + 10, 0, 100); если (tmax> tmax + 10) {duty_motor =100; } analogWrite (IN_2, дежурный_ двигатель); задержка (TCONST); } если (myDHT22.getTemperatureC () <=(tmax + tmin) / 2) {reset_ports (); // Вращение двигателя в соответствии с температурой, режим -> 0 за t =tmax + 4 и режим -> 255 за t> tmax + 10 duty_motor =0; analogWrite (IN_2, дежурный_ двигатель); задержка (TCONST); } / *********************************************** ************************************ / delay (1000);} // Сохраняем двойное в EEPROMvoid EEPROM_writeDouble (int ee, double value) {byte * p =(byte *) (void *) &value; for (int i =0; i > =1; если (сумма) {crc ^ =0x8C; } извлекать>> =1; }} return crc;} // Используется для сброса millis () void resetMillis () {cli (); timer0_millis =0; sei ();} 
getdati PHP
Мы использовали это для подключения нашего приложения к базе данных
 »; // выбрать базу данных для работать с $ selected =mysql_select_db ("serra", $ dbhandle) или die ("Не удалось выбрать примеры"); $ datada =$ _GET ["datada"]; $ dataa =$ _GET ["dataa"]; // выполнить запрос SQL и вернуть записи $ result =mysql_query ("ВЫБРАТЬ гудение, темп, дату ИЗ записи WHERE date> =' ". $ datada." 'and date <=' ". $ dataa." '"); $ records =array (); // получаем данные из базы данных while ($ row =mysql_fetch_array ($ result)) {$ tmp =array ("hum" => $ row {'hum'}, "temp" => $ row {'temp'}, "date" => $ row {'date'}); array_push ($ records, $ tmp); // echo "HUM:". $ row {'hum'}. "TEMP:". $ row {'temp'}. "Date:". // отображаем результаты $ row {'date'}. "
";} echo json_encode ($ records); // закрываем соединение mysql_close ($ dbhandle);?>
Приложение GrenHouse
На первой странице вы должны установить дату с помощью двух DatePicker. Когда вы нажимаете кнопку «GRAPHIC», он выполняет HTTP-вызов GET для PHP-скрипта «getdati», отправляя параметры и дату, которые вы выбрали. Затем он получает JSON и декодирует его, после чего создает графику с помощью библиотеки GraphViewhttps://github.com/cormaz/app_greenhouse.git

Схема

Подключение:Arduino UNO - DHT22 - реле

Производственный процесс

  1. Растровая анимация на сенсорном экране TFT ILI9341
  2. Веб-контроллер DMX
  3. Arduino Spybot
  4. FlickMote
  5. Самодельный телевизор B-Gone
  6. Основные часы
  7. HSVClock
  8. Игрушка под управлением Android с использованием Raspberry Motor Shield
  9. Найди меня
  10. Arduino Power