오늘은 공공데이터포털과 기상청에서 2022년의 태양광 발전량 데이터와 일사량 데이터를 추가하는 것부터 시작하였다. 23~24년도의 데이터 일부분이 없기 때문에 이후에 학습, 검증, 테스트용 데이터를 분리할 생각을 하면 조금 부족할 것 같다는 생각이 들어 추가하게 되었다. 이후에는 간단하게 전처리를 조금 진행하다가 아두이노 파트를 도와주었다.
# 발전량 데이터 불러오기
PATH = "data/2023/2023_01.csv"
df = pd.read_csv(PATH)
# 데이터 확인
# df.describe()
# df.info()
# 데이터 컬럼 정보
"""
tradeNo : 시간
tradeYmd : YYYYMMDD
regionNm : 지역 이름
amgo : 발전량(MWh)
"""
# 서울시 데이터만 가져오기
df = df[df["regionNm"] == "서울시"].reset_index(drop=True)
# 날짜 -> 시간순으로 정렬
df = df.sort_values(["tradeYmd", "tradeNo"], ascending=[True, True]).reset_index(drop=True)
# 지역 컬럼 제거
df = df.drop(columns=["regionNm"])
# 컬럼명 변경
df.columns = ["time", "date", "generation"]
# 컬럼 순서 변경(날짜->시간->발전량)
df = df.iloc[:, [1,0,2]]
df.head(50)
내일까지 전처리를 진행하면 데이터 준비는 다 끝이 날 것 같다.
릴레이 모듈을 사용해서 4채널의 테마를 구상하다 보니 우노보드 하나로는 핀이 상당히 부족할 것 같다는 생각이 들어 알아보던 중 I2C 방식으로 우노보드끼리 연결을 해서 메인 우노보드로 서브 우노보드를 제어할 수 있다는 것을 알게 되었다.
#include <Wire.h>
#define RELAY_A 7
#define RELAY_B 6
#define RELAY_C 5
#define RELAY_D 4
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(RELAY_A, OUTPUT);
pinMode(RELAY_B, OUTPUT);
pinMode(RELAY_C, OUTPUT);
pinMode(RELAY_D, OUTPUT);
// 모두 OFF (Active LOW이므로 HIGH)
digitalWrite(RELAY_A, HIGH);
digitalWrite(RELAY_B, HIGH);
digitalWrite(RELAY_C, HIGH);
digitalWrite(RELAY_D, HIGH);
}
void loop() {
// 채널A
digitalWrite(RELAY_A, LOW); // ON
delay(2000);
digitalWrite(RELAY_A, HIGH); // OFF
delay(1000);
// 채널B
digitalWrite(RELAY_B, LOW);
delay(2000);
digitalWrite(RELAY_B, HIGH);
delay(1000);
// 채널C
digitalWrite(RELAY_C, LOW);
delay(2000);
digitalWrite(RELAY_C, HIGH);
delay(1000);
// 채널D (서브 우노)
digitalWrite(RELAY_D, LOW);
delay(100);
sendCommand(0x0B, 1);
delay(2000);
sendCommand(0x0B, 0);
digitalWrite(RELAY_D, HIGH);
delay(1000);
}
void sendCommand(byte address, byte command) {
Wire.beginTransmission(address);
Wire.write(command);
Wire.endTransmission();
}
#include <Wire.h>
#define LED_PIN 3
void setup() {
pinMode(LED_PIN, OUTPUT);
Wire.begin(0x0B); // 우노 주소 지정
Wire.onReceive(receiveData);
}
void loop() {
// 메인 루프는 비워둠 (명령 대기)
}
void receiveData(int bytes) {
int command = Wire.read();
if (command == 1) {
digitalWrite(LED_PIN, HIGH); // LED 켜기
} else if (command == 0) {
digitalWrite(LED_PIN, LOW); // LED 끄기
}
}
서브 우노보드의 전원 공급이 아직 해결이 안 됐지만 주문했던 배터리와 컨트롤러가 도착하면 바로 테스트를 해볼 수 있을 것 같다.
내일 데이터 전처리가 마무리되면 드디어 본격적인 머신러닝 파트 시작이다. 이번에도 머신러닝을 다루면서 저번 프로젝트와는 또 다른 새로운 기능과 모델들을 많이 배우고 싶다.