산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 환경 모니터링

구성품 및 소모품

Arduino MKR1000
× 1
MikroE 환경 클릭
× 1

필요한 도구 및 기계

Adafruit 암/암 점퍼 와이어

앱 및 온라인 서비스

Arduino IDE
IoT 플랫폼 정보

이 프로젝트 정보

소개

우리는 편리한 환경 클릭 센서를 가지고 있었기 때문에 이를 Arduino MKR1000에 연결하고 WolkAbout IoT 플랫폼에서 시각화하기로 결정했습니다. 아이디어는 1분마다 측정을 수행하고 15분마다 한 번씩 결과를 게시하는 것이었습니다. 네트워크 사용량이 많거나 기타 문제로 인해 센서 판독값 게시에 실패하면 결과가 장치의 플래시 메모리에 유지되어야 합니다. 하루에 최대 96개의 쓰기가 가능하므로 플래시 메모리가 잘못된 상태가 될 가능성을 최소화합니다(Arduino는 10,000 쓰기 주기를 보장합니다).

하드웨어 설정

환경 클릭 센서는 I2C 통신 핀(MKR1000의 경우 11 및 12), Vcc 및 접지에 연결됩니다.

소프트웨어 설정

우리는 이 프로젝트를 가능하게 하기 위해 두 개의 라이브러리를 사용했으며, 모두 Arduino IDE의 라이브러리 관리자에서 설치하거나 첨부 파일에 나열된 GitHub 리포지토리에서 .zip 아카이브를 다운로드한 다음 Arduino IDE에 추가하여 설치할 수 있습니다. 필요한 라이브러리는 다음과 같습니다.

