管脚连接详情
DHT11:G0-D4
ADCPWM:G35-A0,G32-D12
DACMUSIC:D5-G25
PHOTOCELL:G35-A1,G13-D13
G为ESP32-WROOM-32上的管脚,D为EasyShield上的数字管脚,A为EasyShield上的模拟管脚。四个项目均有一个数字管脚,而PWM调光和感光均有一个A管脚,是为了模拟信号输入。
DHT11温湿度传感器:通过DHT11获得环境温湿度
当返回值为0时默认成功,返回值为1时判断为初始化超时错误,返回值为2判断为校验错误;
溢出次数设定为100,超过此值则超时;delay()是ms级延时函数,delayMicroseconds()是us级延时函数;
#define DHT11 0 //控制 DHT11 的 IO 编号,此处为:GPIO0
uint8_t dht11Read(uint8_t *temp, uint8_t *humi);
void setup()
{
Serial.begin(115200); // 初始化串口
}
void loop()
{
// 5s 间隔读取温湿度,并通过串口输出
uint8_t temperature, humidity;
if (!dht11Read(&temperature, &humidity))
Serial.printf("The temp:%d,The humi:%d\r\n", temperature, humidity);
else
Serial.println("Error");
delay(5000);
}
uint8_t ICACHE_FLASH_ATTR dht11_init(void)
{
uint8_t errcode = 0;
uint8_t i = 0;
pinMode(DHT11, OUTPUT); //设置 IO 输出
digitalWrite(DHT11, HIGH); // IO 输出 1
delay(2); //延时 2ms,为下降沿做准备
digitalWrite(DHT11, LOW); // IO 输出 0,产生下降沿
delay(20); //延时 20ms,主机下降沿并保持,18ms 以上的低电平启动 DHT11
digitalWrite(DHT11, HIGH); //再次拉高 IO,等待 DHT11 拉低以作应答
pinMode(DHT11, INPUT); //设置 IO 输入
delayMicroseconds(40); //延时 40us,等待 DHT11 输入的低电平应答信号
//等待 DHT11 拉低 IO,最高持续 100 个 us
while (digitalRead(DHT11) == 1 && i < 100)
{
i++;
delayMicroseconds(1);
}
if (i >= 100)
{
errcode = 1;
return errcode;
}
else
i = 0;
// DHT11 拉低 IO 持续 80us,后会在拉高 IO 持续 80us 作为完整的应答
while (digitalRead(DHT11) == 0 && i < 100)
{
i++;
delayMicroseconds(1);
}
if (i >= 100)
{
errcode = 1;
return errcode;
}
return errcode;
}
uint8_t dht11_readBit(void)
{
uint8_t i = 0;
//等待 IO 变低
while (digitalRead(DHT11) == 1 && i < 100)
{
i++;
delayMicroseconds(1);
}
i = 0;
//等待 IO 变高——先低再高表示开始传输一个 bit
while (digitalRead(DHT11) == 0 && i < 100)
{
i++;
delayMicroseconds(1);
}
delayMicroseconds(40); //等待 40us(0 bit)
if (digitalRead(DHT11) == 1)
return 1;
else
return 0;
}
uint8_t dht11_readByte(void)
{
uint8_t i = 0;
uint8_t data = 0;
for (i = 0; i < 8; i++)
{
data <<= 1;
data |= dht11_readBit();
}
return data;
}
uint8_t dht11Read(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
if (!dht11_init())
{
for (i = 0; i < 5; i++)
buf[i] = dht11_readByte();
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
else
return 2;
}
else
return 1;
return 0;
}
串口输出效果。
ADCPWM旋转电位器:通过可旋转270°电位器控制LED灯珠的PWM调光
#define LED 32 // GPIO32 控制 LED
#define Ain 35 // GPIO35 模拟输入
int i = 0;
void setup()
{
Serial.begin(115200);
ledcSetup(8, 5000, 10); //设置 LEDC 通道 8 频率为 5000,分辨率为 10 位
ledcAttachPin(LED, 8); //设置 LEDC 通道 8 在 IO32 上输出
}
void loop()
{
int n = analogRead(Ain); //读取 Ain 模拟口的数值(0-3.3V 对应 0-4095 取值)
ledcWrite(8, n / 4); // PWM 输出,占空比有效值 0~1023
delay(1);
i++;
if (i >= 1000)
{
Serial.println(n);
i = 0;
}
}
DACMUSIC无源蜂鸣器:通过编写程序实现蜂鸣器播放音乐
调用的music.c文件需自行编写,由于占据篇幅过大不单独提供。
#include "Speaker.h"
#include "music_8bit.h"
SPEAKER Speaker;
void setup() {
Speaker.begin();
Speaker.setVolume(10);
Speaker.playMusic(data, 22500);
}
void loop() {
Speaker.update();
}
#include "Speaker.h"
SPEAKER::SPEAKER(void) {
_volume = 8;
}
void SPEAKER::begin() {
ledcSetup(TONE_PIN_CHANNEL, 0, 13);
ledcAttachPin(SPEAKER_PIN, TONE_PIN_CHANNEL);
// digitalWrite(SPEAKER_PIN, 0);
setBeep(1000, 100);
}
void SPEAKER::tone(uint16_t frequency) {
ledcWriteTone(TONE_PIN_CHANNEL, frequency);
}
void SPEAKER::tone(uint16_t frequency, uint32_t duration) {
tone(frequency);
_count = millis() + duration;
speaker_on = 1;
}
void SPEAKER::beep() {
tone(_beep_freq, _beep_duration);
}
void SPEAKER::setBeep(uint16_t frequency, uint16_t duration) {
_beep_freq = frequency;
_beep_duration = duration;
}
void SPEAKER::setVolume(uint8_t volume) {
_volume = 11 - volume;
}
void SPEAKER::mute() {
ledcWriteTone(TONE_PIN_CHANNEL, 0);
digitalWrite(SPEAKER_PIN, 0);
}
void SPEAKER::update() {
if(speaker_on) {
if(millis() > _count) {
speaker_on = 0;
mute();
}
}
}
void SPEAKER::write(uint8_t value) {
dacWrite(SPEAKER_PIN, value);
}
void SPEAKER::playMusic(const uint8_t* music_data, uint16_t sample_rate) {
uint32_t length =strlen ((char *)music_data);
uint16_t delay_interval = ((uint32_t)1000000/sample_rate);
if(_volume != 11) {
for(int i=0; i<length; i++) {
dacWrite(SPEAKER_PIN, music_data[i]/_volume);
delayMicroseconds(delay_interval);
}
for(int t=music_data[length-1]/_volume; t>=0; t--) {
dacWrite(SPEAKER_PIN, t);
delay(2);
}
}
}
#include "Arduino.h"
#include "esp32-hal-dac.h"
#define SPEAKER_PIN 25
#define TONE_PIN_CHANNEL 0
class SPEAKER {
public:
SPEAKER(void);
void begin();
void mute();
void tone(uint16_t frequency);
void tone(uint16_t frequency, uint32_t duration);
void beep();
void setBeep(uint16_t frequency, uint16_t duration);
void update();
void write(uint8_t value);
void setVolume(uint8_t volume);
void playMusic(const uint8_t* music_data, uint16_t sample_rate);
private:
uint32_t _count;
uint8_t _volume;
uint16_t _beep_duration;
uint16_t _beep_freq;
bool speaker_on;
};
#ifndef _music_8bit_H_
#define _music_8bit_H_
#ifdef __cplusplus
extern "C" {
#endif
extern const unsigned char data[];
#ifdef __cplusplus
}
#endif
#endif
PHOTOCELL亮度传感器:通过改变环境光照亮度实现LED灯珠的亮灭
#define LED 32 // GPIO32 控制 LED
#define Ain 35 // GPIO35 模拟输入
int i = 0;
void setup()
{
Serial.begin(115200);
pinMode(LED, OUTPUT);
}
void loop()
{
int n = analogRead(Ain); //读取 Ain 模拟口的数值(0-3.3V 对应 0-4095 取值)
//光敏电阻接 GND
if (n < 2048)
digitalWrite(LED, HIGH); //若电压值下降表示有光,熄灭 LED
else
digitalWrite(LED, LOW); //若电压值上升表示无光,电路 LED
delay(1);
i++;
if (i >= 1000)
{
Serial.println(n);
i = 0;
}
}
多功能实验扩展板_免费高速下载|百度网盘-分享无限制 (baidu.com)https://pan.baidu.com/s/1mqiDeeu_dbd98ByuJBkPvw#list/path=%2FEasyShield的readme文件和相关资料,提取码:w2ho