注: 基于
- 硬件: Raspberry Pi 4B 4G 1.1
- 系统: Raspberry Pi OS 64bit beta
- SDK: wiringPi32位系统版 wiringPi64位系统版
- 语言: C++11
测试通过
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)
{