임베디드 시스템 프로젝트 7: Android와 함께하는 ESP32 블루투스 - 이거 했음. DHT22로 실행
Fernaldi Fauzie
좋아요! 이번에는 이 스토리의 제목처럼 ESP32 블루투스를 실험해 보겠습니다. 더 정확히 말하면 ESP32와 Android 스마트폰 간에 데이터를 교환해 보겠습니다. BMP280 센서에서 Android 스마트폰으로 데이터를 전송하거나, Android 스마트폰의 메시지를 사용하여 켜기/끄기, Android 스마트폰으로 ESP32에 인사하는 등 여러 가지를 시도해 보겠습니다(실제로는 꽤 간단하지만요)
블루투스?
간단히 말해서, 블루투스는 고정 및 모바일 기기 간에 단거리에서 데이터를 교환하는 데 사용되는 무선 기술 개인 영역 네트워크(PAN) 표준입니다. 참고로, 블루투스는 2.4GHz 대역에서 작동합니다.
시작해 봅시다!
이 스토리에서는 이 randomnerdtutorials 링크를 참조로 사용합니다! 이 스토리에서 필요한 것은 다음과 같습니다.
- ESP32
- 마이크로 USB 케이블
- 브레드보드
- Android 스마트폰
- LED
- 330옴 저항
- BMP280 센서
Android 스마트폰에 Bluetooth Terminal 애플리케이션을 설치해야 합니다. 쉽게 하기 위해 Play 스토어에서 제공되는 이 Serial Bluetooth Terminal 애플리케이션을 추천합니다.
계속하기 전에 다음 회로도를 따라 회로를 조립해야 합니다.
LED를 GPIO17에, BMP280 VCC를 ESP32 3V3에, BMP280 GND를 ESP32 GND에, BMP280 SCL을 GPIO22에, BMP280 SDA를 GPIO21에 연결합니다.
회로도
내 간단한 회로
다음으로 이 코드를 사용하여 ESP32 Bluetooth와 Android의 Bluetooth를 활용해야 합니다.
// Load libraries
#include "BluetoothSerial.h"
#include <Wire.h>
#include <Adafruit_BMP280.h>
// Check if Bluetooth configs are enabled
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
// Bluetooth Serial object
BluetoothSerial SerialBT;
// GPIO where LED is connected to
const int ledPin = 17;
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
// Handle received and sent messages
String message = "";
char incomingChar;
String temperatureString = "";
// Timer: auxiliar variables
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // interval at which to publish sensor readings
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
// Bluetooth device name
SerialBT.begin("ESP32");
Serial.println("The device started, now you can pair it with bluetooth!");
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
void loop() {
unsigned long currentMillis = millis();
// Send temperature readings
if (currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
SerialBT.print(F("Temperature = "));
SerialBT.print(bmp.readTemperature());
SerialBT.print(" *C\n");
SerialBT.print(F("Pressure = "));
SerialBT.print(bmp.readPressure());
SerialBT.print(" Pa\n");
SerialBT.print(F("Approx altitude = "));
SerialBT.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
SerialBT.print(" m\n");
}
// Read received messages
if (SerialBT.available()){
char incomingChar = SerialBT.read();
if (incomingChar != '\n'){
message += String(incomingChar);
}
else{
message = "";
}
Serial.write(incomingChar);
}
// Check received message and control output accordingly
if (message =="led_on"){
digitalWrite(ledPin, HIGH);
}
else if (message =="led_off"){
digitalWrite(ledPin, LOW);
}
else if (message =="hello"){
SerialBT.print("hello, Fernaldi!");
}
delay(20);
}
간단히 말해서 Serial Bluetooth Terminal을 사용하는 단계는 다음과 같습니다.
- 스마트폰의 Bluetooth를 켭니다. 그런 다음 Serial Bluetooth Terminal 애플리케이션을 엽니다.
- 장치로 이동합니다.
- 설정 아이콘을 클릭한 다음 새 장치 페어링을 선택합니다. ESP32와 페어링합니다.
- 마지막으로 Terminal로 돌아갑니다.
또한 다음과 같은 코드의 일부를 지적하고 싶습니다.
// Bluetooth Serial 객체
BluetoothSerial SerialBT;
이 코드는 SerialBT라는 BluetoothSerial 인스턴스를 만드는 것입니다.
SerialBT.begin("ESP32"); //Bluetooth 장치 이름
ESP32를 "ESP32"라는 이름의 Bluetooth 장치로 초기화합니다.
SerialBT.print(F("Temperature = "));
SerialBT.print(bmp.readTemperature());
SerialBT.print(" *C\n");
SerialBT.print(F("Pressure = "));
SerialBT.print(bmp.readPressure());
SerialBT.print(" Pa\n");
SerialBT.print(F("Approx altitude = "));
SerialBT.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
SerialBT.print(" m\n");
}
이 코드는 사실 꽤 간단하다고 생각합니다. 해수면 기압(1013.25 mbar)을 사용하여 온도, 기압, 대략적인 고도를 Android 스마트폰으로 보내는 코드입니다.
// 수신 메시지 읽기
// Read received messages
if (SerialBT.available()){
char incomingChar = SerialBT.read();
if (incomingChar != '\n'){
message += String(incomingChar);
}
else{
message = "";
}
Serial.write(incomingChar);
}
이 코드는 수신 메시지를 읽어 LED 켜기/끄기나 인사말과 같이 메시지의 목적이 무엇인지 파악하는 것입니다!
// 수신 메시지를 확인하고 그에 따라 출력을 제어합니다
// Check received message and control output accordingly
if (message =="led_on"){
digitalWrite(ledPin, HIGH);
}
else if (message =="led_off"){
digitalWrite(ledPin, LOW);
}
else if (message ="hi"){
SerialBT.print("hi, Fernaldi!");
}
delay(20);
이것은 수신된 메시지를 확인하고 그에 따라 출력을 제어하는 것입니다. 메시지가 "led_on"이면 LED를 켭니다. 그렇지 않으면 메시지가 "led_off"이면 LED를 끕니다. 그렇지 않으면 메시지가 "hi"이면 인사말 "hi, Fernaldi!"를 보냅니다.
이제 재미있게 놀 시간입니다!
Android를 ESP32에 연결한 후 ESP32에서 온도, 기압 및 대략적인 고도를 얻을 수 있습니다!
온도, 기압 및 대략적인 고도
다음으로 ESP32에 인사말("hello")을 보낼 수 있습니다. ESP32는 결과로 "hello, Fernaldi" 메시지를 보냅니다!
ESP32에 인사하기
안드로이드 스마트폰의 "hello" 메시지는 Arduino IDE의 직렬 모니터에서 볼 수 있습니다. 정확한 메시지를 받을 수 있도록 올바른 보드(제 경우에는 115200 보드)를 사용해야 합니다.
"led_on" 메시지를 보내 LED를 켜고 "led_off" 메시지를 보내 LED를 끌 수도 있습니다!
LED 켜기 및 끄기
결론적으로 ESP32 Bluetooth를 사용하면 Android 스마트폰의 도움으로 BMP280 센서 판독값을 Android 스마트폰으로 보내거나 Android 스마트폰의 메시지로 LED를 켜거나 끄는 등 많은 작업을 수행할 수 있습니다. 게다가 Arduino IDE(PC)의 직렬 모니터로 직렬 Bluetooth 터미널 애플리케이션(Android 스마트폰)과 간단한 채팅을 수행하고 ESP32가 "hello"와 같은 특정 메시지에 응답하도록 할 수도 있습니다.
이제 이야기가 끝난 것 같습니다. 이 이야기가 여러분에게 유익했으면 좋겠습니다. 호기심을 유지하는 것을 잊지 마세요. ESP32에는 탐험할 수 있는 것이 아직 많이 있으니까요! 다음 스토리에서 뵙겠습니다! 행운을 빌고, 재미있게 보내는 것을 잊지 마세요!
'ESP32' 카테고리의 다른 글
ESP32 실시간 클록 모듈(DS1302) RTC 모듈 (8) | 2024.10.24 |
---|---|
ESP32 Arduino: 타이머 인터럽트 (6) | 2024.10.24 |
ESP32 타이머 및 타이머 인터럽트 (4) | 2024.10.24 |
ESP32: Bluetooth를 사용하여 WiFi 연결 설정 (6) | 2024.10.23 |
ESP32 터치 버튼 시작하기 [코드 및 배선 다이어그램 포함] (11) | 2024.10.22 |
4자리 7세그먼트 디스플레이 라이브러리 74HC595 (11) | 2024.10.22 |
ESP32 전원 공급 방법 3가지 (3) | 2024.10.20 |
ESP32 클라이언트-서버 Wi-Fi 통신(두 보드 간) (6) | 2024.10.18 |
더욱 좋은 정보를 제공하겠습니다.~ ^^