2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
ESP32, Lichtsensor, Temperatur- und Feuchtigkeitssensor, Relais, Summer
Schaltplan
VCC 3V3
Masse Masse
DATEN GPIO21 (D21)
Code lesen
- #include <stdio.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "driver/gpio.h"
- #include "sdkconfig.h"
-
- #define DHT11_PIN (21) //可通过宏定义,修改引脚
-
- #define DHT11_CLR gpio_set_level(DHT11_PIN, 0)
- #define DHT11_SET gpio_set_level(DHT11_PIN, 1)
- #define DHT11_IN gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT)
- #define DHT11_OUT gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT)
-
- uint8_t DHT11Data[4]={0};
- uint8_t Temp, Humi;
-
- //us延时函数,误差不能太大
- void DelayUs( uint32_t nCount)
- {
- ets_delay_us(nCount);
- }
-
- void DHT11_Start(void)
- {
- DHT11_OUT; //设置端口方向
- DHT11_CLR; //拉低端口
- DelayUs(19*1000);
- // vTaskDelay(19 * portTICK_RATE_MS); //持续最低18ms;
-
- DHT11_SET; //释放总线
- DelayUs(30); //总线由上拉电阻拉高,主机延时30uS;
- DHT11_IN; //设置端口方向
-
- while(!gpio_get_level(DHT11_PIN)); //DHT11等待80us低电平响应信号结束
- while(gpio_get_level(DHT11_PIN));//DHT11 将总线拉高80us
- }
-
- uint8_t DHT11_ReadValue(void)
- {
- uint8_t i,sbuf=0;
- for(i=8;i>0;i--)
- {
- sbuf<<=1;
- while(!gpio_get_level(DHT11_PIN));
- DelayUs(30); // 延时 30us 后检测数据线是否还是高电平
- if(gpio_get_level(DHT11_PIN))
- {
- sbuf|=1;
- }
- else
- {
- sbuf|=0;
- }
- while(gpio_get_level(DHT11_PIN));
- }
- return sbuf;
- }
-
- uint8_t DHT11_ReadTemHum(uint8_t *buf)
- {
- uint8_t check;
-
- buf[0]=DHT11_ReadValue();
- buf[1]=DHT11_ReadValue();
- buf[2]=DHT11_ReadValue();
- buf[3]=DHT11_ReadValue();
-
- check =DHT11_ReadValue();
-
- if(check == buf[0]+buf[1]+buf[2]+buf[3])
- return 1;
- else
- return 0;
- }
-
- void app_main(void)
- {
- printf("ESP32 DHT11 TEST:%s,%s!rn",__DATE__,__TIME__);
- gpio_pad_select_gpio(DHT11_PIN);
- while(1) {
- DHT11_Start();
- if(DHT11_ReadTemHum(DHT11Data))
- {
- Temp=DHT11Data[2];
- Humi=DHT11Data[0];
- printf("Temp=%d, Humi=%drn",Temp,Humi);
- }
- else
- {
- printf("DHT11 Error!rn");
- }
- vTaskDelay(1000); //目前10s读取一次
- }
- }
VCC VCC
Masse Masse
AUS GPIO34 (D34)
Code lesen
- #include "driver/gpio.h"
- #include "driver/adc.h"
- #include "esp_adc_cal.h"
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
-
- // ADC所接的通道 GPIO34 if ADC1 = ADC1_CHANNEL_6
- #define ADC1_TEST_CHANNEL ADC1_CHANNEL_6
- // ADC斜率曲线
- static esp_adc_cal_characteristics_t *adc_chars;
- // 参考电压
- #define DEFAULT_VREF 3300 //使用adc2_vref_to_gpio()获得更好的估计值
-
-
- void check_efuse(void)
- {
- //检查TP是否烧入eFuse
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
- printf("eFuse Two Point: Supportedn");
- } else {
- printf("eFuse Two Point: NOT supportedn");
- }
- //检查Vref是否烧入eFuse
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
- printf("eFuse Vref: Supportedn");
- } else {
- printf("eFuse Vref: NOT supportedn");
- }
- }
- void adc_init(void)
- {
- adc1_config_width(ADC_WIDTH_BIT_12);// 12位分辨率
- adc1_config_channel_atten(ADC1_TEST_CHANNEL, ADC_ATTEN_DB_11);// 电压输入衰减
- adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t)); // 为斜率曲线分配内存
- esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars);
- // print_char_val_type(val_type);
- }
- void app_main(void)
- {
- uint32_t read_raw;
- check_efuse();
- adc_init();
- while(1){
- read_raw = adc1_get_raw(ADC1_TEST_CHANNEL);// 采集ADC原始值//这里可以多次采样取平均值
- uint32_t voltage = esp_adc_cal_raw_to_voltage(read_raw, adc_chars);//通过一条斜率曲线把读取adc1_get_raw()的原始数值转变成了mV
- printf("ADC原始值: %d 转换电压值: %dmVn", read_raw, voltage);
- vTaskDelay(1000 / portTICK_RATE_MS);
- }
- }
Verzögerung 1s
Schaltplan
3 gegen 3 | VCC |
Masse | Masse |
TUN | GPIO15 |
AO | GPIO2 |
Code lesen
- /* ADC1 Example
-
- This example code is in the Public Domain (or CC0 licensed, at your option.)
-
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "driver/gpio.h"
- #include "driver/adc.h"
- #include "esp_adc_cal.h"
-
- #define DEFAULT_VREF 1100 //Use adc2_vref_to_gpio() to obtain a better estimate
- #define NO_OF_SAMPLES 64 //Multisampling
-
- static esp_adc_cal_characteristics_t *adc_chars;
- #if CONFIG_IDF_TARGET_ESP32
- static const adc_channel_t channel = ADC_CHANNEL_6; //GPIO34 if ADC1, GPIO14 if ADC2
- static const adc_bits_width_t width = ADC_WIDTH_BIT_12;
- #elif CONFIG_IDF_TARGET_ESP32S2
- static const adc_channel_t channel = ADC_CHANNEL_6; // GPIO7 if ADC1, GPIO17 if ADC2
- static const adc_bits_width_t width = ADC_WIDTH_BIT_13;
- #endif
- static const adc_atten_t atten = ADC_ATTEN_DB_0;
- static const adc_unit_t unit = ADC_UNIT_1;
-
-
- static void check_efuse(void)
- {
- #if CONFIG_IDF_TARGET_ESP32
- //Check if TP is burned into eFuse
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
- printf("eFuse Two Point: Supportedn");
- } else {
- printf("eFuse Two Point: NOT supportedn");
- }
- //Check Vref is burned into eFuse
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
- printf("eFuse Vref: Supportedn");
- } else {
- printf("eFuse Vref: NOT supportedn");
- }
- #elif CONFIG_IDF_TARGET_ESP32S2
- if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
- printf("eFuse Two Point: Supportedn");
- } else {
- printf("Cannot retrieve eFuse Two Point calibration values. Default calibration values will be used.n");
- }
- #else
- #error "This example is configured for ESP32/ESP32S2."
- #endif
- }
-
-
- static void print_char_val_type(esp_adc_cal_value_t val_type)
- {
- if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
- printf("Characterized using Two Point Valuen");
- } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
- printf("Characterized using eFuse Vrefn");
- } else {
- printf("Characterized using Default Vrefn");
- }
- }
-
-
- void app_main(void)
- {
- //Check if Two Point or Vref are burned into eFuse
- check_efuse();
-
- //Configure ADC
- if (unit == ADC_UNIT_1) {
- adc1_config_width(width);
- adc1_config_channel_atten(channel, atten);
- } else {
- adc2_config_channel_atten((adc2_channel_t)channel, atten);
- }
-
- //Characterize ADC
- adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
- esp_adc_cal_value_t val_type = esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
- print_char_val_type(val_type);
-
- //Continuously sample ADC1
- while (1) {
- uint32_t adc_reading = 0;
- //Multisampling
- for (int i = 0; i < NO_OF_SAMPLES; i++) {
- if (unit == ADC_UNIT_1) {
- adc_reading += adc1_get_raw((adc1_channel_t)channel);
- } else {
- int raw;
- adc2_get_raw((adc2_channel_t)channel, width, &raw);
- adc_reading += raw;
- }
- }
- adc_reading /= NO_OF_SAMPLES;
- //Convert adc_reading to voltage in mV
- uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
- printf("Raw: %dtVoltage: %dmVn", adc_reading, voltage);
- vTaskDelay(pdMS_TO_TICKS(1000));
- }
- }
Schaltplan
VCC VCC
Masse Masse
E/A D2 (GPIO2)
Setup-Code
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include "driver/gpio.h"
-
- #define LED_PIN 2
-
-
- void app_main(void)
- {
- gpio_reset_pin(LED_PIN); //引脚复位
- gpio_pad_select_gpio(LED_PIN); //GPIO引脚功能选择
- gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); //设置方向为输出
- while (1)
- {
- gpio_set_level(LED_PIN,1); //设置LED_PIN为高电平
- sleep(1);
- gpio_set_level(LED_PIN,0); //设置LED_PIN为低电平
- sleep(1);
- }
- }
DC+ (VCC) An Port 1 anschließen
DC- (GND) verbunden mit Port 6
IN1 verbindet sich mit Port 7