Raspberry Pi와 Blynk에서 방의 온도를 스마트 폰으로 확인

19432 단어 RaspberryPiBlynkIoTI2C

개요



매회마다 개요라든지 쓰고 있지만 의미가 없는 것 뿐이고, 이번은 Phpstorm 사버렸을 정도밖에 생각하지 못했습니다만・・・.

모처럼 Raspberry Pi가 있기 때문에, IoT답게 유행의 Blynk 에서 놀았습니다.

즉시 소개 -> L 치카



라고 하는 것을 쓰려고 했습니다만, 스마트폰의 스쿠쇼 찍거나 힘들기 때문에, L치카는 Qiita로 공개 끝난 좋은 기사가 있었으므로 그쪽을 참고로 하는 편이 좋다고 생각합니다・・・.

Qiita : [* Raspberry Pi *] Blynk를 사용하여 스마트 폰에서 LED 치카치카)

그래서 여기에서는 Raspberry Pi와 I2C에서 기온을 그래프 등으로 표시하고 싶습니다.

I2C에서 기온을 얻고 Blynk로 표시



라고 써 두면서 우선은 Label에 텍스트 표시해 보았습니다.

구그하면 아무도 이것도 마이크로 컴퓨터를 사용하거나 Raspberry Pi의 방법을 모르기 때문에, 어쩔 수 없이 Blank의 레퍼런스 보았어요・・・.

Blynk Docs

위의 L치카를 한 사람은 이런 식으로 Raspberry Pi에서 Blynk Server가 일어나고 있다고 생각합니다.


이제 스마트폰의 버튼을 누르면 L이 치카치카했는지 생각합니다.

다음은 스마트 폰의 위젯에 데이터를 전달합니다.

Virtual Pins



놀이로 스마트 폰 측에서 데이터를 요청한 날짜와 시간에도 표시해 보겠습니다.

Blynk Docs #Virtual Pins 에 의하면, Virtual Pin이라고 하는 것에 텍스트에서도 먹게 하면(자), 그대로에 보내지는 것 같습니다.
Blynk.virtualWrite(pin, "abc");
Blynk.virtualWrite(pin, 123);
Blynk.virtualWrite(pin, 12.34);
Blynk.virtualWrite(pin, "hello", 123, 12.34);

이것을 어디에 쓰는가 하면, Blynk의 git의 클론을 만든 장소에 있는 main.cpp 에 씁니다.
요점은 커스터마이즈 한다면, make 다시 ​​해 주세요라고 하는 것.

main.cpp
/**
 * @file       main.cpp
 * @author     Volodymyr Shymanskyy
 * @license    This project is released under the MIT License (MIT)
 * @copyright  Copyright (c) 2015 Volodymyr Shymanskyy
 * @date       Mar 2015
 * @brief
 */

/* <--------------------------------------------------------------------- ここから */
#include <stdio.h>
#include <string.h>
#include <time.h>
/* <--------------------------------------------------------------------- ここまで(多分いらない・・・) */

//#define BLYNK_DEBUG
#define BLYNK_PRINT stdout
#ifdef RASPBERRY
 #include <BlynkApiWiringPi.h>
#else
 #include <BlynkApiLinux.h>
#endif
#include <BlynkSocket.h>
#include <BlynkOptionsParser.h>

static BlynkTransportSocket _blynkTransport;
BlynkSocket Blynk(_blynkTransport);

#include <BlynkWidgets.h>

BLYNK_READ(V0) /* <--------------------------------------------------------------------- ここから */
{
  FILE *fp;
  char str[256] = {0};

  if ((fp = fopen("/tmp/blynktest.log", "a+")) == NULL) { /* 適当なところにログファイル作る感じ */
    printf("file open error!!\n");
    exit(EXIT_FAILURE);
  }

  /*
  while (fgets(str, 256, fp) != NULL) {
    printf("%s", str);
  }
  */

  time_t now;

  now = time(NULL);
  fprintf(fp, "%s", ctime(&now)); /* ログファイルのケツに今の日時を入れる */
  fclose(fp);

  BLYNK_LOG("%s", ctime(&now)); /* Blynk待受側にログを出力 */

  Blynk.virtualWrite(V0, ctime(&now)); /* 仮想のピンV0に今の日時の文字列を代入 */
} /* <--------------------------------------------------------------------- ここまで */

