콘테스트 프로젝트 진행 상황
각 Quest를 단계적으로 완성하는 프로젝트입니다.
Quest 1: 환경센서를 제어를 해서 데이터를 확인해보자
2022.08.07
□ 아이디어 소개 및 개요 (개발 계획 및 과정 포함)
환경제어 장치 제어를 소개 합니다.
이 피코 보드에 온도센서 + 습도센서 + 수위센서 + 변위센서 + 기타센서 연결 합니다.
환경을 측저을 하여 그것을 AWS 클라우드를 통해서 데이터를 전송 하여 사용자가 확인 합니다.
□ 전체 구조를 표현하는 블록 다이어그램

□ 하드웨어 구성 다이어그램
.png)
□ 소프트웨어 구성 다이어그램

Quest 2: 환경센서를 제어를 해서 데이터를 확인해보자
2022.08.17
1,. 아두이노를 설치를 해보자
랑크(https://www.arduino.cc/) 통해서 홈페이지 이동을 합니다.

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

자신에 알맞은 IDT선택후 설치를 합니다.
설치를 한후
아두이노 IDE 실행 -> 툴 -> 보드 -> 보드 매니져 클릭

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

PICO 사용을 할수 있게 되었습니다.
클라우드 서비를 위해서 AWS 가입을 해보 겠습니다.
아래와 가입 페이지에 갑니다. 콘솔에 로그인 클릭

로그인 -> 새로운계정 만들기 합니다.

이메일 주소를 쓰고 계정 이름을 정합니다.,

주소는 꼭 영문으로 써야 하니 네이버를 통해서 영문 기입을 합니다.
카드 등록을 해야 사용을 할수 있으니 카드 등록을 꼭 해주시기 바랍니다.
카드 등록을 해도 1달러는 추후 결재 취소가 됩니다.
또한 무료 가입(개인사용자) 일정 이상에 데이터를 사용을 하지 않기 때문에 충분히 사용을 할수 있습니다.\
아래와 같이 가입을 끝낼수 있다.

이제 AWS 클라우드 서비스를 사용할수 있게 되었다.

Quest 3: 퀘스트3단계 다함께 해보아요.
2022.09.11
1.IoT 클라우드 서비스에 대한 계정이 활성화된 상태(로그온)을 확인할 수 있는 캡쳐본을 제출하세요.
우선 AWS IOT 에 로그인을 합니다.

2.IoT 클라우드와 연결된 Pico W 사물의 이름 설정 등 IoT 연결 과정을 설명해 주세요.

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

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

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

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

3.IoT 클라우드에 업로드된 데이터 상태가 확인되는 대시보드 화면을 캡쳐하여 제출하세요.
프로그램을 작성후 아래와 같이 접속을 확인합니다.

다음과 같이 데이터가 들어 오게 됩니다. 5초에 한번식
온도값과 습도값을 확인합니다.

Quest 4: 환경센서를 제어를 해서 데이터를 확인해보자
2022.09.23
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 데이터 전송
.png)
AWS IOT를 통해서 이런 저런 일을 많이 해볼수 있는 기회가 있는거 같다.
MQTT를 라즈베리파이로 브로커서버를 통해서 해볼수 있는 기회가 있다면 해보야 할거 같다. 요즘에는 이렇게 센서를 1개가 아닌 복수의 센서를 설치를 해서 데이터를 취득을 하는 경우가 많다.
초반에는 아두이노의 장점을 잘 살려서 계획을 하였으나 아두이노에서의 과정이마이크로 파이썬보다 더 어렵게 느껴진거 같다.
소스의 존재와 예제가 너무빈약 하다고 하면 말이 안되지만 아두이노로 오랜만에 작업을 해보니 신경을 쓸게 너무 많은거 같다.
프로젝트 갤러리
프로젝트 제작 과정과 최종 결과물을 담은 이미지 갤러리입니다.


.png)













프로젝트 자료실
프로젝트를 재현하거나 학습하는데 필요한 모든 자료를 제공합니다.
등록된 자료가 없습니다.
프로젝트 소개
아직 등록된 프로젝트 소개가 없습니다.
코드 & 회로도
등록된 코드/회로 자료가 없습니다.
댓글 0개
아직 댓글이 없습니다. 첫 댓글을 남겨보세요!

.png)



