수행기록퀘스트4

환경센서를 제어를 해서 데이터를 확인해보자
2022. 9. 23 (금) 18:22 최종수정 2022. 9. 24 (토) 10:34 IDT 조회 598 좋아요 0 스크랩 0 댓글 0

   1,. 아두이노를 설치를 해보자

    랑크(https://www.arduino.cc/) 통해서 홈페이지 이동을 합니다.

 

 

  소프트웨어 부분을(붉은색) 클릭을 합니다. 다운로드 페이지 이동을 합니다.

 

자신에 알맞은 IDE선택후 설치를 합니다.

설치를 한후

아두이노 IDE 실행 -> 툴 -> 보드 -> 보드 매니져 클릭

 

 

보드 매니저에 PICO 를 검색을 한후 아래 같이 설치를 해줍니다.

 

 

가입하기를 누릅니다.
로그인화면에서 루트 사용자 선택을 합니다.

 

 

주소는 꼭 영문으로 써야 하니 네이버를 통해서 영문 기입을 합니다.

카드 등록을 해야 사용을 할수 있으니 카드 등록을 꼭 해주시기 바랍니다.

카드 등록을 해도 1달러는 추후 결재 취소가 됩니다.

또한 무료 가입(개인사용자) 일정 이상에 데이터를 사용을 하지 않기 때문에 충분히 사용을 할수 있습니다.

아래와 같이 가입을 끝낼수 있다.


클라우드에 로그인 합니다.

 

단일 사물을 등록을 합니다.

 

 

단일 사물 생성을 해주시고 정책을 해줍니다.
 

 

디바이스 인증서 구성 중 새인증성 자동선책을 해줍니다.

 

 

인증서 연결을 해줍니다.

 

 

아래와 같이 사물생성후 인증성 퍼블릭키 루트 CA 인증서를 다운로드 합니다.

 

구성되어있는 회로도는 다음과 같다.


 

라즈베리파이 핀맵

아래와 같이 ADC 총 3개 뿐이라서 ADC 변환을 사용을 온도/습도/변위 센서를 사용을 해보았다. 내장이 되어있는 온도센서는 초기에 코드를 업로드 하고 빼고 하는 과정에서
고장이 낮는지 데이터가 위아래로 현실성 없게 고장이 난거 같다.
(주위 현재 3.3V 에서 전압이 낮아지는 현상이 있다. ADC 는 괸찮은데 OLED동작을 하면
전압이 2.2 V 까지 낮아지는 현상이 발견되었다, 개별 동작은 이상없이 동작을 하는데 센서3+OLED 동작은 내가 가지고 있는 보드에서는 어려운거 같다.)

 

온습도 센서 스펙 및 정보

 

온습도 센서 코드

 

변위계 데이터 스펙및 정보
 

기타 RS232 // I2c // SPI 통신을 통한 데이터를 얻고 싶다면
통신 방식에 맞는 프로토콜로 형식에 맞게 추가 하면 동작이 완료 됩니다.

아두이노 메인코드 아래 같이 사용된다.

대부분 코드는 인터넷에서 사용되고 있는 일반적이 소스이다.

ESP32 구동이 되는 소스 이다.

picow/pub AWS 에서 데이터를 받을떼 사용된다.

picow/sub AWS 에서 데이터를 줄때 사용된다.

secrets.h 파일은 AWSIOT에서 받은 CA /Device Certificate / Device Private Key
등 기본적인 사용되고 있는 변수들의 집합체이다.(SSID PW)

 

#include "secrets.h"
#include 
#include 
#include 
#include

#define AWS_IOT_PUBLISH_TOPIC   "picow/pub"
#define AWS_IOT_SUBSCRIBE_TOPIC "picow/sub"

WiFiClientSecure net = WiFiClientSecure();
MQTTClient client = MQTTClient(256);

float sensor0 = A0;
float sensor1 = A1;
float sensor2 = A2 ;
float sensorValue0 = 0.0;
float sensorValue1 = 0.0;
float sensorValue2 = 0.0;
float volt = 3.200;
float adc_bit = 1023.0;
float crack = 4887;
void connectAWS()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Serial.println("Connecting to Wi-Fi");

  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.println("WIFI ERR .");
  }

  // Configure WiFiClientSecure to use the AWS IoT device credentials
  net.setCACert(AWS_CERT_CA);
  net.setCertificate(AWS_CERT_CRT);
  net.setPrivateKey(AWS_CERT_PRIVATE);

  // Connect to the MQTT broker on the AWS endpoint we defined earlier
  client.begin(AWS_IOT_ENDPOINT, 8883, net);

  // Create a message handler
  client.onMessage(messageHandler);

  Serial.println("Connecting to AWS IOT");

  while (!client.connect(THINGNAME)) {
    Serial.println("IOT ERR .");
    delay(100);
  }

  if(!client.connected()){
    Serial.println("AWS IoT Timeout!");
    return;
  }

  // Subscribe to a topic
  client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);

  Serial.println("AWS IoT Connected!");
}

