Оглавление:
- Шаг 1. Подключите датчики
- Шаг 2: Код
- Шаг 3: Ibm Cloud
- Шаг 4: Узел-КРАСНЫЙ
- Шаг 5: Настройка Node-RED: свет
- Шаг 6: Настройка Node-RED: Температура
- Шаг 7: Настройка Node-RED: влажность
- Шаг 8: Настройка Node-RED: влажность
- Шаг 9: Готово
Видео: PInt @ t10n: Интеллектуальная система мониторинга предприятия: 9 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:52
PI @ nt @ t10n
Этот проект создавался как тест для облака ibm iot. Мы используем esp-8266 для отправки и получения данных в облако ibm и из него. Связь между esp и облаком ibm осуществляется через MQTT.
Для обработки всех данных и предоставления пользователю пользовательского интерфейса мы используем красный узел. Это очень удобно для новичков.
Для начала вам потребуется:
- Esp-8266
- dht 11/22 датчик температуры / влажности
- светочувствительный диод (измерение света)
- зуммер
- датчик влажности почвы
- облачная учетная запись ibm
Шаг 1. Подключите датчики
Как мы упоминали ранее, мы собираемся использовать esp8266 для чтения и отправки данных датчика. В этом уроке мы предполагаем, что вы знаете, как подключить датчики к микроконтроллеру. Вам также уже нужно знать, как загружать код в esp8266.
Наша модель esp имеет только один аналоговый порт, поэтому мы решили получать аналоговую информацию от нашего светового датчика, потому что тогда мы можем отслеживать, сколько света получает растение.
Все остальные датчики подключаются цифровым способом. Наш датчик DHT11 отправляет данные в цифровом виде, и мы используем библиотеку dht для интерпретации данных датчиков.
Выше вы можете найти схему используемых нами датчиков. Но имейте в виду, что датчики, которые мы использовали, часто поставляются с модулем, поэтому вы можете легко подключить его к микроконтроллеру без дополнительных резисторов, которые мы включили в схему.
Шаг 2: Код
Это скетч Arduino, который мы использовали. Вы можете узнать о том, как работает код, если прочитаете комментарии.
#include ArduinoJson.h # include DHT_U.h #include DHT.h #include ESP8266WiFi.h #include ESP8266WiFiMulti.h #include PubSubClient.h
#define STASSID "ucll-projectweek-IoT" #define STAPSK "Foo4aiHa" #define DHTPin 5 #define WaterPin 4 #define DHTType DHT11 DHT dht (DHTPin, DHTType); ESP8266WiFiMulti WiFiMulti; температура поплавка = 0; влажность поплавка = 0; логическая влажность = ложь; int light = 0; const char * ssid = STASSID; const char * пароль = STAPSK; const char * mqtt_server = "cmfwqk.messaging.internetofthings.ibmcloud.com"; WiFiClient espClient; Клиент PubSubClient (espClient); long lastMsg = 0; char msg [50]; значение int = 0; #define MQTT_HOST "cmfwqk.messaging.internetofthings.ibmcloud.com" #define MQTT_PORT 1883 #define MQTT_DEVICEID "d: cmfwqk: ESP8266: ESP" #define MQTT_USER "#define MQTT_USER" #dec_TOc_OPEN "#dec_token_OPENQ" #dec_token_OPENQ "#dec_token_OPENQ" #dec_token_OPENQ "#dec_ToCo1_MINQ" #dec_ToCoN "#dec_Toc_Open" #dec_ToCoN " iot-2 / evt / status / fmt / json "#define MQTT_TOPIC_DISPLAY" iot-2 / cmd / update / fmt / json "#include" pitches.h "// ноты в мелодии: // длительность нот: 4 = четверть примечание, 8 = восьмая нота и т.д.: int shortTone = 80; int longTone = 200; int standardDelay = 50; int delayBetweenBars = 50; void setup_wifi () {задержка (10); // Начнем с подключения к сети Wi-Fi Serial.println (); Serial.print («Подключение к»); Serial.println (ssid); WiFi.begin (ssid, пароль); в то время как (WiFi.status ()! = WL_CONNECTED) {задержка (500); Serial.print ("."); } Serial.println (""); Serial.println («WiFi подключен»); Serial.println ("IP-адрес:"); Serial.println (WiFi.localIP ()); } void callback (char * topic, byte * payload, unsigned int length) {Serial.print ("Сообщение прибыло ["); Serial.print (тема); Serial.print ("]"); for (int i = 0; i <length; i ++) {Serial.print ((char) payload ); } Serial.println (); StaticJsonDocument jsonBuffer; deserializeJson (jsonBuffer, полезная нагрузка); JsonObject root = jsonBuffer.as (); если (корень ["песня"] == "даруде") {даруде (); } если (корень ["песня"] == "звездные войны") {звездные войны (); } if (root ["song"] == "jacques") {Serial.println ("jakakakakakkakaka"); жак (); }} void reconnect () {// Цикл до тех пор, пока мы не восстановим соединение while (! client.connected ()) {Serial.print ("Попытка соединения MQTT…"); // Попытка подключиться if (client.connect (MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) {Serial.println ("connected"); client.subscribe (MQTT_TOPIC_DISPLAY); } else {Serial.print ("не удалось, rc ="); Serial.print (client.state ()); Serial.println («попробуйте еще раз через 5 секунд»); // Подождите 5 секунд перед повторной попыткой delay (5000); }}} void setup () {Serial.begin (9600); pinMode (влажность, ВХОД); dht.begin (); pinMode (0, ВЫХОД); setup_wifi (); client.setServer (mqtt_server, MQTT_PORT); client.setCallback (обратный вызов); задержка (20); } void loop () {если (! client.connected ()) {reconnect (); } client.loop (); влажность = digitalRead (влажностьPin); свет = analogRead (A0); temp = dht.readTemperature (); влажность = dht.readHumidity (); Serial.println ("Temperature =" + String (temp, 1) + "\ nHumidity =" + String (влажность, 1) + "\ nMoisture:" + String (влажность) + "\ nLight:" + String (свет)); String payload = "{" ts / ": {" t / ":" + String (temp, 1) + ", \" h / ":" + String (влажность, 1) + "}, \" мс / ": {" m / ":" + String (влажность) + "}, \" ls / ": {" l / ":" + String (свет) + "}}"; Serial.println (полезная нагрузка); если (client.publish (MQTT_TOPIC, (char *) payload.c_str ())) {Serial.println ("опубликовать нормально"); } else {Serial.println ("ошибка публикации"); } задержка (2000); } void darude () {tone (0, NOTE_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, longTone); задержка (longTone); noTone (0); задержка (delayBetweenBars); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_E4, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, NOTE_D4, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_A3, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, longTone); задержка (longTone); noTone (0); задержка (delayBetweenBars); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, NOTE_E4, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, longTone); задержка (longTone); noTone (0); задержка (delayBetweenBars); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, shortTone); задержка (короткий тон); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_B3, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); тон (0, ПРИМЕЧАНИЕ_E4, longTone); задержка (longTone); noTone (0); задержка (стандартная задержка); } void starwars () {beep (NOTE_A4, 500); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 500); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 500); звуковой сигнал (NOTE_F4, 350); звуковой сигнал (NOTE_C5, 150); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 500); звуковой сигнал (NOTE_F4, 350); звуковой сигнал (NOTE_C5, 150); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 650); задержка (500); звуковой сигнал (NOTE_E5, 500); звуковой сигнал (NOTE_E5, 500); звуковой сигнал (NOTE_E5, 500); звуковой сигнал (NOTE_F5, 350); звуковой сигнал (NOTE_C5, 150); звуковой сигнал (NOTE_GS4, 500); звуковой сигнал (NOTE_F4, 350); звуковой сигнал (NOTE_C5, 150); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 650); } void beep (int note, int duration) {// Воспроизвести звук на buzzerPin tone (0, note, duration); задержка (продолжительность); noTone (0); задержка (стандартная задержка); } void heartOfCourage () {} void jacques () {beep (NOTE_C4, 500); звуковой сигнал (NOTE_D4, 500); звуковой сигнал (NOTE_E4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_D4, 500); звуковой сигнал (NOTE_E4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_E4, 500); звуковой сигнал (NOTE_F4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (NOTE_E4, 500); звуковой сигнал (NOTE_F4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (NOTE_F4, 500); звуковой сигнал (NOTE_E4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (ПРИМЕЧАНИЕ_A4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (NOTE_F4, 500); звуковой сигнал (NOTE_E4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_C4, 500); звуковой сигнал (NOTE_G4, 500); звуковой сигнал (NOTE_C4, 500); }
Шаг 3: Ibm Cloud
Вам необходимо настроить экземпляр IBM-cloud. Вы можете найти информацию об этом по этой ссылке: github.
Шаг 4: Узел-КРАСНЫЙ
Мы используем node-red для обработки нашей общей бизнес-логики и для визуализации этих данных в интуитивно понятном пользовательском интерфейсе.
Шаг 5: Настройка Node-RED: свет
Импортируйте следующий код в свой проект.
[{"id": "deb0d57.1c46528", "type": "tab", "label": "Light", "disabled": false, "info": ""}, {"id": "8a0fcaac. 4e54 "," type ":" ibmiot in "," z ":" deb0d57.1c46528 "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicalInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," format ": «json», «name»: «Получить данные из ESP», «service»: «зарегистрировано», «allDevices»: false, «allApplications»: «», «allDeviceTypes»: false, «allLogicalInterfaces»: «», "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 120, "y": 62, "wire":
Шаг 6: Настройка Node-RED: Температура
Импортируйте следующий код в свой проект.
[{"id": "fbad3799.f0e0e", "type": "tab", "label": "Температура", "disabled": false, "info": ""}, {"id": "b8618eb9. 1c9288 "," type ":" ibmiot in "," z ":" fbad3799.f0e0e "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicalInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," format ": «json», «name»: «Получить данные из ESP», «service»: «зарегистрировано», «allDevices»: false, «allApplications»: «», «allDeviceTypes»: false, «allLogicalInterfaces»: «», "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 145.5, "y": 49, "wire":
Шаг 7: Настройка Node-RED: влажность
Импортируйте следующий код в свой проект.
[{"id": "144cd53b.c00473", "type": "tab", "label": "Humidity", "disabled": false, "info": ""}, {"id": "d958f58b. 2678e "," type ":" ibmiot in "," z ":" 144cd53b.c00473 "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicalInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," format ": «json», «name»: «Получить данные из ESP», «service»: «зарегистрировано», «allDevices»: false, «allApplications»: «», «allDeviceTypes»: false, «allLogicalInterfaces»: «», "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 142, "y": 87, "wire":
Шаг 8: Настройка Node-RED: влажность
Импортируйте следующий код в свой проект.
[{"id": "4ee73536.ec6fc4", "type": "tab", "label": "Moisture", "disabled": false, "info": ""}, {"id": "a6daac3e. 2d5268 "," type ":" ibmiot out "," z ":" 4ee73536.ec6fc4 "," authentication ":" boundService "," apiKey ":" "," outputType ":" cmd "," deviceId ":" ESP »,« deviceType »:« ESP8266 »,« eventCommandType »:« update »,« format »:« json »,« data »:« msg »,« qos »: 0,« name »:« Отправить команду в ESP. "," service ":" зарегистрированный "," x ": 804.1944580078125," y ": 383.0000305175781," провода ": }, {" id ":" 4134fdb7.18e9b4 "," type ":" ibmiot in ", "z": "4ee73536.ec6fc4", "authentication": "boundService", "apiKey": "", "inputType": "evt", "logicalInterface": "", "ruleId": "", "deviceId": "ESP", "applicationId": "", "deviceType": "ESP8266", "eventType": "update", "commandType": "", "format": "json", "name": "Получить данные from ESP "," service ":" зарегистрировано "," allDevices ": false," allApplications ":" "," allDeviceTypes ": false," allLogicalInterfaces ":" "," allEvents ": true," allCommands ":" ", "allFormats": false, "qos": 0, "x": 115, "y": 76, "wire":
Шаг 9: Готово
Поздравляю! Теперь у вас есть работающая система наблюдения за растениями.
Если у вас есть какие-либо вопросы, не стесняйтесь обращаться к нам!