Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp69 [2024/12/16 15:07] – создано labuser30products:laboratory_iot_c:exp69 [2024/12/16 15:29] (текущий) – [Программный код эксперимента] labuser30
Строка 38: Строка 38:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file python Exp69.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<file arduino Exp69.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-from machine import Pin +#include <ESP8266WiFi.h> 
-import network +#include <WiFiClient.h> 
-import gc +#include <ESP8266HTTPClient.h> 
-import time +#include <ArduinoJson.h>
-import socket +
-import json+
  
-_init() +#define WIFI_NAME     "WiFi_name" 
-gc.collect()+#define WIFI_PASSWORD "WiFi_pass"
  
 +String httpGet(String url) {
 +  WiFiClient client;
 +  HTTPClient http;
 +  String data = "";
  
-wlan_id = "WiFi_name+  if (http.begin(client, url)) {   
-wlan_pass = "WiFi_pass+    Serial.println("[HTTP] GET"); 
- +    int httpCode http.GET(); 
- +    if (httpCode > 0) { 
-wlan network.WLAN(network.STA_IF+      Serial.printf("[HTTP] GET code: %d\n", httpCode); 
-wlan.active(True) +      if (httpCode == HTTP_CODE_OK) { 
-wlan.connect(wlan_id, wlan_pass+        data http.getString()
-time.sleep(1+      } else { 
- +        Serial.printf("[HTTP] GET failed, error: %s\n", http.errorToString(httpCode).c_str()); 
- +      } 
-while wlan.isconnected() == False: +      http.end(); 
-    pass +    } else { 
- +      Serial.println("[HTTP] Unable to connect"); 
-print('Device IP:', wlan.ifconfig()[0]+    } 
- +  } 
- +  return data; 
- +
-def http_get(urlport=80): +  
-    _, _, host, path = url.split('/', 3+void setup() { 
-    addr = socket.getaddrinfo(host, port)[0][-1] +  Serial.begin(9600)
-     +  Serial.println(); 
-    s = socket.socket() +   
-    s.connect(addr+  Serial.print("Connecting to WiFi");  
-    s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n'(path, host), 'utf8')+  WiFi.mode(WIFI_STA);                                          
- +  WiFi.begin(WIFI_NAMEWIFI_PASSWORD); 
-    text = ''+  while (WiFi.status() != WL_CONNECTED) { 
 +    Serial.print("."); 
 +    delay(500); 
 +  } 
 +  Serial.println(); 
 +  Serial.println("WiFi connected"); 
 +  Serial.print("IP address: "); 
 +  Serial.println(WiFi.localIP());
  
-    while True: +  String API_key "YourApiKey"; 
-        data s.recv(100) +  String city_name "Moscow";
-        if data: +
-            text +str(data, 'utf8'+
-            pass +
-        else: +
-            a = text.split('\r\n\r\n', 2)[1] +
-            return a +
-            break+
  
 +  String json_data = httpGet("http://api.weatherbit.io/v2.0/current?city=" + city_name + "&key=" + API_key);
 +  Serial.println(json_data);
  
-apiKey = 'YourApiKey' +  JsonDocument json_doc; 
-cityName 'Moscow,RU'+  deserializeJson(json_doc, json_data); 
 +  float temp json_doc["data"][0]["temp"]; 
 +  Serial.println(temp1); 
 +}
  
-json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey+void loop() { 
-data = json.loads(json_data) +}
-print(data) +
-print(data['data'][0]['temp'])+
 </file> </file>
  
Строка 118: Строка 123:
 </code> </code>
  
-Проверяем установилось ли соединение с беспроводной сетью до тех пор, пока оно не будет установлено 
-<code python[enable_line_numbers="2", start_line_numbers_at="22"]> 
-while wlan.isconnected() == False: 
-    pass 
-</code> 
- 
-Выводим IP адрес, который получил наш микроконтроллер при подключении к Wi-Fi сети 
-<code python[enable_line_numbers="2", start_line_numbers_at="25"]> 
-print('Device IP:', wlan.ifconfig()[0]) 
-</code> 
  
-Функция http_get предназначена для формирования запроса к веб-серверу. В качестве параметров она принимает адрес веб страницы (url) и порт (по умолчанию 80, стандартный для веб-страниц). Функция возвращает данные, полученные от веб сервиса.+Функция httpGet предназначена для формирования запроса к веб-серверу. В качестве параметров она принимает адрес веб страницы (url) и порт (по умолчанию 80, стандартный для веб-страниц). Функция возвращает данные, полученные от веб сервиса.
  
-Здесь необходимо ввести свой ключ доступа к сервису weatherbit.io, который был получен после регистрации. Moscow,RU - это название города, по которому мы хотим получить погодные данные. В нашем случае это Москва. Названия для других городов можно получить на сайте сервиса [[https://www.weatherbit.io/api]] +Здесь необходимо ввести свой ключ доступа к сервису weatherbit.io, который был получен после регистрации. Moscow - это название города, по которому мы хотим получить погодные данные. В нашем случае это Москва. Названия для других городов можно получить на сайте сервиса [[https://www.weatherbit.io/api]] 
-<code python[enable_line_numbers="2", start_line_numbers_at="50"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="48"]> 
-apiKey 'YourApiKey' +  String API_key "YourApiKey"; 
-cityName 'Moscow,RU'+  String city_name "Moscow";
 </code> </code>
  
 Отправляем запрос сервису на предоставления данный о текущей погоде Отправляем запрос сервису на предоставления данный о текущей погоде
-<code python[enable_line_numbers="2", start_line_numbers_at="53"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="51"]> 
-json_data = http_get('http://api.weatherbit.io/v2.0/current?city=cityName '&key=apiKey)+  String json_data = httpGet("http://api.weatherbit.io/v2.0/current?city=city_name "&key=API_key);
 </code> </code>
  
Строка 148: Строка 143:
 </WRAP> </WRAP>
  
-В переменной ''json_data'' мы получили просто текстовую строку в формате JSON в которой находится информация. Чтобы мы могли работать с ней как с данными нам необходимо преобразовать ее в структуру данных Python+Выведем полученную строку. 
-<code python[enable_line_numbers="2", start_line_numbers_at="54"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="54"]> 
-data = json.loads(json_data)+  Serial.println(json_data);
 </code> </code>
  
-Теперь в переменно ''data'' находится структура данных к которой мы можем обращаться. Выведем ее в терминалчтобы посмотреть что в ней находится +В твоем случае данные будут другими так как запрос будет сделан в другое время и будет другая погода). В них много различных параметров, даже больше, чем нам будет нужно. 
-<code python[enable_line_numbers="2"start_line_numbers_at="55"]+<code
-print(data)+{'count': 1, 'data': [{'wind_cdir_full': 'south''weather': {'code': '804', 'icon': 'c04d', 'description': 'Overcast clouds'}, 'datetime': '2020-06-15:13', 'temp': 23.9, 'station': 'E8051', 'elev_angle': 39.93, 'app_temp': 23.4, 'state_code': '48', 'wind_dir': 183, 'last_ob_time': '2020-06-15T12:46:00', 'solar_rad': 125, 'sunrise': '00:43', 'slp': 1006.8, 'pod': 'd', 'vis': 5, 'pres': 992.6, 'wind_cdir': 'S', 'wind_spd': 1.34, 'ghi': 625.24, 'ts': 1592225160, 'snow': 0, 'uv': 6.73402, 'clouds': 100, 'city_name': 'Moscow', 'precip': 0, 'timezone': 'Europe/Moscow', 'country_code': 'RU', 'dni': 824.53, 'dhi': 102.47, 'sunset': '18:15', 'ob_time': '2020-06-15 12:46', 'h_angle': 40, 'dewpt': 8.7, 'aqi': 42, 'lat': 55.7522, 'rh': 38, 'lon': 37.6156}]}
 </code> </code>
  
-В нашем случае выводится строка (в вашем случае данные будут другими так как запрос будет сделан в другое время и будет другая погода) + 
-<code> +В переменной ''json_data'' мы получили просто текстовую строку в формате JSON в которой находится информация. Чтобы мы могли работать с ней как с данными нам необходимо преобразовать ее в объект типа ''JsonDocument''. Для работы с JSON мы установили и подключили библиотеку "ArduinoJson"
-{'count': 1, 'data': [{'wind_cdir_full''south', 'weather': {'code': '804', 'icon': 'c04d', 'description': 'Overcast clouds'}'datetime': '2020-06-15:13', 'temp': 23.9, 'station': 'E8051', 'elev_angle': 39.93, 'app_temp': 23.4, 'state_code': '48', 'wind_dir': 183, 'last_ob_time': '2020-06-15T12:46:00', 'solar_rad': 125, 'sunrise': '00:43', 'slp': 1006.8, 'pod': 'd', 'vis': 5, 'pres': 992.6, 'wind_cdir': 'S', 'wind_spd': 1.34, 'ghi': 625.24, 'ts': 1592225160, 'snow': 0, 'uv': 6.73402, 'clouds': 100, 'city_name': 'Moscow', 'precip': 0, 'timezone': 'Europe/Moscow', 'country_code': 'RU', 'dni': 824.53'dhi': 102.47, 'sunset': '18:15', 'ob_time': '2020-06-15 12:46', 'h_angle': 40, 'dewpt': 8.7, 'aqi': 42, 'lat': 55.7522, 'rh': 38, 'lon': 37.6156}]}+ 
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="4"]> 
 +#include <ArduinoJson.h> 
 +</code> 
 +   
 +В следующих строках мы создаем объект (структуру данных) ''json_doc'' и с помощью функции ''deserializeJson'' сохраняем в него данные строки "json_data"     
 +<code arduino[enable_line_numbers="2"start_line_numbers_at="54"]> 
 +  JsonDocument json_doc; 
 +  deserializeJson(json_docjson_data);
 </code> </code>
  
-Это и есть данные, полученные от сервиса. В них много различных параметров, даже больше, чем нам будет нужно. Попробуем выбрать из них температуру и вывести ее в терминал +Теперь в переменной ''json_doc'' находится структура данных к которой мы можем обращаться. Попробуем выбрать данных температуру и вывести ее в терминал 
-<code python[enable_line_numbers="2", start_line_numbers_at="56"]> +<code aarduino[enable_line_numbers="2", start_line_numbers_at="56"]> 
-print(data['data'][0]['temp'])+  float temp = json_doc["data"][0]["temp"]
 +  Serial.println(temp, 1);
 </code> </code>