팜 시스템

아두이노를 활용한 템레그램 메세지 전송

user1016 2025. 5. 8. 15:48

 드디어 교재를 받고 첫 본격적인 스터디 활동 시작입니다. 그런줄 알았으나 스터디 일정과 연휴가 겹쳐 저희는 비대면으로 스터디를 진행하기로 했습니다. 심지어 교재도 한권 뿐이라 저희는 본격적인 여러 작품들을 만들어 보기 전 흥미를 불러일으킬 수 있게 목차를 보고 재밌어 보이는 작품의 부품을 분석,사용법 조사를 실시하였습니다. 실제로 만들어 보고 변형도 해보고 싶으나 아직 부품이 도착하지 않은 관계로 이론적인 내용 조사만 실시하였습니다.

 

제가 이번에 분석해볼 작품은 "가속도 자이로센서로 움직임을 감지하면 텔레그램으로 메세지 전송하기."입니다. 제가 드론을 중고등학교때 부터 관심이 많았고 드론의 핵심부품중 하나가 자이로센서인 만큼 이를 iot 기술과 접목시켜 드론이 어딘가에 충돌해 자이로센서값에 큰 변화가 생겨 이를 바로 드론 통제 센터에 보내는 시스템을 만들 수 있지 않을까 생각했고 그래서 이 작품을 첫 분석 작품으로 선정했습니다.

 

 

1.아두이노 WEMOS D1 R1 보드 활용법

아두이노 WEMOS D1 R1 보드는  ESP8266칩이 들어있는 개발보드로 아두이노 우노와 동일한 크기와 핀 배열로 구성되어있습니다. 통합개발환경에서 사용함과 32bit 80Mhz의 빠른 속도, Wifi 기능이 있습니다. Wifi는 2.5Ghz만 접속 가능합니다.

 

D1 R1 PIN Function ESP8266 PIN 기능 설명
D0 RX GPIO3 데이터를 받는 핀 (Serial 통신)
D1 TX GPIO1 데이터를 보내는 핀 (Serial 통신)
D2 IO GPIO16 Input/Output: 입력 또는 출력 핀
D3 IO,SCL GPIO5 I2C 통신에서 데이터 전송 타이밍을 맞추는 신호선
D4 IO,SDA GPIO4 I2C 통신에서 데이터를 주고받는 선
D5 IO,SCK GPIO14 SPI 통신에서 클럭(시계) 신호
D6 IO,MISO GPIO12 SPI 통신에서 "슬레이브 → 마스터" 방향 데이터
D7 IO,MOSI GPIO13 SPI 통신에서 "마스터 → 슬레이브" 방향 데이터
D8 IO,Pull-up GPIO0 입력 핀이 떠 있지 않도록 내부적으로 전원(Vcc)에 연결함
D9 IO,Pull-up,
BUILTIN_LED
GPIO2 보드에 내장된 LED
D10 IO,Pull-down,SS GPIO15 입력 핀이 떠 있지 않도록 GND에 연결함
SPI 통신에서 슬레이브를 선택하는 신호선
A0 Analog Input A0 아날로그 입력: 아날로그 센서 값 등을 읽을 수 있음 (0~1023 등)
G Ground GND 접지: 전기 회로의 기준점 (0V)
5V 5V - 5볼트 전원
3.3V 3.3V 3.3V 3.3볼트 전원
RST Reset RST 보드 초기화, 재시작 시키는 핀

 

 

2.MPU6050 가속도 자이로센서 모듈 활용법

위의 사진이MPU6050의 모습입니다. 이 부품은 자속도 자이로 센서를 이용하여 물체의 기울어진 정도, 회전 정도를 알아내는 센서이입니다.

MPU6050모듈가속도 3축, 자이로 3축, 온도센서 7가지를 포함하고 있습니다. 온도센서는 왜 필요한가? 라고 생각할 수 있지만 가속도,자이로 값은 온도에 영향을 받을수 있기 때문에 포함되어 있습니다. (일반적인 경우에는 온도에 영향을 받지 않는다고 합니다.) 이러한 센서 값들은 ADC에 의해 16비트 값들로 레지스터에 저장되고 FIFO(First In First Out)를 거쳐 I2C의 SDA핀을 이용해 데이터를 전달하게 됩니다. MPU6000,6500은 SPI와 I2C통신 둘다 지원하지만 6050은 I2C 통신만 지원한다는 점을유의해야합니다.

저희는 MPU6050을 사용하기 위해 MPU6050_light 라이브러리를 설치해야합니다.

 

4.텔레그램 연동법

 메세지를 전송할 수 있는 플랫폼에는 텔레그램 외에 카카오톡,SLACK등 여러가지가 있습니다. 그중 텔레그램개인이 서버 없이 사용할 수 있는 유일한 메신저 입니다. 또한 메신저에서 아두이노로 제어메세지를 보내는것 또한 가능합니다. 

 우선 telegram이라는 라이브러리가 필요합니다. 이후 텔레그램에 접속해 BotFather에 들어가 새로운 봇을 생성하고 API를 발급 받습니다. https://api.telegram.org/bot발급받은API/getUpdates에 접속하고 다시 텔레그램으로 들어가 아무 메세지나 전송합니다. 이후 웹 브라우저에서 F5를 눌러 새로고침을 하면 id를 확인 가능합니다.

 

