학교에 대회 포스터가 붙고 2일 뒤었다. 운동을 하고 있는 나에게 친구가 찾아와 함께 나가지 않겠냐고 하드웨어와 웹을 할 줄 아는 사람이 필요하다고 제의가 들어왔고 나는 동의하고 간절한 임베디드
이라는 팀이름으로 시작하게 되었다. 우리는 프론트 1명, 백엔드 1명, 하드웨어 2명으로 시작하였다.
그 중에 나는 웹디자인과 하드웨어 코딩을 맡게 되었다. 그리고 팀을 이끌어나가는 팀장이자 리더가 되었다.
대회는 좋은 환경을 만들어가는 IOT이었다.
우리의 프로젝트는 스마트 배관공이다.
해커톤의 주제인 환경과 우리의 일상생활에서 가까운 문제가 무엇이 있을까 찾아 보았다. 그리고 나의 눈에 들어온 것은 환경부 사이트 올라온 배수구 문제였다.
환경부 사이트
사람이 배수구에 쓰레기를 많이 버리고 있다.
자신이 쓰레기를 버려도 막히지 않을 것이라고 생각하는 사람들이 있는데 그런 사람들이 여러 명이면 쓰레기는 늘어날 것이고 결국 배수구가 막힌다.
스마트 배관공은 3가지 구성되어 있다.
자동으로 열리는 하수구
평소에는 하수구가 열려있지 않아 쓰레기를 버리는 것을 방지한다. 비가 오거나 빗물이 고이면 하수구를 열어 물을 뺀다.
쓰레기를 모으는 쓰레기통
하수구에서 쓰레기가 빠지는 곳을 만들고 웹사이트에 얼마나 찼는지 확인
관리용 웹사이트
스마트 배관공의 현제 상태와 위치를 확인할 수 있는 스마트배관공 관리용 사이트
언어
웹: react
서버: nest.js
하드웨어: ARDUINO
하드웨어 구성
나는 팀장이니 프로젝트를 개발하는 것 외에 팀을 이끌어 나가는 역할도 하였다. 내가 팀장으로 리드한 역할은 팀원들의 멘탈 관리와 프로젝트 진행상황 확인 및 팀원들간의 소통 원할하게 하기였다.
시작하기
디자이너가 없는 우리팀에서 피그마를 해본 경험이 있는 내가 웹디자인을 하게 되었다. 디자인을 해본 적이 없는 나는 간단하게 디자인을 하고 아두이노 코딩에 들어갔다.
난관 봉착
아두이노를 코딩을 하며 난관을 만났다. 수분 센서와 서보 모터를 제어하는 것은 금방 끝났다. 하지만 ESP8266을 통해 웹사이트에 값을 넘겨주는 것에서 어려움을 느끼게 되었다. 1시간 동안 수많은 시도와 구글링을 하였지만 성공하지 못했고 실패함에 의한 피로와 멘탈 공격에 의해 너무 힘이 들었다.
개발 성공
계속한 시도를 통해 client.println
을 응용하여 웹사이트에 값을 보내는 것을 성공했다. 그 성공을 했을 때의 짜림함은 그동안의 피로와 멘탈 공격이 없어지는 것 같았다.
코드
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <Servo.h> // servo library
#define SensorPin A0 // used for Arduino and ESP8266
//#define SensorPin 4 // used for ESP32
#define SOUND_VELOCITY 0.034
#define CM_TO_INCH 0.393701
long duration;
int distanceCm;
float distanceInch;
Servo s1;
Servo s2;
const int trigPin = 12;
const int echoPin = 14;
String jsondata = "";
String li = "";
int status = WL_IDLE_STATUS;
WiFiClient client;
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
int re = client.connect(서버 보안);
void sonarValue(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_VELOCITY/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance on the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
}
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
s1.attach(0);
s2.attach(2);
WiFi.begin(보안);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
Serial.println(analogRead(SensorPin));
sonarValue();
if(analogRead(SensorPin)>400){
s1.write(180);
s2.write(180);
root["openStatus"] = true;
}
else{
s1.write(0);
s2.write(0);
root["openStatus"] = false;
}
jsondata = "";
root["garbageAmount"] = distanceCm;
root.printTo(jsondata);
re = client.connect("보안);
if (re) {
client.println("POST 보안/1 HTTP/1.1");
client.println("Host: 보안");
client.println("Cache-Control: no-cache");
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(jsondata.length());
client.println();
client.print(jsondata);
li = client.readString();
Serial.println(li);
}
Serial.println("good");
}
우리팀은 장려를 받았다. 노력을 다 같이 많이 했고 기대하였지만 장려를 받아서 아쉬움이 있었지만 노력의 성과가 있어 좋은 것 같다.
개발을 하는데 어려움을 많이 겪은 해커톤이었던 것 같다. 내가 팀장으로써 팀원들을 조율하는 일을 많이 하였지만 내가 멘탈이 많이 흔들리고 있을 때 주위의 팀원들이 내 멘탈을 많이 회복시켜주어 좋았던 것 같다. ESP8266 제어법 등 많은 것들을 알게 되었지만 가장 많이 깨우친 것은 팀원들과 단합이 정말 중요하다는 것을 알게되었다.
좋은글이네요 화이팅 하세요!!!