raspberry pi 同步家里传感器到数据库

@Ta 2020-09-22发布,2020-09-22修改 861点击
C源码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mysql.h"

void printResult(MYSQL * mysqlPrint) //打印结果集(此处传入指针,而非内容)
{
    MYSQL_RES *result;
    int i;
    int numFields = 0;
    int numRows = 0;
    MYSQL_FIELD *field;
    MYSQL_ROW row;
    result = mysql_store_result(mysqlPrint); //将查询的全部结果读取到客户端
    numFields = mysql_num_fields(result); //统计结果集中的字段数
    numRows = mysql_num_rows(result); //统计结果集的行数
    while (field = mysql_fetch_field(result)) //返回结果集中的列信息(字段)
        printf("%s\t", field->name);
    printf("\n");
    if (result) {
        while (row = mysql_fetch_row(result)) //返回结果集中行的记录
        {
            for (i = 0; i < numFields; i++) {
                printf("%s\t", row);
            }
            printf("\n");
        }
    }
    mysql_free_result(result);  //释放result空间

}

int main(int argc, char *argv[], char **env)
{
    FILE *fp;
    char temperature[270];
    char time[270];
    char dht11[270];
    fp = popen("/root/gpio/wind -d 28", "r");
    fgets(temperature, sizeof(temperature), fp);
    temperature[strlen(temperature)-1]=0;
    //printf("%s", temperature);
    fp = popen("date '+%y%m%d%H%M%S'", "r");
    fgets(time, sizeof(time), fp);
    time[strlen(time)-1]=0;
    //printf("%s", time);
    
    fp = popen("/root/gpio/dht11 29", "r");
    fgets(dht11, sizeof(dht11), fp);
    dht11[strlen(dht11)-1] = 0;
    
    printf("%s\n", dht11);
    
    pclose(fp);

    char sql_insert[500];
    sprintf(sql_insert, "INSERT INTO temperature (time, temperature, dht11) VALUES ('%s', '%s', '%s');", time, temperature, dht11);

    //printf("%s", sql_insert); 
    
    MYSQL mysql;
    MYSQL_RES *result;
    mysql_init(&mysql);
    mysql_real_connect(&mysql, "cproxy.aixiao.me", "root", "198", "mysql", 3306, NULL, 0);
    mysql_query(&mysql, "use raspberrypi");
    mysql_query(&mysql, sql_insert);
    mysql_query(&mysql, "select *from temperature");
    printResult(&mysql);
    mysql_close(&mysql);
    
    return 0;
}

编译命令
gcc -I/opt/mysql/include   -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -L/opt/mysql/lib -lmysqlclient -lpthread -lm -ldl mysql.c -o a.out


DHT11温度湿度传感器源码
/*
 * DTH11 温度湿度传感器
 *
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>

typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;

#define HIGH_TIME 32

uint32 databuf;

uint8 readSensorData(int pin)
{
    uint8 crc;
    uint8 i;

    pinMode(pin, OUTPUT); // set mode to output
    digitalWrite(pin, 0); // output a high level 
    delay(25);
    digitalWrite(pin, 1); // output a low level 
    pinMode(pin, INPUT);  // set mode to input
    pullUpDnControl(pin, PUD_UP);

    delayMicroseconds(27);
    if (digitalRead(pin) == 0) //SENSOR ANS
    {
        while (!digitalRead(pin)) ; //wait to high

        for (i = 0; i < 32; i++) {
            while (digitalRead(pin)) ; //data clock start
            while (!digitalRead(pin)) ; //data start
            delayMicroseconds(HIGH_TIME);
            databuf *= 2;
            if (digitalRead(pin) == 1) //1
            {
                databuf++;
            }
        }

        for (i = 0; i < 8; i++) {
            while (digitalRead(pin)) ; //data clock start
            while (!digitalRead(pin)) ; //data start
            delayMicroseconds(HIGH_TIME);
            crc *= 2;
            if (digitalRead(pin) == 1) //1
            {
                crc++;
            }
        }
        return 1;
    } else {
        return 0;
    }
}

int is_num(int n, char *argv[])
{
    int j = 0;
    int i;
    char parameter[10];
    strcpy(parameter, argv[n]);
    int len = strlen(parameter);

    for (i = 0; i < len; i++) {
        if (parameter <= 57 && parameter >= 48) //0~9的ASCII码是48~57
        {
            j++;
        }
    }
    if (j == len) {
        return 1;
    } else {
        return 0;
    }
}

int main(int argc, char *argv[], char **env)
{
    if (argc != 2) {
        printf("Parameter error.\n");
        exit(1);
    }
    if (is_num(1, argv) == 0) {
        printf("Parameter error, parameter 1 is PIN pin value\n");
        exit(1);
    }

    int pin = atol(argv[1]);
    
    if (-1 == wiringPiSetup()) {
        printf("Setup wiringPi failed!");
        return 1;
    }

    pinMode(pin, OUTPUT); // set mode to output
    digitalWrite(pin, 1); // output a high level

    while (1) {
        pinMode(pin, OUTPUT); // set mode to output
        digitalWrite(pin, 1); // output a high level
        delay(3000);
        if (readSensorData(pin)) {
            printf("Humidity: %d.%d% Temperature: %d.%d ℃ ( %f ℉ )\n", (databuf >> 24) & 0xff, (databuf >> 16) & 0xff, (databuf >> 8) & 0xff, databuf & 0xff, ((((databuf >> 8) & 0xff)*1.8)+32));
            databuf = 0;
            break;
        }
    }
    
    return 0;
}





数据库SQL

/*
 Navicat Premium Data Transfer

 Source Server         : 47.240.75.93_3306
 Source Server Type    : MySQL
 Source Server Version : 50644
 Source Host           : 47.240.75.93:3306
 Source Schema         : raspberrypi

 Target Server Type    : MySQL
 Target Server Version : 50644
 File Encoding         : 65001

 Date: 22/09/2020 11:15:58
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for temperature
-- ----------------------------
DROP TABLE IF EXISTS `temperature`;
CREATE TABLE `temperature`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `time` datetime(0) NULL DEFAULT NULL,
  `temperature` int(11) NOT NULL DEFAULT 0,
  `dht11` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 147 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;


效果

1600744698(1).png

单个传感器执行效果

1600745913(1).png

这样就可以远程了解家里温度和湿度变化。

回复列表(2)
  • @Ta / 2020-09-22

    可以装Home Assistant试试,我也是DHT11传感器,通过8266获取数据,然后通过WIFI传到树莓派中的,这样不用写C代码,毕竟Arduino现成库更多一些。
    红米K30 Pro 变焦版

  • @Ta / 2020-09-22
    @Curtion,py不会呀🙄
添加新回复
回复需要登录

[聊天-此处没有老虎] 暗:视频链接(function(){var box=document.getElementById("v…