树梅派使用部分传感器的示例源码

注: 基于





CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(demo)
add_compile_options(-std=c++11 -Wall -Werror -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-default -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -Wno-pedantic-ms-format)
find_library(WIRINGPI_LIBRARIES NAMES wiringPi)
find_path(WIRINGPI_INCLUDE_DIRS NAMES wiringPi.h)
aux_source_directory(. src)
add_executable(demo ${src})
target_link_libraries(demo ${WIRINGPI_LIBRARIES})




1. 4X4键盘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

树梅派 4x4键盘(对应图中标识)
GPIO 17 R1
GPIO 18 R2
GPIO 27 R3
GPIO 22 R4
GPIO 23 C1
GPIO 24 C2
GPIO 25 C3
GPIO 4 C4
/**
 * @name keyboard.cpp
 * @author IYATT-yx
 * @date 2020/11/4
 * @brief 4X4键盘
 */
#include <iostream>

extern "C"
{
   
    #include <wiringPi.h>
}
 
char str[4][4] = {
   '1', '2', '3', 'A', '4', '5', '6', 'B', '7', '8', '9', 'C', '*', '0', '#', 'D'};
int row[4] = {
   0, 1, 2, 3};
int col[4] = {
   4, 5, 6, 7};
 
void init()
{
   
    if (wiringPiSetup() == -1)
    {
   
        std::cout << "wiringPi初始化失败!" << std::endl;
        exit(EXIT_FAILURE);
    }
}
 
char getKey()
{
   
    // 将4行都设置为输出低电平
    for (int r = 0; r < 4; r++)
    {
   
        pinMode(row[r], OUTPUT);
        digitalWrite(row[r], LOW);
    }
    for (int r = 0; r < 4; r++)
    {
   
        // 循环四次,依次每次将一行设置为高电平
        digitalWrite(row[r], HIGH);
        // 在设置为高电平的那行,又循环将每列设置为输入且自己为低电平,每设置一列就检测是不是出现了高电平
        // (外循环被设置为高电平的那行和此次循环被设置为低电平的输入端导通,即按钮被按下),就确定按下的行列了
        for (int c = 0; c < 4; c++)
        {
   
            pinMode(col[c], INPUT);
            digitalWrite(col[c], LOW);
            if (digitalRead(col[c]) == HIGH)
            {
   
                return str[r][c];
            }
        }
    }
     
    return '\0';
}
 
int main()
{
   
    init();
    while (true)
    {
   
        char ch = getKey();
        if (ch != '\0')
        {
   
            std::cout << getKey() << std::endl;
        }
        delay(400);
    }
}




2. 8X8点阵

在这里插入图片描述

树梅派 MAX7219驱动板
GND GND
5V VCC
GPIO 17 DIN
GPIO 18 CS
GPIO 27 CLK
/**
 * @name 8x8LED.cpp
 * @author IYATT-yx
 * @date 2020/11/4
 * @brief 8X8 LED
 */
#include <iostream>

extern "C"
{
   
    #include <wiringPi.h>
}
 
#define DIN     0
#define CS      1
#define CLK     2
 
// 共8个十六进制数,每个十六进制数对应点阵的一行,下面的这串二进制数会显示一个心型图案
// 点阵中发光的部分对应1,不发光的对应0,
// 则心型图案的第一行是 01100110 转为十六进制就是 0x66
// 第二行为 11111111 转为十六进制就是 0xff
int data[] = {
   0x66,0xff,0xff,0xff,0xff,0x7e,0x3c,0x18};
 
void sendChar(int ch)
{
   
    for (int i = 0; i < 8; i++)
    {
   
        int temp = ch & 0x80;
        if (temp)
        {
   
            digitalWrite(DIN, HIGH);
        }
        else
        {
   
            digitalWrite(DIN, LOW);
        }
        ch = ch << 1;
        digitalWrite(CLK, HIGH);
        digitalWrite(CLK, LOW);
    }
}
 
void writeWord(int addr, int num)
{
   
    digitalWrite(CS, HIGH);
    digitalWrite(CS, LOW);
    digitalWrite(CLK, LOW);
    sendChar(addr);
    sendChar(num);
    digitalWrite(CS, HIGH);
}
 
void write()
{
   
    for (int i = 0; i < 8; i++)
    {
   
        writeWord(i + 1, data[i]);
    }
}
 
void init()
{
   
    if (wiringPiSetup() == -1)
    {
   
        std::cout << "wiringPi初始化失败!" << std::endl;
        exit(EXIT_FAILURE);
    }
    pinMode(DIN, OUTPUT);
    pinMode(CS, OUTPUT);
    pinMode(CLK, OUTPUT);
        writeWord(0x09, 0x00);
        writeWord(0x0a, 0x03);
        writeWord(0x0b, 0x07);
        writeWord(0x0c, 0x01);
}
 
int main()
{
   
    init();
    write();
}




3. DHT11温湿度传感器
在这里插入图片描述
传感器只有三个引脚可用:VCC,GND和OUT. 通信过程主机从OUT发送数据到DHT11,DHT11接收信号并返回应答信号.然后主机接收应答信号并开始接收40位温湿度数据 (8位湿度整数 + 8位湿度小数 + 8位温度整数 + 8位温度小数 + 8位校验和)

树梅派 DHT11
GND GND
3.3V VCC
GPIO 17 OUT
/**
 * @name humiture.cpp
 * @author IYATT-yx
 * @date 2020/12/12
 * @brief DHT11温湿度传感器
 */
#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cstdlib>
#include <vector>

extern "C"
{
   
    #include <wiringPi.h>
}

#define MAXTIMINGS      85
#define pin             0

std::vector<int> dht11Dat = {
   0, 0, 0, 0, 0};

void readDht11Dat()
{
   
    uint8_t lastState = HIGH;
    uint8_t counter = 0;
    uint8_t j = 0;
    std::fill(dht11Dat.begin(), dht11Dat.end(), 0);
    pinMode(pin, OUTPUT);
    digitalWrite(pin, LOW);
    delay(18);
    digitalWrite(pin, HIGH);
    delayMicroseconds(40);
    pinMode(pin, INPUT);
    for (int i = 0; i < MAXTIMINGS; ++i)
    {
   
        counter = 0;
        while (digitalRead(pin) == lastState)
        {
   
            ++counter;
            delayMicroseconds(1);
            if (counter == 255)
            {
   
                break;
            }
        }
        lastState = (uint8_t)digitalRead(pin);
        if (counter == 255)
        {
   
            
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值