void publishMessage()
{
  sensorValue0 = (analogRead(sensor0)/adc_bit)*165-40;
  sensorValue1 = (analogRead(sensor1)/adc_bit)*100;
  //crack = (500/1023);
  //단위 0mm 500mm
  sensorValue2 = ((analogRead(sensor2)*(crack))/10000);


  StaticJsonDocument<200> doc;
  doc["Title"] = "IDT MAKE";
  doc["time"] = millis();
  doc["Temp 1"] = analogReadTemp();
  doc["Temp 2"] = sensorValue0;
  doc["Humi 1"] = sensorValue1;
  doc["Crack1"] = sensorValue2;

  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer); // print to client

  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
  Serial.println("publishMessage AWS MQTT");
  Serial.print("/");
  Serial.print(sensorValue0);
  Serial.print("/");
  Serial.print(sensorValue1);
  Serial.print("/");
  Serial.println(sensorValue2);
}

void messageHandler(String &topic, String &payload) {
  Serial.println("incoming: " + topic + " - " + payload);
  Serial.println("subMessage AWS MQTT");
//  StaticJsonDocument<200> doc;
//  deserializeJson(doc, payload);
//  const char* message = doc["message"];
}



void setup() {

Serial.begin(9600);
  connectAWS();
}

void loop() {
  // put your main code here, to run repeatedly:
publishMessage();

  client.loop();
  delay(5000);
}

 

서브 H 파일 코드

/*
  Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  Permission is hereby granted, free of charge, to any person obtaining a copy of this
  software and associated documentation files (the "Software"), to deal in the Software
  without restriction, including without limitation the rights to use, copy, modify,
  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
  permit persons to whom the Software is furnished to do so.
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#include 

#define SECRET
#define THINGNAME "picow_e4ds"


//const char* ssid = "와이파이";
//const char* password = "와이파이PW";
const char WIFI_SSID[] = "와이파이";
const char WIFI_PASSWORD[] = "와이파이PW";
const char AWS_IOT_ENDPOINT[] = "AWS엔드포인트";

// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
복사붙여녛기 해주세요.
-----END CERTIFICATE-----
)EOF";

// Device Certificate
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
-----BEGIN CERTIFICATE-----
복사붙여녛기 해주세요.
-----END CERTIFICATE-----

)KEY";

// Device Private Key
static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
복사붙여녛기 해주세요.
-----END RSA PRIVATE KEY-----

)KEY";

 

아래 같은 파일을 한군데에 모아두고

 

// Amazon Root CA 1
여기는 CA1.pem 파일을 다운로드 받고
내용을 복사 붙여넣기(메모장으로 열어서)

 

마찬가지로 Device Certificate 파일도
Device Private Key 파일도 해주면 된다.

 

그리고 ID PW 자신에 맞게끔 설정을

아래와 같이 내가 표현하고 싶은 데이터를 넣어준다.

doc["Title"] = "IDT MAKE"; -> 타이틀
doc["time"] = millis(); -> 시간
doc["Temp 1"] = analogReadTemp(); -> 내장된센서(고장남)
doc["Temp 2"] = sensorValue0; -> 온도
doc["Humi 1"] = sensorValue1; -> 습도
doc["Crack1"] = sensorValue2; -> 변위 데이터

변위데이터는 다음과 같이 구할수 있다.
총 측정길이는 500mm 이고 이것은 입력 전압에 따른 출력이 나온다
입력전압이 3.2v 라면 500mm == 3.2V 즉 500mm = 1023 된다.
500/ 1023 => 0.488758532746823 이라는 데이터를
crack 변수 4887 넣어주고 출력값이 10000을 나누어 주면 된다.

 

10cm 일때 사진

 

MQTT 데이터 전송

 

500cm 일때 사진(실제론 520까지 땡겨진다.)

 

MQTT 데이터 전송

 

AWS IOT를 통해서 이런 저런 일을 많이 해볼수 있는 기회가 있는거 같다.
MQTT를 라즈베리파이로 브로커서버를 통해서 해볼수 있는 기회가 있다면 해보야 할거 같다. 요즘에는 이렇게 센서를 1개가 아닌 복수의 센서를 설치를 해서 데이터를 취득을 하는 경우가 많다.
초반에는 아두이노의 장점을 잘 살려서 계획을 하였으나 아두이노에서의 과정이마이크로 파이썬보다 더 어렵게 느껴진거 같다.
소스의 존재와 예제가 너무빈약 하다고 하면 말이 안되지만 아두이노로 오랜만에 작업을 해보니 신경을 쓸게 너무 많은거 같다.

 

 

첨부파일
IDT 환경센서 업로드용.zip 다운로드

로그인 후
참가 상태를 확인할 수 있습니다.