5. 코드분석

<MPU6050 가속도 자이로센서의 가속도 값 확인코드>

#include "Wire.h"  //I2C 통신용 라이브러리
#include <MPU6050_light.h>  //MPU6050제어 라이브러리

MPU6050 mpu(Wire);  // MPU6050값 가져오는 변수 mpu 생성, Wire= I2C통신을 통해 동작하는 mpu

void setup() {
  Serial.begin(115200);
  Wire.begin();
  mpu.begin();
  mpu.calcOffsets(true, true); // 가속도와 자이로 모두에 대한 오차 제거 수행(센서를 평평하게 놔두고 시작해야함)
}

void loop() {
  mpu.update(); // 센서 값을 갱신
  float ax = mpu.getAccX(); //mpu 객체에서 X축 방향의 가속도 값을 읽어서 ax라는 변수에 저장
  Serial.println(ax); //X축 가속도 값을 시리얼 모니터에 출력
  delay(10);
}

<센서의 움직임이 검출되면 텔레그램으로 메세지 전송하기>

#include "Wire.h"
#include <MPU6050_light.h>

MPU6050 mpu(Wire);

float AccBuf[2]; //크기가 2인 실수형 배열 선언
int bufCnt = 0; //몇번째 값을 저장중인지 세는 용도

void setup() {
  Serial.begin(115200);
  Wire.begin();
  mpu.begin();
  mpu.calcOffsets(true, true);
}

void loop() {
  mpu.update();
  AccBuf[bufCnt++] = mpu.getAccX(); // x축 가속도 값 읽어 AccBuf[0]에 저장,이후 bufCnt 값 1 증가
  if (bufCnt == 2) bufCnt = 0; //bufCnt 2 되면 0으로

  if (abs(AccBuf[0] - AccBuf[1]) >= 0.1) { 
    Serial.println("센서 움직임!!!"); //x 축 가속도의 변화의 절댓값이 0.1 이상이면 글 출력
    mpu.update();//센서 갱신
    AccBuf[0] = mpu.getAccX();
    AccBuf[1] = mpu.getAccX();
    bufCnt = 0;
  }

  delay(10);
}

<센서 움직임 검출되면 텔레그램으로 메세지 전송하기>

#include <ESP8266WiFi.h> // ESP8266 보드의 Wi-Fi 기능 사용
#include <WiFiClientSecure.h> // HTTPS(보안 통신) 클라이언트
#include <UniversalTelegramBot.h> // 텔레그램 봇 제어용 라이브러리
#include <ArduinoJson.h> // JSON 데이터 처리용 (텔레그램 메시지 해석 등에 필요)
#include "Wire.h" // I2C 통신용 라이브러리 (MPU6050용)
#include <MPU6050_light.h> // MPU6050 센서 제어용 경량 라이브러리

MPU6050 mpu(Wire);

float AccBuf[2];
int bufCnt = 0;

const char* ssid = "jmc"; // 연결할 Wi-Fi 이름
const char* password = "123456789"; // 연결할 Wi-Fi 비밀번호


#define BOTtoken "5173098258:AAGRWlXxCrhgWNXFlxyAcAnE0xRRM2bxRm" // 본인의 텔레그램 봇 API 토큰
#define CHAT_ID "730238165" // 메시지를 보낼 사용자 또는 그룹의 챗 ID

X509List cert(TELEGRAM_CERTIFICATE_ROOT); // 텔레그램 서버 인증서 설정

WiFiClientSecure client; // 보안 통신용 클라이언트
UniversalTelegramBot bot(BOTtoken, client); // 텔레그램 봇 객체 생성

void setup() {
  Serial.begin(115200);

  Wire.begin();
  mpu.begin();
  mpu.calcOffsets(true, true);

  configTime(0, 0, "pool.ntp.org"); // NTP 서버로 시간 동기화
  client.setTrustAnchors(&cert);  // HTTPS 인증서 설정

  WiFi.mode(WIFI_STA); // Wi-Fi를 스테이션(클라이언트) 모드로 설정
  WiFi.begin(ssid, password);  // Wi-Fi 연결 시도

  while (WiFi.status() != WL_CONNECTED) { //연결될 때까지 반복
    delay(1000); 
    Serial.println("Connecting to WiFi..");
  }

  Serial.println(WiFi.localIP()); // 연결된 IP 주소 출력
}

void loop() {
  mpu.update();
  AccBuf[bufCnt++] = mpu.getAccX();
  if (bufCnt == 2) bufCnt = 0;

  if (abs(AccBuf[0] - AccBuf[1]) >= 0.1) {
    Serial.println("센서 움직임!!!");
    bot.sendMessage(CHAT_ID, "센서 움직임!!!", ""); // 텔레그램으로 메시지 전송

    mpu.update();
    AccBuf[0] = mpu.getAccX();
    AccBuf[1] = mpu.getAccX();
    bufCnt = 0;
  }

  delay(10000);
}


이렇게 코드 분석까지 해봤습니다. 이를 활용해 드론이 바라보는 방향, 드론과 초음파 센서를 결합해 텔레그램으로 특정 물체 접근 신호등도 만들어 보고 싶습니다. 다음에는 본격적으로 부품들을 활용한 아두이노의 기본 개념들을 실습 해보겠습니다.