Pomiar jakości powietrza

Tu będą się pojawiać kody źródłowe,
ODPOWIEDZ
Awatar użytkownika
SunRiver
Użytkownik
Posty: 1496
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Festung Oppeln
Kontakt:

Pomiar jakości powietrza

Post autor: SunRiver »

Komunikacja z czujnikiem PSM3003 odbywa się na UART z użyciem pinów:
• GPIO17 — TX,
• GPIO16 — RX,
• GPIO4 — SET,
• GPIO5 — RESET.


  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "freertos/FreeRTOS.h"
  4. #include "freertos/task.h"
  5. #include "freertos/event_groups.h"
  6. #include "freertos/semphr.h"
  7. #include "esp_system.h"
  8. #include "nvs_flash.h"
  9. #include "esp_log.h"
  10. #include "mqtt_client.h"
  11. #include "driver/uart.h"
  12. #include "driver/gpio.h"
  13. #define UART_RX_PIN 16
  14. #define UART_TX_PIN 17
  15. #define SET_PIN 4
  16. #define RESET_PIN 5
  17. #define WIFI_SSID "SSID"
  18. #define WIFI_PASSWORD "<hasło WiFi> "
  19. #define MQTT_BROKER "<adres brokera MQTT>"
  20. #define MQTT_PORT 1883
  21. #define MQTT_TOPIC "jakosc_powietrza"
  22. static esp_mqtt_client_handle_t mqtt_client;
  23. static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) {
  24.     switch (event->event_id) {
  25.     case SYSTEM_EVENT_STA_START:
  26.         esp_wifi_connect();
  27.         break;
  28.     case SYSTEM_EVENT_STA_CONNECTED:
  29.         break;
  30.     case SYSTEM_EVENT_STA_GOT_IP:
  31.         break;
  32.     case SYSTEM_EVENT_STA_DISCONNECTED:
  33.         esp_wifi_connect();
  34.         break;
  35.     default:
  36.         break;
  37.     }
  38.     return ESP_OK;
  39. }
  40. static void wifi_init()
  41. {
  42.     tcpip_adapter_init();
  43.     ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL));
  44.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  45.     ESP_ERROR_CHECK(esp_wifi_init(&cfg));
  46.     wifi_config_t wifi_config = {
  47.         .sta = {
  48.         .ssid = WIFI_SSID,
  49.         .password = WIFI_PASSWORD,
  50.     },
  51.     };
  52.     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
  53.     ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
  54.     ESP_ERROR_CHECK(esp_wifi_start());
  55. }
  56. static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) {
  57.     switch (event->event_id) {
  58.     case MQTT_EVENT_CONNECTED:
  59.         ESP_LOGI("MQTT", "Połączono z brokerem MQTT");
  60.         break;
  61.     case MQTT_EVENT_DISCONNECTED:
  62.         ESP_LOGI("MQTT", "Rozłączono z brokerem MQTT");
  63.         break;
  64.     default:
  65.         break;
  66.     }
  67.     return ESP_OK;
  68. }
  69. static void mqtt_init() {
  70.     esp_mqtt_client_config_t mqtt_cfg = {
  71.         .uri = "mqtt://" MQTT_BROKER ":" MQTT_PORT,
  72.     };
  73.     mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
  74.     esp_mqtt_client_register_event(mqtt_client, ESP_EVENT_ANY_ID, mqtt_event_handler, mqtt_client);
  75.     esp_mqtt_client_start(mqtt_client);
  76. }
  77. void uart_init()
  78. {
  79.     uart_config_t uart_config = {
  80.         .baud_rate = 9600,
  81.         .data_bits = UART_DATA_8_BITS,
  82.         .parity = UART_PARITY_DISABLE,
  83.         .stop_bits = UART_STOP_BITS_1,
  84.         .rx_pin = UART_RX_PIN,
  85.         .tx_pin = UART_TX_PIN,
  86.     };
  87.     ESP_ERROR_CHECK(uart_param_config(UART_NUM_2, &uart_config));
  88.     ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, UART_TX_PIN, UART_RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
  89.     ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, 1024, 0, 0, NULL, 0));
  90. }
  91. void gpio_init()
  92. {
  93.     gpio_config_t io_conf = {
  94.         .pin_bit_mask = (1ULL << SET_PIN) | (1ULL << RESET_PIN),
  95.         .mode = GPIO_MODE_OUTPUT,
  96.         .intr_type = GPIO_INTR_DISABLE,
  97.         .pull_up_en = 0,
  98.         .pull_down_en = 0,
  99.     };
  100.     ESP_ERROR_CHECK(gpio_config(&io_conf));
  101. }
  102. void pms3003_reset()
  103. {
  104.     gpio_set_level(RESET_PIN, 0);
  105.     vTaskDelay(100 / portTICK_PERIOD_MS);
  106.     gpio_set_level(RESET_PIN, 1);
  107.     vTaskDelay(1000 / portTICK_PERIOD_MS);
  108. }
  109. void app_main()
  110. {
  111.     nvs_flash_init();
  112.     wifi_init();
  113.     mqtt_init();
  114.     uart_init();
  115.     gpio_init();
  116.         pms3003_reset();
  117.     while (1) {
  118.         uint8_t data[32];
  119.         int len = uart_read_bytes(UART_NUM_2, data, sizeof(data), 1000 / portTICK_RATE_MS);
  120.         if (len == 32 && data[0] == 0x42 && data[1] == 0x4D) {
  121.             uint16_t pm1_0 = (data[6] << 8) | data[7];
  122.             uint16_t pm2_5 = (data[8] << 8) | data[9];
  123.             uint16_t pm10 = (data[10] << 8) | data[11];
  124.             char message[64];
  125.             sprintf(message, "{\"PM1.0\": %u, \"PM2.5\": %u, \"PM10\": %u}", pm1_0, pm2_5, pm10);
  126.             esp_mqtt_client_publish(mqtt_client, MQTT_TOPIC, message, 0, 0, 0);
  127.         }
  128.         vTaskDelay(1000 / portTICK_PERIOD_MS);
  129.     }
  130. }
ODPOWIEDZ

Wróć do „Kody żródłowe”