<울>
  • WiFi101
  • Adafruit 통합 센서 드라이버
  • Adafruit BME680 라이브러리
  • RTCZero
  • 플래시 스토리지
  • 워크커넥트
  • 필요한 모든 라이브러리가 설치되면 환경 모니터링 의 내용을 복사하십시오. 첨부 파일에서 Arduino IDE로 스케치합니다.

    원형 버퍼의 구조를 구현하여 측정 결과를 저장하는 데 사용합니다. FlashStorage 라이브러리를 사용하여 Flash 메모리에 해당 구조를 저장하는 방법도 구현되어 있습니다. RTCZero 라이브러리를 사용하여 데이터의 정기 읽기 및 게시를 수행합니다. 처음에 WiFi에 연결한 후 WolkAbout IoT 플랫폼에 핑을 보내 RTC 라이브러리에 제공될 현재 에포크를 가져오므로 센서 판독값에 적절하게 타임스탬프가 찍힐 수 있습니다.

    알람 인터럽트는 완료해야 하는 작업(읽기 및 게시)에 대한 플래그를 변경하고 나머지 작업은 루프 기능에서 처리됩니다. 여기에서 읽거나 게시해야 하는지 확인합니다. 전력 소모를 최소화하기 위해 WiFi는 MKR1000과 마찬가지로 저전력 모드로 설정되어 있습니다. 환경 클릭의 센서는 판독이 요청될 때까지 자동으로 저전력 방식으로 전환됩니다.

    스케치를 변경해야 하는 사항에는 33행과 34행에 WiFi 자격 증명을 입력하는 것이 포함됩니다.

    const char* ssid ="<*당신의 SSID*>";
    const char* wifi_pass ="<*당신의 와이파이 비밀번호*>";

    뿐만 아니라 WolkAbout IoT Platform에서 장치 자격 증명을 입력합니다.

    이러한 자격 증명을 얻으려면 먼저 장치 유형을 사용하여 장치를 만들어야 합니다.

    이 프로젝트의 기기 유형, Environment click-deviceType.json, 프로젝트의 첨부 파일에서 사용할 수 있으므로 복사본을 만드십시오. WolkAbout IoT Platform에 로그인하거나 계정을 만들고 기기를 엽니다. 관리 신청.

    기기 선택 유형 관리 탭을 누른 다음 + 서명하고 업로드를 선택합니다. 옵션, 장치 유형의 로컬 사본으로 이동합니다.

    이제 기기 유형을 사용할 수 있으므로 만들기를 클릭하여 기기를 만들 수 있습니다. 기기 .

    여기에서 기기에 이름을 지정하고 연결 유형을 설정해야 합니다. MQTT 기본값 만들기 확인란을 선택합니다. 의미적 (나중에 대시보드에 위젯을 만드는 데 필요).

    저장을 누릅니다. 장치 자격 증명이 있는 양식이 표시됩니다. 이 정보를 원하는 대로 저장한 다음 Arduino IDE의 스케치에 입력합니다.

    const char *device_key ="device_key";
    const char *device_password ="device_password";

    이제 이 스케치를 확인하고 보드에 업로드할 수 있지만 수신된 센서 데이터를 표시하는 방법을 만들어야 합니다.

    이 데이터를 표시하려면 시각화로 전환하세요. 및 모니터링 WolkAbout IoT Platform 섹션에서 + 대시보드 추가를 눌러 새 대시보드를 만듭니다. 및 대시보드의 이름을 입력하고 범위를 장치 이름이 무엇이든 설정합니다. 그런 다음 추가를 눌러 대시보드에 위젯 추가를 시작할 수 있습니다. 위젯.

    인기 선택

    그런 다음 온도를 선택합니다. 기기에서.

    압력에 대해 이 과정을 반복합니다. 습도 . 읽기, 유형의 다른 위젯 만들기 고도 선택 가스에 대한 또 다른 카드 위젯 만들기 저항성 . 위젯을 원하는 대로 재정렬할 수 있습니다.

    기기에서 수신할 것으로 예상되는 전체 개별 센서 판독값에 대한 위젯을 추가하면 다음 대시보드가 ​​기기에서 데이터를 수신할 준비가 됩니다.

    따라서 선택한 환경에 장치를 배포하고 원격으로 조건을 모니터링하십시오.

    결론

    WolkAbout IoT 플랫폼에 Arduino MKR1000과 Environment Click을 연결하여 원격으로 모니터링하려는 장소의 환경 조건을 보고하는 에너지 효율적인 방법을 만들었습니다. 이 솔루션은 WolkAbout IoT Platform의 규칙 엔진을 사용하여 확장할 수 있으며, 이를 통해 특정 값이 정의한 임계값을 초과하면 다양한 유형의 알림을 받을 수 있습니다.

    규칙 엔진 및 기타 WolkAbout IoT 플랫폼 기능에 대한 자세한 내용은 사용자 가이드 페이지를 참조하세요.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 환경 모니터링 스케치
  • 환경 click-deviceType.json
  • 환경 모니터링 스케치Arduino
    이 스케치를 Arduino IDE로 가져오고 WiFi 자격 증명 및 장치 자격 증명을 편집합니다.
    #include #include #include #include #include #include #include #include "WolkConn.h#include "MQTTClient.h"/*저장할 outbound_message_t 수*/#define STORAGE_SIZE 32#define SEALEVELPRESSURE_HPA(1013.25)/ *지속할 아웃바운드 메시지를 저장하기 위한 순환 버퍼*/typedef struct{ boolean valid; outbound_message_t outbound_messages[STORAGE_SIZE]; uint32_t 머리; uint32_t 꼬리; 부울 비어 있음; boolean full;} 메시지;정적 메시지 데이터;/*연결 세부 정보*/const char* ssid ="ssid";const char* wifi_pass ="wifi_pass";const char *device_key ="device_key";const char *device_password ="device_password ";const char* 호스트 이름 ="api-demo.wolkabout.com";int portno =1883;WiFiClient espClient;PubSubClient 클라이언트(espClient);/* WolkConnect-Arduino 커넥터 컨텍스트 */static wolk_ctx_t wolk;/* 플래시 스토리지 초기화 * /FlashStorage(flash_store, Messages);/*i2c 센서 통신 초기화*/Adafruit_BME680 bme;RTCZero rtc;bool read;/*매분 센서 읽기. 이 매개변수를 변경하는 경우 <60*/const byte readEvery =1;bool publish;/*Publish every 10분인지 확인하십시오. 이 매개변수를 변경하는 경우 <60*/const byte publishEvery =10;byte publishMin;/*Flash 스토리지 및 사용자 정의 지속성 구현*/void _flash_store(){ data.valid =true; flash_store.write(data);}void 증가 포인터(uint32_t* 포인터){ if ((*pointer) ==(STORAGE_SIZE - 1)) { (*pointer) =0; } else { (*포인터)++; }}무효 _init(){ 데이터 =flash_store.read(); if (data.valid ==false) { data.head =0; 데이터 꼬리 =0; data.empty =참; data.full =거짓; }}bool _push(outbound_message_t* outbound_message){ if(data.full) { 증가 포인터(&data.head); } memcpy(&data.outbound_messages[data.tail], outbound_message, sizeof(outbound_message_t)); 증가 포인터(&data.tail); data.empty =거짓; data.full =(data.tail ==data.head); return true;}bool _peek(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); 반환 true;}bool _pop(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); 증가 포인터(&data.head); data.full =거짓; data.empty =(data.tail ==data.head); return true;}bool _is_empty(){ return data.empty;}void init_wifi(){ if ( WiFi.status() !=WL_CONNECTED) { while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { delay(1000 ); } }} 무효 setup_wifi() { 지연(10); if ( WiFi.status() !=WL_CONNECTED) { int numAttempts =0; 동안 (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { numAttempts++; if(numAttempts ==10){ Serial.println("와이파이에 연결할 수 없습니다!"); 부서지다; } 지연(1000); } }} 무효 설정() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); /*순환 버퍼 구조 초기화*/ _init(); init_wifi(); wolk_init(&wolk, NULL, NULL, NULL, NULL, device_key, device_password, &client, 호스트 이름, 포트 번호, PROTOCOL_JSON_SINGLE, NULL, NULL); wolk_init_custom_persistence(&wolk, _push, _peek, _pop, _is_empty); /*문제가 발생하면 온보드 LED가 켜집니다.*/ if(!bme.begin()) { digitalWrite(LED_BUILTIN, HIGH); } /*센서 초기화*/ bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 150ms 지연에 대해 320*C(200); 읽기 =참; 게시 =사실; /*서버에서 현재 에포크 가져오기*/ wolk_connect(&wolk); 지연(100); wolk_update_epoch(&wolk); 동안 (!(wolk.pong_received)) { wolk_process(&wolk); 디지털 쓰기(LED_BUILTIN, 높음); 지연(1000); } 디지털 쓰기(LED_BUILTIN, 낮음); wolk_disconnect(&wolk); rtc.begin(); rtc.setEpoch(wolk.epoch_time); rtc.setAlarmTime(rtc.getHours(), (rtc.getMinutes() + readEvery) % 60, rtc.getSeconds()); rtc.enableAlarm(rtc.MATCH_MMSS); rtc.attachInterrupt(alarmMatch); publishMin =(rtc.getMinutes() + publishEvery) % 60; WiFi.lowPowerMode();}void loop() { /* 인터럽트 루틴을 가능한 한 짧게 유지하기 위해 루틴은 수행할 작업만 설정합니다. read =true는 센서 읽기가 완료되어야 함을 의미합니다. publish =true는 연결을 사용할 수 없는 경우 판독값을 플랫폼에 게시하거나 플래시에 유지해야 합니다. */ if(read) { read =false; if (!bme.performReading()) { digitalWrite(LED_BUILTIN, HIGH); } wolk_add_numeric_sensor_reading(&wolk, "T", bme.온도, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "H", bme.humidity, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "P", bme.pressure / 100.0, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "GR", bme.gas_resistance, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "A", bme.readAltitude(SEALEVELPRESSURE_HPA), rtc.getEpoch()); /*새 알람 설정*/ int alarmMin =(rtc.getMinutes() + readEvery) % 60; rtc.setAlarmMinutes(alarmMin); 지연(100); } if(게시) { 게시 =거짓; setup_wifi(); wolk_connect(&wolk); if(!wolk.is_connected) { _flash_store(); } 지연(100); if(wolk_publish(&wolk) ==W_TRUE) { _flash_store(); } /*새 게시 시간 설정*/ publishMin =(rtc.getMinutes() + publishEvery) % 60; 지연(100); wolk_disconnect(&wolk); 지연(100); } 지연(100); }/*시간이 지정된 인터럽트 루틴*/void alarmMatch(){ read =true; if(publishMin ==rtc.getMinutes()) { 게시 =true; }}
    환경 click-deviceType.jsonJSON
    WolkAbout IoT Platform
    [ { "name":"Environment click", "description":"BME680 센서용 Device type for MikroElektronika's board Environment Click", "guid":" def68ff6-63c5-4f9c-a066-bcc944b7bd2d", "deviceType":"STANDARD", "프로토콜":"JSON", "connectivityType":null, "firmwareUpdateType":null, "피드":[ { "이름":" 온도", "설명":null, "참조":"T", "단위":{ "이름":"CELSIUS", "guid":"7c805d10-a879-11e9-83cd-0a0027000005" } }, { " 이름":"습도", "설명":null, "참조":"H", "단위":{ "이름":"HUMIDITY_PERCENT", "guid":"7c8080a3-a879-11e9-83cd-0a0027000005" } }, { "이름":"압력", "설명":null, "참조":"P", "단위":{ "이름":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005" } }, { "이름":"가스 저항", "설명":null, "참조":"GR", "단위":{ "이름":"OHM", "guid":"7c805890- a879-11e9-83cd-0a0027000005" } }, { "이름":"고도", "설명":null, "참조" e":"A", "unit":{ "name":"METRE", "guid":"7c805a59-a879-11e9-83cd-0a0027000005" } } ], "액추에이터":[], "알람":[], "구성":[], "속성":[ { "이름":"CONNECTIVITY_TYPE", "dataType":"ENUM", "validationRegex":"^(MQTT|HTTP)$", "옵션":[ "MQTT", "HTTP" ], "defaultValue":"MQTT", "필수":true, "readOnly":true }, { "이름":"FIRMWARE_UPDATE_ENABLED", "dataType":"BOOLEAN", "validationRegex ":"^(true|false)$", "옵션":null, "defaultValue":null, "필수":false, "readOnly":true }, { "이름":"FIRMWARE_VERSION", "dataType":"STRING", "validationRegex":null, "옵션":null, "defaultValue":null, "필수":false, "readOnly":true }, { "name":"FILE_DIRECT_DOWNLOAD_ENABLED", "dataType":"BOOLEAN ", "validationRegex":"^(true|false)$", "옵션":null, "defaultValue":null, "필수":false, "readOnly":true }, { "이름":"FILE_URL_DOWNLOAD_ENABLED", "dataType":"BOOLEAN", "validationRegex":"^(true|false)$", "옵션":null, "defaultValue":null, "필수":false, " 읽기 전용":참 } ] }]
    WolkAbout 환경 모니터링
    이 저장소에는 이 프로젝트에서 사용된 Arduino 스케치가 포함되어 있습니다.https://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
    Arduino WiFi 101 쉴드
    Arduino WiFi 101 Shield용 Wi-Fi 라이브러리https://github.com/arduino-libraries/WiFi101
    Adafruit 통합 센서 드라이버
    모든 센서에 필요한 통합 센서 라이브러리https://github.com/adafruit/Adafruit_Sensor
    Adafruit BME680 라이브러리
    센서 판독값을 얻으려면 환경 클릭에 사용되는 라이브러리https://github.com/adafruit/Adafruit_BME680
    Arduino용 RTC 라이브러리
    SAMD21 기반 보드용 RTC 라이브러리 https://github.com/arduino-libraries/RTCZero
    Arduino용 FlashStorage 라이브러리
    ATSAMD21https://github.com/cmaglie/FlashStorage에서 플래시 메모리에 데이터를 저장하는 편리한 방법
    WolkConnect-Arduino
    WolkAbout IoT 플랫폼에 쉽게 연결할 수 있는 Arduino 라이브러리.https://github.com/Wolkabout/WolkConnect-Arduino

    회로도


    제조공정

    1. Arduino 스파이봇
    2. K30 센서로 CO2 모니터링
    3. FlickMote
    4. 수제 TV B-Gone
    5. 마스터 시계
    6. 나를 찾기
    7. Arduino Power
    8. Tech-TicTacToe
    9. Arduino Quadruped
    10. 비접촉식 온도 모니터링 게이트