우리집 거실에서는 ...
이렇게 생긴 스위치를 전등에 달아서 사용한다.
우리방의 불은 진짜 스위치를 뜯어서 개조해서 사용했는데
거실은 위의 장치를 이용하기 때문에 새롭게 알아보고 만들었다.
처음에 위의 스위치가 IR을 이용한 방식인 줄 앍고
IR신호를 알아내기 위해
아두이노 우노를 이용하여 신호를 잡으려 헀으나...
어떤 신호도 안잡히길래 확인해보니... 고장!
그래서 알리에서 다른 센서 묶음으로 주문하고 일주일 정도 후에
배송을 받고 신호확인!
아두이노 IRremote 수신 방법
⌘ 아두이노 IR receiver 코드 ⌘
#include <IRremote.hpp>
int IR_RECEIVE_PIN = 9;
void setup()
{
Serial.begin(9600);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Start the receiver
}
void loop() {
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // Print "old" raw data
// USE NEW 3.x FUNCTIONS
IrReceiver.printIRResultShort(&Serial); // Print complete received data in one line
IrReceiver.printIRSendUsage(&Serial); // Print the statement required to send this data
IrReceiver.resume(); // Enable receiving of the next value
}
}
위 그대로 실행하면 잘 나온다. IRremote-Arduino깃허브에서 복사한 거임.
예전 irremote 방법으로 사용하면 FFFFFF만 나온다.
이런거
#include <IRremote.h>
int IR_RECV_PIN = 9;
IRrecv irrecv(IR_RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
readIR();
}
void readIR()
{
if (irrecv.decode( &results ))
{
unsigned long IRval = results.value;
/*
if (IRval == 0xffffffff)
{
irrecv.resume();
return;
}
*/
Serial.println( results.value, HEX );
irrecv.resume();
}
}
https://github.com/Arduino-IRremote/Arduino-IRremote
ir 적외선으로 켜는 줄 알았으나... 라디오 무선 방식이네... ㅎ
그래도 포기는 금물이지 ㅋ
스위치를 트랜지스터로 작동하면 되니까
그래도 배송까지 해서 확인을 헀는데... 그래서 로봇청소기 컨트롤 기능을 추가하기로 했다 ㅎㅎ
시리얼모니터를 확인하면
BB445540
Protocol=NEC Address=0x5540 Command=0x44 Raw-Data=0xBB445540 32 bits LSB first
Send with: IrSender.sendNEC(0x5540, 0x44, <numberOfRepeats>);
11EE5540
Protocol=NEC Address=0x5540 Command=0xEE Raw-Data=0x11EE5540 32 bits LSB first
Send with: IrSender.sendNEC(0x5540, 0xEE, <numberOfRepeats>);
EE115540
Protocol=NEC Address=0x5540 Command=0x11 Raw-Data=0xEE115540 32 bits LSB first
Send with: IrSender.sendNEC(0x5540, 0x11, <numberOfRepeats>);
66995540
Protocol=NEC Address=0x5540 Command=0x99 Raw-Data=0x66995540 32 bits LSB first
Send with: IrSender.sendNEC(0x5540, 0x99, <numberOfRepeats>);
친절하게 보내는 신호 보내는 법도 알려주는데
....
난
모르겠엉
그래서 깃허브를 뒤져서
찾아낸 간단한 IRremote 송신 방법!
#include "TinyIRSender.hpp"
const int irLED = 19;
void Home() {
sendNECMinimal(irLED, 0x5540, 0x11, 1);
}
위 시리얼 모니터 값을 보면 우리집 로봇 청소기가 사용한 protocol은 NEC다 .
그리고 친절하게 Address, Command를 알려준다.
그래서
sendNECMinimal(핀번호, Address, Command, 반복횟수);
를 입력하고 테스트하면 성공!
후해해해해해해햏
해해해해해해ㅐ햏
헤헤헤헤헤헤헿
후후후후후후후
히히히히히히히
트랜지스터 스위치로 사용하는 방법(3.3v)
요론 식으로 연결을 했다.
저 구리 표면은 테스터로 확인용인 점이다.
칼로 그 표면을 긁은 뒤 납땜을 해서 붙이면 잘 붙는다.(후라이팬에 계란 달라붙는것 같은 효과?)
집에 전에 사용하던 리모컨이 하나 더 있어서 그 리모컨을 개조 했는데 둘다 뜯으면
해당 부분이 다른데 이걸로 신호를 조절하는 것 같아 현재 사용하는 리모컨처럼 똑같이 만드어주고
작동확인을 하니 똑같은 리모컨처럼 작동을 했다.
트랜지스터는 예전 장난감에 붙어있던 것을 뽑아서 사용했다.
datasheet로 스펙을 확인한 뒤
붙였다
트랜지스터 작동확인을 위해서
빠르게 esp32에 연결한 뒤
void setup()
{
pinMode(18, OUTPUT);
digitalWrite(18, HIGH);
}
로 설정한 뒤 확인하니 잘 작동했다 ㅎㅎ
이제 빠르게 원래 사용하던 dht11이랑 IR LED도 붙여준 다음 빠르게 진행하면! 신셰계
마지막으로 홈어시스턴트에 추가하면 끝!
난 홈킷을 사용해서 시리한테 시킬거라 엔티티 추가를 했는데
홈어시스턴트만 이용할 거면 lovelace.yaml에 추가만 하면 돼!
#난 커스텀 버튼카드를 추가해서 아래처럼 작성했엏
- type: horizontal-stack
cards:
- type: 'custom:button-card'
icon: "mdi:chandelier"
aspect_ratio: '1/1'
size: 80%
name: "거실등"
tap_action:
action: call-service
service: mqtt.publish
service_data:
qos: 2
topic: "livingRoom/switch"
payload: "livSwitch"
haptic: 'light'
styles:
card:
- background: rgba(255,240,170,0.8)
border-radius: 10%
padding: 10%
grid:
- grid-template-areas: '"i" "n" "s"'
- grid-template-columns: 1fr
- grid-template-rows: 1fr min-content min-content
icon:
- color: rgb(242, 151, 39)
name:
- justify-self: start
- color: white
- font-weight: bold
- align-self: start
- text-shadow: 0px 0px 5px black
- width: 100%
전체 아두이노 코드
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include "TinyIRSender.hpp"
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char *ssid = "olleh_WiFi_BA83";
const char *password = "0000002583";
const char* ID = "테스트"; // Name of our device, must be unique
const char* TOPIC1 = "house/temper";
const char* TOPIC2 = "house/hum";
const char* TOPIC3 = "livingRoom/light";
const char* INTOPIC = "livingRoom/switch";
const char* mqttUser = "dragon";
const char* mqttPassword = "qazwsxedcrfvtgbyhnujm";
const char* broker = "172.30.1.48";
WiFiClient wclient;
PubSubClient client(wclient);
String msg = "";
char messages[50];
char val[20];
const int irLED = 19;
const int livingRoomSwitch = 18;
const int lightCheck = 13;
int lightVal = 0;
float oldTemp = 0;
// Connect to WiFi network
void setup_wifi() {
Serial.print("\nConnecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Received messages: ");
Serial.print(INTOPIC);
msg = "";
for(int i=0; i<length; i++){
//Serial.println((char)payload[i]);
msg += (char)payload[i];
}
Serial.println(msg);
Serial.println();
if (msg == "vclean") {
vClean();
} else if (msg == "livSwitch") {
livOn();
} else if (msg == "home") {
Home();
}
}
void Home() {
sendNECMinimal(irLED, 0x5540, 0x11, 1);
}
void vClean() {
//IrSender.sendNEC(0x5540, 0x44, 1);
sendNECMinimal(irLED, 0x5540, 0x44, 1);
}
void livOn() {
digitalWrite(livingRoomSwitch, HIGH);
delay(500);
digitalWrite(livingRoomSwitch, LOW);
}
// Reconnect to client
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(ID, mqttUser, mqttPassword)) {
Serial.println("connected");
Serial.print("Publishing to: ");
Serial.println(TOPIC1);
Serial.println('\n');
client.subscribe(INTOPIC);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("\n try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(livingRoomSwitch ,OUTPUT);
pinMode(irLED, OUTPUT);
Serial.begin(115200);
delay(100);
dht.begin();
setup_wifi(); // Connect to network
client.setServer(broker, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()){
reconnect();
}
client.loop();
float humi = dht.readHumidity();
float temp = dht.readTemperature();
if (oldTemp != temp) {
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print("ºC ");
Serial.print("Humidity: ");
Serial.print(humi);
Serial.println("% ");
//dtostrf(temp, 5, 1, val);
snprintf(messages, 75, "%.1f", temp);
client.publish(TOPIC1, messages);
//dtostrf(humi, 5, 1, val);
snprintf(messages, 75, "%.1f", humi);
client.publish(TOPIC2, messages);
oldTemp = temp;
}
/*
lightVal = analogRead(lightCheck);
Serial.print("checkLight: ");
Serial.println(lightVal);
if (analogRead(lightCheck) > 2000) {
snprintf(messages, 75, "%s", "on");
client.publish(TOPIC3, messages);
} else {
snprintf(messages, 75, "%s", "off");
client.publisj j j j h(TOPIC3, messages);
}
*/
delay(1000);
}
mqtt나 다른 HomeAssistant 관련글은 블로그에서 알아서 찾아보도록!
'스마트 홈 > esp32' 카테고리의 다른 글
MQTT 스마트 스위치 버전3 (서보모터) (0) | 2023.01.13 |
---|---|
Mqtt 스마트 스위치 문제 해결 (0) | 2022.07.27 |
Home Assistant - mqtt 스위치 수정 (0) | 2022.01.25 |
Esp32-cam 멀티 스트리밍2 - LTE로 보기 (4) | 2022.01.25 |
아버지 비닐 하우스 개폐기 외전(하나더 달기) - 진짜 최종 (0) | 2022.01.16 |