라인 씽스의 아이디어를 고민하고 있습니다.

LINE Things를 재밌게 사용하고 싶어요.
LINE Things는 LINE에서 사용할 수 있는 새로운 IoT 플랫폼입니다.블루투스 LE를 사용하여 IoT 장치에 연결하면 LINFF와 LINE Bot을 통해 의사소통을 할 수 있습니다.
LINE Things를 재미있게 사용하고 싶네요.
LINE Things만 있는 장면을 생각해봤어요.
와이파이도 아니고 LTE도 아닌데 블루투스 LE를 이용한 라인 통신의 특징이 무엇인지 고민했다.
설비는 많은 사람들이 사용하는 것이 아니라 개인이 사용하기에 적합한 설비다.
사용하는 곳은 와이파이가 없는 곳에서 사용해 다른 장치와 차별화할 수 있다.
LINE Things의 용도를 고려했습니다.
외출할 때 개인이 휴대하는 설비'에 광권의 용도를 고려했다.
  • 아이디어1:운전 중.스크레이퍼 장비로 반응하고 라인 봇이 좋은 일을 했어요.정신을 차리든지, 아니면 간단한 게임을 하든지.운전 중 다른 곳을 보지 않고 간단하게 도착하는 스위치.
  • 창의2:골프.득점 계수기로 사용하다.점수가 안 좋을 때는 라인 봇이 위로해주고 합산도 해준다.같이 놀던 멤버들 점수도 알려주고.
  • 아이디어3: 유모차를 타고 외출하는 아기.오줌, 대변을 볼 때 기저귀를 교환하라는 통지.
  • 창의4: 공사 현장 작업자의 더위를 예방하기 위해 온도, 습도 센서를 안전모나 작업복에 설치하여 집중적으로 감시한다.
  • 아이디어 1의 사전 조사
  • 방안 1을 실현할 수 있습니까?
    차에 가져간 장비는 M5stack입니다.
    와이버에 네온사인을 달아 유리차를 사이에 두고도 M5 스택에 내장된 홀센서가 반응하지 않았는지 확인했다.
  • 동영상은 이거야.
    브러시에 네온사인 자석을 달았고, 유리창을 사이에 두고 차 안에 설치된 M5 Stack의 홀센서가 반응했는지 예비 검토를 진행했다.그래, 내가 반응할게.#M5stack#LINEThings-미지홍(@mikihiroshi 77)pic.twitter.com/19BgzzAG0j
    좋아, 반응했어.


    최종 이미지는 다음 그림입니다


    August 2, 2019


    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 공부해.라인 씽스의 협업은 없었지만 이미 세계적으로 개발품이 많고 경쟁도 치열하다.

    좋은 웹페이지 즐겨찾기