Wio LTE로 놀아 본다(그 2:온습도 센서)

Grove IoT 스타터 키트 for SORACOM 에서 놀아 본다.
  • 첫회:환경 구축+L치카

  • 〇온습도



    센서
    h tp // 우우키. 그래, ds. 코 m/G로ゔぇ-mぺらつれあんてゅみぢty_센소 r/

    스케치는 우선
    grove의 grove-temperature-and-humidity-sensor를 지정.
    스케치 안에#define SENSOR_PIN (WIOLTE_D38)그래서 D38에 연결해 본다.

    표시할 수 있었다.



    〇 처리에 대해서



    표시만 할 수 있어도 응용하기 어렵기 때문에 스케치의 내용도 확인해 본다.

    사용하는 함수
    참조

    〇 초기화


    void DHT11Init(int pin)
    {
      digitalWrite(pin, HIGH);
      pinMode(pin, OUTPUT);
    }
    

    · digitalWriteHIGHまたはLOWを、指定したピンに出力します。
    HIGH로 ON, LOW로 OFF라고 생각해 두면 좋을까?

    · 핀도 출력ピンの動作を入力か出力に設定します。
    Pin에 연결되어 있는 모듈에서 IN/OUT을 변경할 수 있다고 생각하면 OK?
    OUTPUT으로 설정하면 데이터를 얻을 수 있다고?

    〇 시작


    void DHT11Start(int pin)
    {
      // Host the start of signal
      digitalWrite(pin, LOW);
      delay(18);
    
      // Pulled up to wait for
      pinMode(pin, INPUT);
      while (!digitalRead(pin)) ;
    
      // Response signal
      while (digitalRead(pin)) ;
    
      // Pulled ready to output
      while (!digitalRead(pin)) ;
    }
    

    · digitalRead指定したピンの値を読み取ります。その結果はHIGHまたはLOWとなります。
    핀에 붙어있는 모듈의 값? 받을 수 있습니다.
    그렇지만 HIGH 또는 LOW는 것은 ON/OFF라는 것? ?
    이번과 같이 온도나 습도를 취득하고 싶은 경우는 이것이라고 상세한 데이터의 취득은 할 수 없다는 것일까.

    〇 종료


    void DHT11Finish(int pin)
    {
      // Releases the bus
      while (!digitalRead(pin)) ;
      digitalWrite(pin, HIGH);
      pinMode(pin, OUTPUT);
    }
    

    초기화로 하고 있는 설정과 같은 상태로 하고 있는 것일까.

    〇 데이터 취득


    bool TemperatureAndHumidityRead(float* temperature, float* humidity)
    {
      byte data[5];
    
      DHT11Start(TemperatureAndHumidityPin);
      for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
      DHT11Finish(TemperatureAndHumidityPin);
    
      略
    }
    byte DHT11ReadByte(int pin)
    {
      byte data = 0;
    
      for (int i = 0; i < 8; i++) {
        while (digitalRead(pin)) ;
    
        while (!digitalRead(pin)) ;
        unsigned long start = micros();
    
        while (digitalRead(pin)) ;
        unsigned long finish = micros();
    
        if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
          }
    
      return data;
    }
    

    · 마이크로스Arduinoボードがプログラムの実行を開始した時から現在までの時間をマイクロ秒単位で返します。約70分間でオーバーフローし、ゼロに戻ります。
    (finish - start)로 처리에 걸린 시간을 취득하고 있는 것인가.
    그렇지만 여기의 처리로 무엇을 하고 싶은지 잘 모르겠습니다.
    분위기적으로는 비트 단위로 취득하고 있다고 하는 것이겠지만.

    다시 센서의 페이지를 확인해 본다

    When MCU sends a trigger signal, sensor will change from low power consumption mode to active mode. After the trigger signal sensor will send a response signal back to MCU, then 40 bit collected data is sent out and a new signal collecting is trigged. Note that the 40 bit collected data which is sent from sensor to MCU is already collected before the trigger signal comes.) One trigger signal receives one time 40 bit response data from sensor. Single-bus data is used for communication between The communication process is shown below:

    Google 박사에게 의지한다.

    MCU가 트리거 신호를 전송하면 센서는 저전력 모드에서 활성 모드로 전환합니다. 트리거 신호 센서가 응답 신호를 MCU로 다시 전송하면 40비트 수집 데이터가 전송되고 새로운 신호 수집이 트리거됩니다(센서에서 MCU로 전송되는 40비트 수집 데이터는 트리거 신호가 옵니다.) 하나의 트리거 신호는 센서로부터 한 번의 40비트 응답 데이터를 수신합니다. 단일 버스 데이터는 MCU와 센서 간의 통신에 사용됩니다. 통신 프로세스는 다음과 같습니다.

    이해할 수 있는 모르겠어요.

    It costs 5ms for single time communication.The high-order bit of data sends out first. Signal Data is 40 bit, comprised of 16 bit humidity data, 16 bit temperature data and 8 bit checksum.The data format is:
    8bits integer part of humidity+8bits decimal part of humidity
    +8bits integer part of temperature+8bits decimal part of temperature
    +8bits checksum.
    

    5ms는 여기에서 나오는 숫자인가.
    40bit이니까, 8비트씩 데이터를 취득해 1바이트씩 저장하고 있는 것인가.

    그렇지만, 어째서 while, 어째서 data |= 1 << (7 - i)인가는 모르겠다. .
    데이터의 취득시에 세세하게 로그라고 해 보면 알 수 있겠지만. .

    뭐, 우선 이것으로 이 모듈의 데이터를 취할 수 있다고 생각해 두면 좋겠지만.

    〇체크


    bool DHT11Check(const byte* data, int dataSize)
    {
      if (dataSize != 5) return false;
    
      byte sum = 0;
      for (int i = 0; i < dataSize - 1; i++) {
        sum += data[i];
      }
    
      return data[dataSize - 1] == sum;
    }
    

    분위기에서 checksum의 값을 체크하고 있다는 것일까.

    〇 취득 후


      *humidity = (float)data[0] + (float)data[1] / 10.0f;
      *temperature = (float)data[2] + (float)data[3] / 10.0f;
    

    이것으로 온도와 습도를 반환할 수 있다는 것인가.

    〇연결/송신/단절



    이어서 SORACOM의 Harvest에 보내는 부분에 대해서도
      connectId = Wio.SocketOpen("harvest.soracom.io", 8514, WIOLTE_UDP);
    
      if (!Wio.SocketSend(connectId, data)) {
        SerialUSB.println("### ERROR! ###");
        goto err_close;
      }
    
      length = Wio.SocketReceive(connectId, data, sizeof (data), RECEIVE_TIMEOUT);
      if (length < 0) {
        SerialUSB.println("### ERROR! ###");
        goto err_close;
      }
      if (length == 0) {
        SerialUSB.println("### RECEIVE TIMEOUT! ###");
        goto err_close;
      }
    

    이것은 보면 어쩐지 알 수 있다.

    우선 이번에는 여기까지

    좋은 웹페이지 즐겨찾기