라인 씽스의 아이디어를 고민하고 있습니다.
LINE Things는 LINE에서 사용할 수 있는 새로운 IoT 플랫폼입니다.블루투스 LE를 사용하여 IoT 장치에 연결하면 LINFF와 LINE Bot을 통해 의사소통을 할 수 있습니다.
LINE Things를 재미있게 사용하고 싶네요.
LINE Things만 있는 장면을 생각해봤어요.
와이파이도 아니고 LTE도 아닌데 블루투스 LE를 이용한 라인 통신의 특징이 무엇인지 고민했다.
설비는 많은 사람들이 사용하는 것이 아니라 개인이 사용하기에 적합한 설비다.
사용하는 곳은 와이파이가 없는 곳에서 사용해 다른 장치와 차별화할 수 있다.
LINE Things의 용도를 고려했습니다.
외출할 때 개인이 휴대하는 설비'에 광권의 용도를 고려했다.
차에 가져간 장비는 M5stack입니다.
와이버에 네온사인을 달아 유리차를 사이에 두고도 M5 스택에 내장된 홀센서가 반응하지 않았는지 확인했다.
브러시에 네온사인 자석을 달았고, 유리창을 사이에 두고 차 안에 설치된 M5 Stack의 홀센서가 반응했는지 예비 검토를 진행했다.그래, 내가 반응할게.#M5stack#LINEThings-미지홍(@mikihiroshi 77)pic.twitter.com/19BgzzAG0j
좋아, 반응했어.
최종 이미지는 다음 그림입니다
M5stack은 LINE Things의 장치로서 역할을 발휘하고 Enebular로'졸리게'이미지를 보내는 연습p>
template 노드 근처에서 그림 보내기 지시
{
"replyToken": "{{replyToken}}",
"messages": [
{
"type": "image",
"originalContentUrl": "https://xxxxxxxxxxxxxxx.xxxxx.xx/wakeup.JPG",
"previewImageUrl": "https://xxxxxxxxxxxxxxx.xxxxx.xx/wakeup.JPG"
}
]
}
M5stack 버튼을 누르면 이미지가 LINE에 전송됩니다.
영상은 이거예요.
M5 Stack에 내장된Hall sensor의 반응값이 높아지면 LINE에 이미지를 보내는 구조를 고려h2>
Arduino에서 다음과 같이 LINE Things 프로그램과 Hall sensor 동작의 프로그램을 병합하였으나 아직 동작하지 않습니다br/>
움직이고 싶어요.이것은 앞으로의 과제입니다.
setup.ino
#include <M5Stack.h>
#include <BLEServer.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// Device Name: Maximum 30 bytes
#define DEVICE_NAME "MyName_M5Stack"
// User service UUID: Change this to your generated service UUID
#define USER_SERVICE_UUID "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
// User service characteristics
#define WRITE_CHARACTERISTIC_UUID "E9062E71-9E62-4BC6-B0D3-35CDCD9B027B"
#define NOTIFY_CHARACTERISTIC_UUID "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
// PSDI Service UUID: Fixed value for Developer Trial
#define PSDI_SERVICE_UUID "E625601E-9E55-4597-A598-76018A0D293D"
#define PSDI_CHARACTERISTIC_UUID "26E2B12B-85F0-4F3F-9FDD-91D114270E6E"
#define TEXT_X (M5.Lcd.width() / 2)
#define TEXT_Y (M5.Lcd.height() / 2 / 2)
BLEServer* thingsServer;
BLESecurity *thingsSecurity;
BLEService* userService;
BLEService* psdiService;
BLECharacteristic* psdiCharacteristic;
BLECharacteristic* writeCharacteristic;
BLECharacteristic* notifyCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
class serverCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
class writeCallback: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *bleWriteCharacteristic) {
std::string value = bleWriteCharacteristic->getValue();
if ((char)value[0] <= 1) {
if ((char)value[0] == 1) {
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, WHITE);
M5.Lcd.setTextColor(BLACK);
M5.Lcd.setTextSize(4);
M5.Lcd.drawString("LED: ON ", TEXT_X, TEXT_Y);
}
else {
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(4);
M5.Lcd.drawString("LED: OFF", TEXT_X, TEXT_Y);
}
}
}
};
void setup() {
M5.begin();
BLEDevice::init("");
BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT_NO_MITM);
// Security Settings
BLESecurity *thingsSecurity = new BLESecurity();
thingsSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND);
thingsSecurity->setCapability(ESP_IO_CAP_NONE);
thingsSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
setupServices();
startAdvertising();
// M5Stack LCD Setup
M5.Lcd.setTextDatum(MC_DATUM);
M5.Lcd.clear(BLACK);
M5.Lcd.qrcode("https://line.me/R/nv/things/deviceLink", 110, 130, 100, 3);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Ready to Connect", TEXT_X, TEXT_Y);
Serial.println("Ready to Connect");
}
void loop() {
M5.update();
if (M5.BtnB.wasPressed()) {
uint8_t btnValue = 1;
notifyCharacteristic->setValue(&btnValue, 1);
notifyCharacteristic->notify();
} else if (M5.BtnB.wasReleased()) {
//uint8_t btnValue = 0;
//notifyCharacteristic->setValue(&btnValue, 1);
//notifyCharacteristic->notify();
}
// Disconnection
if (!deviceConnected && oldDeviceConnected) {
delay(500); // Wait for BLE Stack to be ready
thingsServer->startAdvertising(); // Restart advertising
oldDeviceConnected = deviceConnected;
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, BLACK);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Ready to Connect", TEXT_X, TEXT_Y);
}
// Connection
if (deviceConnected && !oldDeviceConnected) {
oldDeviceConnected = deviceConnected;
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, BLACK);
M5.Lcd.setTextColor(GREEN);
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Connected", TEXT_X, TEXT_Y);
}
}
void setupServices(void) {
// Create BLE Server
thingsServer = BLEDevice::createServer();
thingsServer->setCallbacks(new serverCallbacks());
// Setup User Service
userService = thingsServer->createService(USER_SERVICE_UUID);
// Create Characteristics for User Service
writeCharacteristic = userService->createCharacteristic(WRITE_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_WRITE);
writeCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
writeCharacteristic->setCallbacks(new writeCallback());
notifyCharacteristic = userService->createCharacteristic(NOTIFY_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_NOTIFY);
notifyCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
BLE2902* ble9202 = new BLE2902();
ble9202->setNotifications(true);
ble9202->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
notifyCharacteristic->addDescriptor(ble9202);
// Setup PSDI Service
psdiService = thingsServer->createService(PSDI_SERVICE_UUID);
psdiCharacteristic = psdiService->createCharacteristic(PSDI_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ);
psdiCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
// Set PSDI (Product Specific Device ID) value
uint64_t macAddress = ESP.getEfuseMac();
psdiCharacteristic->setValue((uint8_t*) &macAddress, sizeof(macAddress));
// Start BLE Services
userService->start();
psdiService->start();
}
void startAdvertising(void) {
// Start Advertising
BLEAdvertisementData scanResponseData = BLEAdvertisementData();
scanResponseData.setFlags(0x06); // GENERAL_DISC_MODE 0x02 | BR_EDR_NOT_SUPPORTED 0x04
scanResponseData.setName(DEVICE_NAME);
thingsServer->getAdvertising()->addServiceUUID(userService->getUUID());
thingsServer->getAdvertising()->setScanResponseData(scanResponseData);
thingsServer->getAdvertising()->start();
}
/************************************************************************
M5StackFire internal Hall sensor
************************************************************************/
#define M5STACKFIRE_SPEAKER_PIN 25 // speaker DAC, only 8 Bit
#define HORIZONTAL_RESOLUTION 320
#define VERTICAL_RESOLUTION 240
#define POSITION_OFFSET_Y 20
#define SIGNAL_LENGTH HORIZONTAL_RESOLUTION
uint16_t oldSignal[SIGNAL_LENGTH];
uint16_t adcBuffer[SIGNAL_LENGTH];
float ESP32_hallRead()
{
float value = 0;
int count = 400;
// mean value filter
for (int n = 0; n < count; n++) value += hallRead();
return value / count * 10;
}
float HallOffset = 0;
void setup1()
{
dacWrite(M5STACKFIRE_SPEAKER_PIN, 0); // make sure that the speaker is quite
M5.Lcd.begin();
M5.Lcd.fillScreen( BLACK );
M5.Lcd.fillRect(10, 1, 150, 160, BLACK);
M5.Lcd.setCursor(0, 0);
M5.Lcd.setTextColor(BLUE, BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.println("ESP32 Hall sensor:");
HallOffset = ESP32_hallRead(); // callibrate the output value to the magnetic field at start up
M5.Lcd.setTextSize(2);
}
float LowPassFilteredValue=0;
void showSignal()
{
int n;
int oldx;
int oldy;
int oldSig;
int x, y;
for (n = 0; n < SIGNAL_LENGTH; n++)
{
x = n;
float value = ESP32_hallRead()- HallOffset;
LowPassFilteredValue+=(value-LowPassFilteredValue)*0.05;
M5.Lcd.setCursor(220, 1);
M5.Lcd.print((int)LowPassFilteredValue);M5.Lcd.print(" ");
y = map(value , -127, 127, VERTICAL_RESOLUTION, POSITION_OFFSET_Y);
if (n > 0)
{
// delete old line element
M5.Lcd.drawLine(oldx , oldSig, x, oldSignal[n], BLACK );
// draw new line element
if (n < SIGNAL_LENGTH - 1) // don't draw last element because it would generate artifacts
{
M5.Lcd.drawLine(oldx, oldy, x, y, GREEN );
}
}
oldx = x;
oldy = y;
oldSig = oldSignal[n];
oldSignal[n] = y;
//以下に磁石が近づいたらLINE BOTに通知する記述
if(LowPassFilteredValue>10){
notifyCharacteristic->notify();
}
//磁石が近づいたらLINE BOTに通知する記述ここまで
}
}
//void loop()
//{
// showSignal();
//}
창의1 향후 예정
- 운행 과정에서 두리번거리지 않고 누르는 스마트폰 스위치, 전기 시스템을 개조하지 않아도 반응하는 스위치로 사용용도를 고려한다.졸음을 방지하다.신경쇠약 놀이.위치 태그를 이동합니다.docomo 기지국의 위치 정보를 이용한 API를 사용하면 가능할 수도 있습니다.근데 내비게이션이 있어서 필요 없어요.
창의 2에 대한 향후 예정
- 데이터베이스를 사용하여 멤버 4명의 득점을 서로 LINE BOT를 통해 알릴 수 있다.시계형의 멋스러운 제품은 2만 엔가량 골프장에서 팔렸다.하지만 멤버 4명의 점수를 서로 공유할 수 있는 기능이 없어 이 아이디어를 애니메이션으로 만들어 라인 씽스 미니어워드(2019년 9월 8일 응모)에 응모했다.코드가 실행되지 않았습니다.생각만으로 응모하다.
비디오
창의력 3에 대한 향후 예정
- 누수 센서, 습도 센서, 냄새 센서를 조사했지만 센서가 원래 종이 기저귀에 넣었다면 아프거나 다치지 않았을까?더 좋은 방법 없을까?
창의력 4에 대한 향후 예정
- 허용 값이 데이터베이스에 포함됩니다.Firebase 공부해.라인 씽스의 협업은 없었지만 이미 세계적으로 개발품이 많고 경쟁도 치열하다.
움직이고 싶어요.이것은 앞으로의 과제입니다.
#include <M5Stack.h>
#include <BLEServer.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// Device Name: Maximum 30 bytes
#define DEVICE_NAME "MyName_M5Stack"
// User service UUID: Change this to your generated service UUID
#define USER_SERVICE_UUID "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
// User service characteristics
#define WRITE_CHARACTERISTIC_UUID "E9062E71-9E62-4BC6-B0D3-35CDCD9B027B"
#define NOTIFY_CHARACTERISTIC_UUID "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
// PSDI Service UUID: Fixed value for Developer Trial
#define PSDI_SERVICE_UUID "E625601E-9E55-4597-A598-76018A0D293D"
#define PSDI_CHARACTERISTIC_UUID "26E2B12B-85F0-4F3F-9FDD-91D114270E6E"
#define TEXT_X (M5.Lcd.width() / 2)
#define TEXT_Y (M5.Lcd.height() / 2 / 2)
BLEServer* thingsServer;
BLESecurity *thingsSecurity;
BLEService* userService;
BLEService* psdiService;
BLECharacteristic* psdiCharacteristic;
BLECharacteristic* writeCharacteristic;
BLECharacteristic* notifyCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
class serverCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
class writeCallback: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *bleWriteCharacteristic) {
std::string value = bleWriteCharacteristic->getValue();
if ((char)value[0] <= 1) {
if ((char)value[0] == 1) {
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, WHITE);
M5.Lcd.setTextColor(BLACK);
M5.Lcd.setTextSize(4);
M5.Lcd.drawString("LED: ON ", TEXT_X, TEXT_Y);
}
else {
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(4);
M5.Lcd.drawString("LED: OFF", TEXT_X, TEXT_Y);
}
}
}
};
void setup() {
M5.begin();
BLEDevice::init("");
BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT_NO_MITM);
// Security Settings
BLESecurity *thingsSecurity = new BLESecurity();
thingsSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND);
thingsSecurity->setCapability(ESP_IO_CAP_NONE);
thingsSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
setupServices();
startAdvertising();
// M5Stack LCD Setup
M5.Lcd.setTextDatum(MC_DATUM);
M5.Lcd.clear(BLACK);
M5.Lcd.qrcode("https://line.me/R/nv/things/deviceLink", 110, 130, 100, 3);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Ready to Connect", TEXT_X, TEXT_Y);
Serial.println("Ready to Connect");
}
void loop() {
M5.update();
if (M5.BtnB.wasPressed()) {
uint8_t btnValue = 1;
notifyCharacteristic->setValue(&btnValue, 1);
notifyCharacteristic->notify();
} else if (M5.BtnB.wasReleased()) {
//uint8_t btnValue = 0;
//notifyCharacteristic->setValue(&btnValue, 1);
//notifyCharacteristic->notify();
}
// Disconnection
if (!deviceConnected && oldDeviceConnected) {
delay(500); // Wait for BLE Stack to be ready
thingsServer->startAdvertising(); // Restart advertising
oldDeviceConnected = deviceConnected;
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, BLACK);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Ready to Connect", TEXT_X, TEXT_Y);
}
// Connection
if (deviceConnected && !oldDeviceConnected) {
oldDeviceConnected = deviceConnected;
M5.Lcd.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height() / 2, BLACK);
M5.Lcd.setTextColor(GREEN);
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Connected", TEXT_X, TEXT_Y);
}
}
void setupServices(void) {
// Create BLE Server
thingsServer = BLEDevice::createServer();
thingsServer->setCallbacks(new serverCallbacks());
// Setup User Service
userService = thingsServer->createService(USER_SERVICE_UUID);
// Create Characteristics for User Service
writeCharacteristic = userService->createCharacteristic(WRITE_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_WRITE);
writeCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
writeCharacteristic->setCallbacks(new writeCallback());
notifyCharacteristic = userService->createCharacteristic(NOTIFY_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_NOTIFY);
notifyCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
BLE2902* ble9202 = new BLE2902();
ble9202->setNotifications(true);
ble9202->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
notifyCharacteristic->addDescriptor(ble9202);
// Setup PSDI Service
psdiService = thingsServer->createService(PSDI_SERVICE_UUID);
psdiCharacteristic = psdiService->createCharacteristic(PSDI_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ);
psdiCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED);
// Set PSDI (Product Specific Device ID) value
uint64_t macAddress = ESP.getEfuseMac();
psdiCharacteristic->setValue((uint8_t*) &macAddress, sizeof(macAddress));
// Start BLE Services
userService->start();
psdiService->start();
}
void startAdvertising(void) {
// Start Advertising
BLEAdvertisementData scanResponseData = BLEAdvertisementData();
scanResponseData.setFlags(0x06); // GENERAL_DISC_MODE 0x02 | BR_EDR_NOT_SUPPORTED 0x04
scanResponseData.setName(DEVICE_NAME);
thingsServer->getAdvertising()->addServiceUUID(userService->getUUID());
thingsServer->getAdvertising()->setScanResponseData(scanResponseData);
thingsServer->getAdvertising()->start();
}
/************************************************************************
M5StackFire internal Hall sensor
************************************************************************/
#define M5STACKFIRE_SPEAKER_PIN 25 // speaker DAC, only 8 Bit
#define HORIZONTAL_RESOLUTION 320
#define VERTICAL_RESOLUTION 240
#define POSITION_OFFSET_Y 20
#define SIGNAL_LENGTH HORIZONTAL_RESOLUTION
uint16_t oldSignal[SIGNAL_LENGTH];
uint16_t adcBuffer[SIGNAL_LENGTH];
float ESP32_hallRead()
{
float value = 0;
int count = 400;
// mean value filter
for (int n = 0; n < count; n++) value += hallRead();
return value / count * 10;
}
float HallOffset = 0;
void setup1()
{
dacWrite(M5STACKFIRE_SPEAKER_PIN, 0); // make sure that the speaker is quite
M5.Lcd.begin();
M5.Lcd.fillScreen( BLACK );
M5.Lcd.fillRect(10, 1, 150, 160, BLACK);
M5.Lcd.setCursor(0, 0);
M5.Lcd.setTextColor(BLUE, BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.println("ESP32 Hall sensor:");
HallOffset = ESP32_hallRead(); // callibrate the output value to the magnetic field at start up
M5.Lcd.setTextSize(2);
}
float LowPassFilteredValue=0;
void showSignal()
{
int n;
int oldx;
int oldy;
int oldSig;
int x, y;
for (n = 0; n < SIGNAL_LENGTH; n++)
{
x = n;
float value = ESP32_hallRead()- HallOffset;
LowPassFilteredValue+=(value-LowPassFilteredValue)*0.05;
M5.Lcd.setCursor(220, 1);
M5.Lcd.print((int)LowPassFilteredValue);M5.Lcd.print(" ");
y = map(value , -127, 127, VERTICAL_RESOLUTION, POSITION_OFFSET_Y);
if (n > 0)
{
// delete old line element
M5.Lcd.drawLine(oldx , oldSig, x, oldSignal[n], BLACK );
// draw new line element
if (n < SIGNAL_LENGTH - 1) // don't draw last element because it would generate artifacts
{
M5.Lcd.drawLine(oldx, oldy, x, y, GREEN );
}
}
oldx = x;
oldy = y;
oldSig = oldSignal[n];
oldSignal[n] = y;
//以下に磁石が近づいたらLINE BOTに通知する記述
if(LowPassFilteredValue>10){
notifyCharacteristic->notify();
}
//磁石が近づいたらLINE BOTに通知する記述ここまで
}
}
//void loop()
//{
// showSignal();
//}
창의1 향후 예정
창의 2에 대한 향후 예정
비디오
창의력 3에 대한 향후 예정
창의력 4에 대한 향후 예정
Reference
이 문제에 관하여(라인 씽스의 아이디어를 고민하고 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/MikH/items/16b5329e3c4e3a0f5826텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)