基于树莓派的智能清洁桶(C语言)

文章目录

  • 智能清洁桶硬件
  • 需要实现的功能
  • GPIO接口设置
    • 树莓派wiringPi常用的函数介绍
    • 通道配置
    • 管脚类型设置及初始化
    • 控制代码
      • 超声波测距
      • 电机控制前后左右停
      • 舵机控制清洁桶的打开角度
  • OLED屏以及温度模块的使用
    • OLED屏启用
      • 开启i2c功能
      • OLED屏连线
      • OLED显示代码(时间,温度等)
    • 温度模块
      • 启用温度模块
      • 温度模块接线
      • 直接查看温度
      • 代码获取温度
  • 使用客户端、服务端控制智能清洁桶
    • 定义命令
    • 写一个日志(用来记录程序运行时的各个情况)
    • 客户端(负责发送命令)
    • 服务端(接受命令并做出行动)
  • 总结

智能清洁桶硬件

硬件包括小车底盘套装(底盘、车轮、电机)、超声波探测模块(HC-SR04)、树莓派、OLED 屏幕(I2C 12832)、L9110S桥两路直流电机驱动板、DS18B20温度传感器、SG90舵机、垃圾桶

需要实现的功能

1.通过客户端和服务端收发命令,进行控制智能清洁桶;2.需要实现遥控运动,检测障碍躲避;3.识别扔垃圾动作,主动打开盖子并等待关上;4.检测温度,时间,不断刷新显示在OLED屏幕上。

GPIO接口设置

基于树莓派的智能清洁桶(C语言)_第1张图片

树莓派wiringPi常用的函数介绍

在这里,我使用的是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度
    }
}

OLED屏以及温度模块的使用

OLED屏启用

开启i2c功能

sudo apt-get install -y i2c-tools
sudo raspi-config

打开树莓派配置选择5 Interfacing Options。
基于树莓派的智能清洁桶(C语言)_第2张图片
选择P5 I2C回车激活I2C。
基于树莓派的智能清洁桶(C语言)_第3张图片
回车,启动后,重启树莓派
基于树莓派的智能清洁桶(C语言)_第4张图片
下面通过命令检测是否识别到 I2C 设备。

sudo i2cdetect -y 1

基于树莓派的智能清洁桶(C语言)_第5张图片
显示3c表示连接成功。(接触不好可能导致不显示,连接失败)

OLED屏连线

OLED引脚 树莓派物理BOARD引脚
VCC 1号(3.3V)
GND 6号(GND)
SCL 5号(SCL.1)
SDA 3号(SDA.1)

OLED显示代码(时间,温度等)

#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
基于树莓派的智能清洁桶(C语言)_第6张图片
enable 1-wire interface
基于树莓派的智能清洁桶(C语言)_第7张图片

温度模块接线

接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;
}

总结

  1. 树莓派在以 wiringPi 接口使用各个模块时,必须在执行任何操作前初始化树莓派,否则程序不能正常工作。但多次调用也会造成程序错误。统一调用即可
//使用 wiringPiSetup() 函数进行初始化
 if (wiringPiSetup() == -1) {
        printf("setup wiringPi failed !");
        return 1;
    }

参考博文:
wiringPi 库详解

  1. 舵机的使用:
    参考博文:
    通过wiringpi C库控制sg90舵机
  2. 多线程的使用:
    原理: 一个进程可以有很多线程,每条线程并行执行不同的任务。使用多线程的方式,因为可以使用共享的全局变量,所以线程间的通信(数据交换)变得非常高效。
    本项目中的用途: 1.不断获取温度值、时间,然后打印到OLED屏幕上;2.不断检测客户端与服务端的连接,收发数据;
  3. 在许多模块不清楚的时候,多百度,多测试,独立解决问题。

你可能感兴趣的:(树莓派,智能)