硬件包括小车底盘套装(底盘、车轮、电机)、超声波探测模块(HC-SR04)、树莓派、OLED 屏幕(I2C 12832)、L9110S桥两路直流电机驱动板、DS18B20温度传感器、SG90舵机、垃圾桶
1.通过客户端和服务端收发命令,进行控制智能清洁桶;2.需要实现遥控运动,检测障碍躲避;3.识别扔垃圾动作,主动打开盖子并等待关上;4.检测温度,时间,不断刷新显示在OLED屏幕上。
在这里,我使用的是wiringPi编码,编译时需要加上 -lwiringPi.
同时对wiringPi常用的函数需要有一定了解,这对于接下来的编程有很大的帮助。
推荐博文:
树莓派wiringPi常用的函数介绍
########超声波接口定义#################
#define Trig 0 #超声波发射脚位
#define Echo 1 #超声波接收脚位
########电机驱动接口定义#################
#define IN1 2 #电机接口1
#define IN2 3 #电机接口2
#define IN3 4 #电机接口3
#define IN4 5 #电机接口4
########舵机驱动接口定义#################
#define RANGE 200 //1 means 100 us , 200 means 20 ms 1等于100微妙,200等于20毫秒
#define pin 6 #舵机接口4
########超声波接口初始化#################
void ultraInit(void) {
pinMode(Echo, INPUT); //设置端口为输入
pinMode(Trig, OUTPUT);
}
########电机驱动接口初始化#################
void toola(void) {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void setStep(int a,int b,int c,int d){
digitalWrite(IN1, a);
digitalWrite(IN2, b);
digitalWrite(IN3, c);
digitalWrite(IN4, d);
}
########舵机驱动接口初始化#################
void chushi()
{
softPwmCreate (pin, 15, RANGE) ; //创建一个使舵机转到90的pwm输出信号
delay(1000);
}
float disMeasure(void) {
struct timeval tv1; // timeval是time.h中的预定义结构体
// 其中包含两个一个是秒,一个是微秒
struct timeval tv2;
/*
timeval结构体:
struct timeva
{
time_t tv_sec; //Seconds.
suseconds_t tv_usec; //Microseconds.
};
*/
long start, stop;
float dis;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10); //发出超声波脉冲
digitalWrite(Trig, LOW);
while (!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL); //获取当前时间
while (!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL); //获取当前时间
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //微秒级的时间
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(stop - start) / 1000000 * 34000 / 2; //求出距离
return dis;
}
void stop() //停
{
setStep(0, 0, 0, 0);
}
void forward() //前进
{
setStep(1, 0, 1, 0);
}
void backward() //后退
{
setStep(0, 1, 0, 1);
}
void turnleft() //左转
{
setStep(1, 0, 0, 1);
}
void turnright() //右转
{
setStep(0, 1, 1, 0);
}
void panduan(float dis) //避障
{
if(dis > 100){
forward();
}else if(dis < 20){
stop();
delay(2000);
turnleft();
}else{
turnright();
}
}
void jiaodu(float dis)
{
if(dis > 30){
softPwmWrite(pin,5);
}else{
softPwmWrite(pin,25); //开启180度
delay(2000); //等待
softPwmWrite(pin,5); //关闭0度
}
}
sudo apt-get install -y i2c-tools
sudo raspi-config
打开树莓派配置选择5 Interfacing Options。
选择P5 I2C回车激活I2C。
回车,启动后,重启树莓派
下面通过命令检测是否识别到 I2C 设备。
sudo i2cdetect -y 1
OLED引脚 | 树莓派物理BOARD引脚 |
---|---|
VCC | 1号(3.3V) |
GND | 6号(GND) |
SCL | 5号(SCL.1) |
SDA | 3号(SDA.1) |
#include
#include
#include
#include
#include "oled.h"
int fd;
extern float temp;
unsigned char yi[4][16] = {
" ", //第一行
" ", //第二行
" ", //第三行
" " //第四行
}; //显示内容
const unsigned char zi[];
void init(void) //初始化
{
wiringPiSetup();
fd = wiringPiI2CSetup(0x3c); // i2c初始化 0x3c是oled的从机地址
wiringPiI2CWriteReg8(fd, 0x00, 0xa1); //图像反了修改成0xa0
wiringPiI2CWriteReg8(fd, 0x00, 0xc8); //行输出反了修改成0xc0
wiringPiI2CWriteReg8(fd, 0x00, 0x8d); //允许电荷泵
wiringPiI2CWriteReg8(fd, 0x00, 0x14);
wiringPiI2CWriteReg8(fd, 0x00, 0xa6); //想反相显示改成0xa7
wiringPiI2CWriteReg8(fd, 0x00, 0x21); //重置列地址
wiringPiI2CWriteReg8(fd, 0x00, 0x00);
wiringPiI2CWriteReg8(fd, 0x00, 0x7f);
wiringPiI2CWriteReg8(fd, 0x00, 0xaf); //开显示
}
void qingping(void) //清屏
{
char zt1, zt2;
for (zt1 = 0; zt1 < 8; zt1++) {
wiringPiI2CWriteReg8(fd, 0x00, 0xb0 + zt1);
for (zt2 = 0; zt2 < 128; zt2++) wiringPiI2CWriteReg8(fd, 0x40, 0x00);
}
}
void ascii(void) //显示ASCII码8*16
{
int zt;
char zt3, zt4;
for (zt3 = 0; zt3 < 4; zt3++) {
wiringPiI2CWriteReg8(fd, 0x00, 0xb0 + (zt3 * 2));
for (zt4 = 0; zt4 < 16; zt4++)
for (zt = 0; zt < 8; zt++)
wiringPiI2CWriteReg8(fd, 0x40, zi[yi[zt3][zt4] * 16 + zt]);
wiringPiI2CWriteReg8(fd, 0x00, 0xb0 + (zt3 * 2) + 1);
for (zt4 = 0; zt4 < 16; zt4++)
for (zt = 0; zt < 8; zt++)
wiringPiI2CWriteReg8(fd, 0x40, zi[yi[zt3][zt4] * 16 + zt + 8]);
}
}
void shijian(void) //当前时间
{
struct tm *ptr;
time_t lt;
lt = time(<);
ptr = localtime(<);
strftime(yi[1], 16, "%m/%d %a", ptr); //月/日 周几
strftime(yi[2], 16, "%R %p", ptr); //时:分 am或pm
sprintf(yi[0],"temp = %.2f",temp); //写入温度
}
const unsigned char zi[] = {
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 0
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 1
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 2
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 3
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 4
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 5
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 6
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 7
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 8
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 9
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 10
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 11
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 12
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 13
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 14
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 15
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 16
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 17
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 18
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 19
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 20
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 21
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 22
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 23
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 24
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 25
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 26
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 27
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 28
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 29
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 30
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 31
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 32
/*-- 文字: ! --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33,
0x00, 0x00, 0x00, 0x00, // 33
/*-- 文字: " --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x10, 0x0C, 0x02, 0x10, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 34
/*-- 文字: # --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x00, 0x00, 0x04, 0x3F, 0x04,
0x04, 0x3F, 0x04, 0x00, // 35
/*-- 文字: $ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x70, 0x88, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20,
0xFF, 0x21, 0x1E, 0x00, // 36
/*-- 文字: % --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xF0, 0x08, 0xF0, 0x80, 0x60, 0x18, 0x00, 0x00, 0x00, 0x31, 0x0C, 0x03,
0x1E, 0x21, 0x1E, 0x00, // 37
/*-- 文字: & --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x2C,
0x19, 0x27, 0x21, 0x10, // 38
/*-- 文字: ' --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 39
/*-- 文字: ( --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07,
0x18, 0x20, 0x40, 0x00, // 40
/*-- 文字: ) --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18,
0x07, 0x00, 0x00, 0x00, // 41
/*-- 文字: * --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F,
0x01, 0x02, 0x02, 0x00, // 42
/*-- 文字: + --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
0x0F, 0x01, 0x01, 0x01, // 43
/*-- 文字: , --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x70, 0x00,
0x00, 0x00, 0x00, 0x00, // 44
/*-- 文字: - --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x00, // 45
/*-- 文字: . --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00,
0x00, 0x00, 0x00, 0x00, // 46
/*-- 文字: / --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0xC0, 0x38, 0x04, 0x00, 0x00, 0x60, 0x18, 0x07,
0x00, 0x00, 0x00, 0x00, // 47
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20,
0x20, 0x10, 0x0F, 0x00, // 48
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20,
0x3F, 0x20, 0x20, 0x00, // 49
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x70, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x30, 0x28, 0x24,
0x22, 0x21, 0x30, 0x00, // 50
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x30, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x18, 0x20, 0x21,
0x21, 0x22, 0x1C, 0x00, // 51
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x40, 0x30, 0xF8, 0x00, 0x00, 0x00, 0x06, 0x05, 0x24,
0x24, 0x3F, 0x24, 0x24, // 52
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0xF8, 0x88, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x20, 0x20,
0x20, 0x11, 0x0E, 0x00, // 53
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0xE0, 0x10, 0x88, 0x88, 0x90, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20,
0x20, 0x20, 0x1F, 0x00, // 54
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x18, 0x08, 0x08, 0x88, 0x68, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3E,
0x01, 0x00, 0x00, 0x00, // 55
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21,
0x21, 0x22, 0x1C, 0x00, // 56
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0xF0, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x01, 0x12, 0x22,
0x22, 0x11, 0x0F, 0x00, // 57
/*-- 文字: : --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x30, 0x00, 0x00, 0x00, // 58
/*-- 文字: ; --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0x00, 0x00, 0x00, 0x00, // 59
/*-- 文字: < --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04,
0x08, 0x10, 0x20, 0x00, // 60
/*-- 文字: = --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x00, // 61
/*-- 文字: > --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08,
0x04, 0x02, 0x01, 0x00, // 62
/*-- 文字: ? --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x70, 0x48, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30,
0x37, 0x00, 0x00, 0x00, // 63
/*-- 文字: @ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x28,
0x2F, 0x28, 0x17, 0x00, // 64
/*-- 文字: A --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02,
0x02, 0x27, 0x38, 0x20, // 65
/*-- 文字: B --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20,
0x20, 0x11, 0x0E, 0x00, // 66
/*-- 文字: C --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20,
0x20, 0x10, 0x08, 0x00, // 67
/*-- 文字: D --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20,
0x20, 0x10, 0x0F, 0x00, // 68
/*-- 文字: E --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20,
0x23, 0x20, 0x18, 0x00, // 69
/*-- 文字: F --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00,
0x03, 0x00, 0x00, 0x00, // 70
/*-- 文字: G --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20,
0x22, 0x1E, 0x02, 0x00, // 71
/*-- 文字: H --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01,
0x01, 0x21, 0x3F, 0x20, // 72
/*-- 文字: I --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F,
0x20, 0x20, 0x00, 0x00, // 73
/*-- 文字: J --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80,
0x7F, 0x00, 0x00, 0x00, // 74
/*-- 文字: K --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01,
0x26, 0x38, 0x20, 0x00, // 75
/*-- 文字: L --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20,
0x20, 0x20, 0x30, 0x00, // 76
/*-- 文字: M --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x01, 0x3E,
0x01, 0x3F, 0x20, 0x00, // 77
/*-- 文字: N --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00,
0x07, 0x18, 0x3F, 0x00, // 78
/*-- 文字: O --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20,
0x20, 0x10, 0x0F, 0x00, // 79
/*-- 文字: P --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01,
0x01, 0x01, 0x00, 0x00, // 80
/*-- 文字: Q --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x28, 0x28,
0x30, 0x50, 0x4F, 0x00, // 81
/*-- 文字: R --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00,
0x03, 0x0C, 0x30, 0x20, // 82
/*-- 文字: S --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21,
0x21, 0x22, 0x1C, 0x00, // 83
/*-- 文字: T --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F,
0x20, 0x00, 0x00, 0x00, // 84
/*-- 文字: U --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20,
0x20, 0x20, 0x1F, 0x00, // 85
/*-- 文字: V --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38,
0x0E, 0x01, 0x00, 0x00, // 86
/*-- 文字: W --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x08, 0x00, 0x00, 0x03, 0x3E, 0x01,
0x3E, 0x03, 0x00, 0x00, // 87
/*-- 文字: X --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03,
0x03, 0x2C, 0x30, 0x20, // 88
/*-- 文字: Y --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F,
0x20, 0x00, 0x00, 0x00, // 89
/*-- 文字: Z --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21,
0x20, 0x20, 0x18, 0x00, // 90
/*-- 文字: [ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F,
0x40, 0x40, 0x40, 0x00, // 91
/*-- 文字: \ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x04, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x06, 0x38, 0xC0, 0x00, // 92
/*-- 文字: ] --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40,
0x7F, 0x00, 0x00, 0x00, // 93
/*-- 文字: ^ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x04, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 94
/*-- 文字: _ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, // 95
/*-- 文字: ` --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 96
/*-- 文字: a --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0x24, 0x24,
0x12, 0x3F, 0x20, 0x00, // 97
/*-- 文字: b --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x10, 0xF0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20,
0x20, 0x11, 0x0E, 0x00, // 98
/*-- 文字: c --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20,
0x20, 0x20, 0x11, 0x00, // 99
/*-- 文字: d --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x90, 0xF0, 0x00, 0x00, 0x1F, 0x20, 0x20,
0x20, 0x10, 0x3F, 0x20, // 100
/*-- 文字: e --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x24, 0x24,
0x24, 0x24, 0x17, 0x00, // 101
/*-- 文字: f --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x80, 0x80, 0xE0, 0x90, 0x90, 0x20, 0x00, 0x00, 0x20, 0x20, 0x3F,
0x20, 0x20, 0x00, 0x00, // 102
/*-- 文字: g --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94,
0x94, 0x93, 0x60, 0x00, // 103
/*-- 文字: h --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x10, 0xF0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00,
0x00, 0x20, 0x3F, 0x20, // 104
/*-- 文字: i --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F,
0x20, 0x20, 0x00, 0x00, // 105
/*-- 文字: j --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80,
0x80, 0x7F, 0x00, 0x00, // 106
/*-- 文字: k --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x10, 0xF0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x06,
0x29, 0x30, 0x20, 0x00, // 107
/*-- 文字: l --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F,
0x20, 0x20, 0x00, 0x00, // 108
/*-- 文字: m --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00,
0x3F, 0x20, 0x00, 0x3F, // 109
/*-- 文字: n --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00,
0x00, 0x20, 0x3F, 0x20, // 110
/*-- 文字: o --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20,
0x20, 0x20, 0x1F, 0x00, // 111
/*-- 文字: p --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x91, 0x20,
0x20, 0x11, 0x0E, 0x00, // 112
/*-- 文字: q --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20,
0x20, 0x91, 0xFF, 0x80, // 113
/*-- 文字: r --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21,
0x20, 0x00, 0x01, 0x00, // 114
/*-- 文字: s --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24,
0x24, 0x24, 0x19, 0x00, // 115
/*-- 文字: t --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x20, 0x20, 0x10, 0x00, // 116
/*-- 文字: u --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20,
0x20, 0x10, 0x3F, 0x20, // 117
/*-- 文字: v --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x03, 0x0C, 0x30,
0x0C, 0x03, 0x00, 0x00, // 118
/*-- 文字: w --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x01, 0x0E, 0x30, 0x0C,
0x07, 0x38, 0x06, 0x01, // 119
/*-- 文字: x --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x0E,
0x2E, 0x31, 0x20, 0x00, // 120
/*-- 文字: y --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x81, 0x86, 0x78,
0x18, 0x06, 0x01, 0x00, // 121
/*-- 文字: z --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C,
0x22, 0x21, 0x30, 0x00, // 122
/*-- 文字: { --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
0x01, 0x3E, 0x40, 0x40, // 122
/*-- 文字: | --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00, // 124
/*-- 文字: } --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x02, 0x02, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3E, 0x01,
0x00, 0x00, 0x00, 0x00, // 125
/*-- 文字: ~ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 126
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, // 127
};
第一步,允许单总线接口
sudo raspi-config 进入 interfacingoptions
enable 1-wire interface
接BCM编码为4即图上物理引脚7
pi@raspberrypi:~$ cd /sys/bus/w1/devices/
pi@raspberrypi:/sys/bus/w1/devices$ ls
28-00000xxxxxx w1_bus_master1
cd 28-00000xxxxxx cat w1_slave
显示:
46 01 4b 46 7f ff 0c 10 2f : crc=2f YES
46 01 4b 46 7f ff 0c 10 2f t=20375
第二行的t=20375就是当前的温度值,要换算成摄氏度,除以1000,即当前温度为20
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "temp.h"
int ds18b20_get_temperature(float * temp)
{
char buf[256];
char w1_path[200] = "/sys/bus/w1/devices/";
DIR * dirp;
char serial_number[100];
struct dirent * direntp;
char * p;
int fd = -1;
int found = 0;
float value;
if(!temp)
{
return -1;
}
if((dirp = opendir(w1_path)) == NULL)
{
printf("Opendir failure:%s.\n",strerror(errno));
return -2;
}
while((direntp = readdir(dirp)) != NULL)
{
if(strstr(direntp->d_name,"28-"))
{
strncpy (serial_number,direntp->d_name,sizeof(serial_number));
found = 1;
}
}
closedir(dirp);
if (!found)
{
printf("Can't find ds18b20 in %s.\n",w1_path);
return -3;
}
strncat(w1_path,serial_number,sizeof(w1_path));
strncat(w1_path,"/w1_slave",sizeof(w1_path)-1);
if((fd = open(w1_path,O_RDONLY)) < 0)
{
printf("open %s error:%s\n",w1_path,strerror(errno));
return -4;
}
if((read(fd,buf,sizeof(buf)))< 0)
{
printf("read %s error:%s\n",w1_path,strerror(errno));
return -5;
}
p = strstr(buf,"t=");
if(!p)
{
printf("Can not get the temperature.\n");
return -6;
}
p = p+2;
*temp = atof(p)/1000;
return 0;
}
//msg.h
#ifndef MSG_H
#define MSG_H
#define SERVER_PORT 8888 //全局端口号
enum FTP_CMD {
//前进
FTP_CMD_UP = 0,
//后退
FTP_CMD_DOWN = 1,
//右转
FTP_CMD_RIGHT = 2,
//左转
FTP_CMD_LEFT = 3,
//停止
FTP_CMD_STOP = 4,
//无效命令
FTP_CMD_ERROR,
};
struct Msg{
//命令get
enum FTP_CMD cmd;
//命令参数,存放命令
char args[32];
};
#endif
//log.c
#include
#include
#include "log.h"
FILE *g_log = NULL;
void log_create(char *name) //创建
{
g_log = fopen(name,"a+");
if(NULL == g_log){
printf("fopen mylog.txt failed\n");
}
}
void log_destory() //关闭
{
fclose(g_log);
g_log = NULL;
}
void log_write(const char *format,...) //写入
{
//定义va_list变量
va_list args;
//创建
va_start(args,format);
vfprintf(g_log,format,args);
//销毁
va_end(args);
//强制写入
fflush(g_log);
}
//client.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "log.h"
#include "msg.h"
#include "utils.h"
int handle_user_input(struct Msg *msg_send) {
char buf[32] = {'\0'};
enum FTP_CMD cmd;
fgets(buf, 32, stdin);
if (memcmp(buf, "w", 1) == 0) {
cmd = FTP_CMD_UP;
} else if (memcmp(buf, "a", 1) == 0) {
cmd = FTP_CMD_LEFT;
} else if (memcmp(buf, "s", 1) == 0) {
cmd = FTP_CMD_DOWN;
} else if (memcmp(buf, "d", 1) == 0) {
cmd = FTP_CMD_RIGHT;
} else if (memcmp(buf, "q", 1) == 0) {
cmd = FTP_CMD_STOP;
} else {
cmd = FTP_CMD_ERROR;
}
if (cmd == FTP_CMD_ERROR) {
return -1;
}
strcpy(msg_send->args, buf);
msg_send->cmd = cmd;
return 0;
}
int main(int argc, char **argv) {
int ret;
int sock;
struct sockaddr_in serveraddr;
struct Msg *msg_send = NULL;
struct Msg *msg_recv = NULL;
msg_send = (struct Msg *)malloc(sizeof(struct Msg));
msg_recv = (struct Msg *)malloc(sizeof(struct Msg));
log_create("client.txt");
//创建socket
sock = socket(AF_INET, SOCK_STREAM, 0);
//初始化服务端地址,ip,port
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = SERVER_PORT;
serveraddr.sin_addr.s_addr = inet_addr("172.20.10.12");
//连接connect
ret = connect(sock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if (ret < 0) {
log_write("connect failed ,ret%d", ret);
return -1;
}
while (1) {
if (handle_user_input(msg_send) < 0) {
continue;
}
//发送
ret = my_send2(sock, (char*)msg_send, sizeof(struct Msg));
log_write("send ret = %d\n", ret);
memset(msg_recv,0,sizeof(struct Msg));
}
memset(msg_send,0,sizeof(struct Msg));
log_destory();
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "ceju.h"
#include "dianj.h"
#include "temp.h"
#include "oled.h"
#include "log.h"
#include "msg.h"
#include "utils.h"
#include "duoji.h"
int running;
float temp;
float dis;
void handle_cmd(struct Msg *in_cmd, struct Msg *out_cmd) {
char filename[32];
// in_cmd 读取数据,写入日至
log_write("cmd %d,args %s\n", in_cmd->cmd, in_cmd->args);
out_cmd->cmd = in_cmd->cmd;
switch (in_cmd->cmd) {
case FTP_CMD_UP:
forward();
break;
case FTP_CMD_LEFT:
turnleft();
break;
case FTP_CMD_DOWN:
backward();
break;
case FTP_CMD_RIGHT:
turnright();
break;
case FTP_CMD_STOP:
stop(); //停下时判断距离,是否开启清洁桶
while(1){
dis = disMeasure();
printf("distance = %0.2f cm\n", dis);
jiaodu(dis);
delay(2000);
if(dis > 1000)
break;
}
break;
case FTP_CMD_ERROR:
break;
}
}
void *process_client_connect(void *arg) {
int sock = *(int *)arg;
int ret;
struct Msg *msg_send = NULL;
struct Msg *msg_recv = NULL;
msg_send = (struct Msg *)malloc(sizeof(struct Msg));
msg_recv = (struct Msg *)malloc(sizeof(struct Msg));
running = 1;
while (running) {
//接受信息
ret = my_recv2(sock, (char*)msg_recv, sizeof(struct Msg));
log_write("recv ret = %d\n", ret);
//处理
handle_cmd(msg_recv, msg_send);
}
return 0;
}
void *xianshi(void *arg) {
float temp = *(float *)arg;
while(1){
if(ds18b20_get_temperature(&temp)<0)
{
printf("Error:ds18b20 get temperature failure.\n");
continue;
}
printf("temp = %.2f\n",temp);
init();
qingping();
shijian();
ascii();
}
return NULL;
}
int main(int argc, char **argv) {
int listenfd;
int sock;
int ret;
if (wiringPiSetup() == -1) {
printf("setup wiringPi failed !");
return 1;
}
ultraInit();
toola();
chushi();
struct sockaddr_in serveraddr;
log_create("server.txt");
// socket
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
log_write("socket failed,listenfd %d", listenfd);
return -1;
}
// bind端口
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = SERVER_PORT;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);//inet_addr("192.168.248.139");
ret = bind(listenfd, (struct sockaddr *)&serveraddr,
sizeof(struct sockaddr_in));
if (ret < 0) {
log_write("bind failed ,ret%d", ret);
return -1;
}
// listen,启用监听模式
ret = listen(listenfd, 0);
if (ret < 0) {
log_write("listen failed ,ret%d", ret);
return -1;
}
while (1) {
// accept,返回已经完成3次握手的socket
int len = sizeof(struct sockaddr_in);
sock = accept(listenfd, (struct sockaddr *)&serveraddr,(socklen_t *)&len);
if (sock < 0) {
log_write("accept failed ,ret%d", ret);
return -1;
}
log_write("client connect\n");
pthread_t t1;
pthread_t t2;
pthread_create(&t1, NULL, process_client_connect, (void *)&sock);
pthread_create(&t2, NULL, xianshi, (void *)&temp);
}
process_client_connect((void *)&sock);
xianshi((void *)&temp);
log_destory();
return 0;
}
//使用 wiringPiSetup() 函数进行初始化
if (wiringPiSetup() == -1) {
printf("setup wiringPi failed !");
return 1;
}
参考博文:
wiringPi 库详解