5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ダイソー スマホシャッターリモコン で ESP32のLEDを制御する。

Posted at

投稿日 2024年2月22日

参考記事 
https://lang-ship.com/blog/work/m5stickc-esp32-bluetooth-shutter-1-0-4/

目的 ダイソーのスマートフォンシャッターリモコンは200円と安い。これを使って、ESP32のLEDを制御する。スマートフォンシャッターリモコン.png

使用機材 
 ESP-WROOM-32E
 ダイソー スマホシャッターリモコン LOT.0505CC
 LED     1個 (16番ピン)
 抵抗 150Ω 1個
 ブレッドボード
 ジャンパーワイヤー

使用方法
 スケッチはほとんど同じだが、ESP32で使えることと、アンドロイド用シャッターリモコンで使用できる。
 シャッターリモコンのボタンを押せば、ESP32の16番ピンにつながれたLEDが光る。

結果
 ライブラリーや先人のプログラムを完全に理解しているわけでないため、初めは訳が分からないが、なんとかなった。
 LEDの出力をリレーに変え、産業機器のスタートボタンにする予定。

//
// A BLE client example that is rich in capabilities.
// There is a lot new capabilities implemented.
// author unknown
// updated by chegewara
// updated by kenzoos
//
#include "BLEDevice.h"
// The remote service we wish to connect to.
static BLEUUID serviceUUID("1812");
static boolean doConnect = false;
static boolean connected = false;
static boolean doScan = false;
static BLEAdvertisedDevice* myDevice;

#define LED_BUILTIN 16 //追記

static void notifyCallback(
BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData,
size_t length,
bool isNotify) {
Serial.print("Notify callback for characteristic ");
Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str());
Serial.print("(");
Serial.print(pBLERemoteCharacteristic->getHandle());
Serial.print(") of data length ");
Serial.print(length);
Serial.print(" data: ");
for (int i = 0; i < length; i++) {
Serial.printf("%02X ", pData[i]);
}
Serial.println();

if (pData[0] == 2) {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for 2 second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(5);
Serial.println("LED on off ");
}
}
class MyClientCallback : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {
}
void onDisconnect(BLEClient* pclient) {
connected = false;
Serial.println("onDisconnect");
}
};
bool connectToServer() {
Serial.print("Forming a connection to ");
Serial.println(myDevice->getAddress().toString().c_str());
BLEClient* pClient = BLEDevice::createClient();
Serial.println(" - Created client");
pClient->setClientCallbacks(new MyClientCallback());
// Connect to the remove BLE Server.
pClient->connect(myDevice); // if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private)
Serial.println(" - Connected to server");
// Obtain a reference to the service we are after in the remote BLE server.
BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
if (pRemoteService == nullptr) {
Serial.print("Failed to find our service UUID: ");
Serial.println(serviceUUID.toString().c_str());
pClient->disconnect();
return false;
}
Serial.println(" - Found our service");
std::map* mapCharacteristics = pRemoteService->getCharacteristicsByHandle();
for (std::map::iterator i = mapCharacteristics->begin(); i != mapCharacteristics->end(); ++i) {
if (i->second->canNotify()) {
Serial.println(" - Add Notify");
i->second->registerForNotify(notifyCallback);
}
}
connected = true;
return true;
}
//
// Scan for BLE servers and find the first one that advertises the service we are looking for.
//
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
//
// Called for each advertising BLE server.
//
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.print("BLE Advertised Device found: ");
Serial.println(advertisedDevice.toString().c_str());
// We have found a device, let us now see if it contains the service we are looking for.
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
BLEDevice::getScan()->stop();
myDevice = new BLEAdvertisedDevice(advertisedDevice);
doConnect = true;
doScan = true;
} // Found our server
} // onResult
}; // MyAdvertisedDeviceCallbacks
void setup() {
Serial.begin(9600);
Serial.println("Starting Arduino BLE Client application...");
BLEDevice::init("");
// Retrieve a Scanner and set the callback we want to use to be informed when we
// have detected a new device. Specify that we want active scanning and start the
// scan to run for 5 seconds.
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setInterval(1349);
pBLEScan->setWindow(449);
pBLEScan->setActiveScan(true);
pBLEScan->start(5, false);
pinMode(LED_BUILTIN, OUTPUT);
} // End of setup.
// This is the Arduino main loop function.
void loop() {
// If the flag "doConnect" is true then we have scanned for and found the desired
// BLE Server with which we wish to connect. Now we connect to it. Once we are
// connected we set the connected flag to be true.
if (doConnect == true) {
if (connectToServer()) {
Serial.println("We are now connected to the BLE Server.");
} else {
Serial.println("We have failed to connect to the server; there is nothin more we will do.");
}
doConnect = false;
}
// If we are connected to a peer BLE Server, update the characteristic each time we are reached
// with the current time since boot.
if (connected) {
} else if (doScan) {
BLEDevice::getScan()->start(0); // this is just eample to start scan after disconnect, most likely there is better way to do it in arduino
}
delay(1000); // Delay a second between loops.
} // End of loop

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?