BLYNK_WRITE(V1)
{
  printf("Got a value: %s\n", param[0].asStr());
}

int main(int argc, char* argv[])
{
    const char *auth, *serv;
    uint16_t port;
    parse_options(argc, argv, auth, serv, port);

    Blynk.begin(auth, serv, port);

    while(true) {
        Blynk.run();
    }

    return 0;
}

이것을 make 해, ./blynk --token=***
스마트 폰은 Label을 만들고 Input을 virtual V0으로, Label을 /pin/로 만듭니다.


그리고는 스마트 폰 측의 Blynk 우측 상단의 재생 버튼을 누르면, 스마트 폰 측 · Raspberry Pi의 Blynk 대기 측 ·/tmp/blynktest.log에 지금의 일시가 기입되어 갑니다.




막상 I2C에



더 이상 말하지 마세요!BLYNK_READ(V0){} 같이 여기에서 I2C 논리를 쓰는 경우에 움직입니다.
(위의 스마트 폰 측의 이미지에서도 그래프로 기온 내고있는 것 같은 곳이 있습니다만, 바로 그것이 I2C 사용한 사람입니다)

main.cpp
/**
 * @file       main.cpp
 * @author     Volodymyr Shymanskyy
 * @license    This project is released under the MIT License (MIT)
 * @copyright  Copyright (c) 2015 Volodymyr Shymanskyy
 * @date       Mar 2015
 * @brief
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include <linux/i2c-dev.h> // I2C用インクルード
#include <fcntl.h>
#include <sys/ioctl.h>


//#define BLYNK_DEBUG
#define BLYNK_PRINT stdout
#ifdef RASPBERRY
 #include <BlynkApiWiringPi.h>
#else
 #include <BlynkApiLinux.h>
#endif
#include <BlynkSocket.h>
#include <BlynkOptionsParser.h>

static BlynkTransportSocket _blynkTransport;
BlynkSocket Blynk(_blynkTransport);

#include <BlynkWidgets.h>

float tempval();

BLYNK_READ(V0)
{
  double num = 0.00;
  char str[128]={0};

  num = tempval();
  sprintf(str, "%.2f", tempval());
  Blynk.virtualWrite(V0, str);
}

int main(int argc, char* argv[])
{
    const char *auth, *serv;
    uint16_t port;
    parse_options(argc, argv, auth, serv, port);

    Blynk.begin(auth, serv, port);

    while(true) {
        Blynk.run();
    }

    return 0;
}

float tempval(){
    char *i2cFileName = "/dev/i2c-1";
    const unsigned char i2cAddress = 0x18;
    const __u8 t_reg = 0x05;
    int i2c_fd;

    if((i2c_fd = open(i2cFileName,O_RDWR)) < 0){
        fprintf(stderr,"Faild to open i2c port¥n");
        return 1;
    }
    if (ioctl(i2c_fd, I2C_SLAVE,i2cAddress) < 0) {
        fprintf(stderr,"Unable to get bus access to talk to slave¥n");
        return 1;
    }
    __s32 res = i2c_smbus_read_word_data(i2c_fd,t_reg);
    if(res < 0){
        fprintf(stderr,"Error i2c_smbus_read_word_data()¥n");
        return 1;
    }
    float temp;
    {
        __u16 t = res << 8 | res >> 8;//byte swap
        temp = t & 0x0FFF;      //mask
        temp /= 16;
        if(t & 0x1000){                 //sign or unsigned
            temp -= 256;
        }
        }

    time_t t;
    time(&t);
    struct tm *m;
    m = localtime(&t);

    // printf("%d/%d/%d-%d:%d:%d,%.2f\n",m->tm_year+1900,m->tm_mon+1,m->tm_mday,m->tm_hour,m->tm_                                                                                                                                                                                                                            min,m->tm_sec,temp);
    // printf("%.2f", temp);
    return temp;
}

조금 졸린다.
내일도 출근하지 않으면 안되기 때문에, 우선 이것으로 줍니다.

라고 할까, 스마트 폰 측의 Blynk는 직감 조작 여유이므로, 설명하지 않습니다!
그래프 만들어 보면 절대 알 수 있습니다!

대단해!

문제는 C언어가 너무 오래간다 응코・・・

좋은 웹페이지 즐겨찾기