Berbagi teknologi

Rumah kaca pintar Qt ESP32 SQLite

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pengenalan lingkungan

Lingkungan perangkat keras

ESP32, sensor cahaya, sensor suhu dan kelembaban, relay, buzzer

Alur kerja dasar

  1. Komputer bagian atas dijalankan terlebih dahulu, dan setelah komputer bagian bawah dimulai, coba sambungkan ke komputer bagian atas.
  2. Setelah koneksi berhasil, data sensor dilaporkan secara teratur ke komputer host, dan komputer host memproses serta menampilkan informasi tersebut.
  3. Tentukan data sensor komputer bagian bawah. Jika melebihi ambang batas yang ditetapkan, maka keluarkan perintah kontrol untuk mengontrol perangkat keras komputer bagian bawah.
  4. Klik tombol kontrol komputer host untuk mengeluarkan instruksi kontrol untuk mengontrol perangkat keras.

Efek pengoperasian PC

Diagram koneksi perangkat keras

Sensor suhu dan kelembaban DHT11

Diagram pengkabelan

VCC3V3

GND GND

DATA GPIO21 (D21)

membaca kode

  1. #include <stdio.h>
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "driver/gpio.h"
  5. #include "sdkconfig.h"
  6. #define DHT11_PIN (21) //可通过宏定义,修改引脚
  7. #define DHT11_CLR gpio_set_level(DHT11_PIN, 0)
  8. #define DHT11_SET gpio_set_level(DHT11_PIN, 1)
  9. #define DHT11_IN gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT)
  10. #define DHT11_OUT gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT)
  11. uint8_t DHT11Data[4]={0};
  12. uint8_t Temp, Humi;
  13. //us延时函数,误差不能太大
  14. void DelayUs( uint32_t nCount)
  15. {
  16. ets_delay_us(nCount);
  17. }
  18. void DHT11_Start(void)
  19. {
  20. DHT11_OUT; //设置端口方向
  21. DHT11_CLR; //拉低端口
  22. DelayUs(19*1000);
  23. // vTaskDelay(19 * portTICK_RATE_MS); //持续最低18ms;
  24. DHT11_SET; //释放总线
  25. DelayUs(30); //总线由上拉电阻拉高,主机延时30uS;
  26. DHT11_IN; //设置端口方向
  27. while(!gpio_get_level(DHT11_PIN)); //DHT11等待80us低电平响应信号结束
  28. while(gpio_get_level(DHT11_PIN));//DHT11 将总线拉高80us
  29. }
  30. uint8_t DHT11_ReadValue(void)
  31. {
  32. uint8_t i,sbuf=0;
  33. for(i=8;i>0;i--)
  34. {
  35. sbuf<<=1;
  36. while(!gpio_get_level(DHT11_PIN));
  37. DelayUs(30); // 延时 30us 后检测数据线是否还是高电平
  38. if(gpio_get_level(DHT11_PIN))
  39. {
  40. sbuf|=1;
  41. }
  42. else
  43. {
  44. sbuf|=0;
  45. }
  46. while(gpio_get_level(DHT11_PIN));
  47. }
  48. return sbuf;
  49. }
  50. uint8_t DHT11_ReadTemHum(uint8_t *buf)
  51. {
  52. uint8_t check;
  53. buf[0]=DHT11_ReadValue();
  54. buf[1]=DHT11_ReadValue();
  55. buf[2]=DHT11_ReadValue();
  56. buf[3]=DHT11_ReadValue();
  57. check =DHT11_ReadValue();
  58. if(check == buf[0]+buf[1]+buf[2]+buf[3])
  59. return 1;
  60. else
  61. return 0;
  62. }
  63. void app_main(void)
  64. {
  65. printf("ESP32 DHT11 TEST:%s,%s!rn",__DATE__,__TIME__);
  66. gpio_pad_select_gpio(DHT11_PIN);
  67. while(1) {
  68. DHT11_Start();
  69. if(DHT11_ReadTemHum(DHT11Data))
  70. {
  71. Temp=DHT11Data[2];
  72. Humi=DHT11Data[0];
  73. printf("Temp=%d, Humi=%drn",Temp,Humi);
  74. }
  75. else
  76. {
  77. printf("DHT11 Error!rn");
  78. }
  79. vTaskDelay(1000); //目前10s读取一次
  80. }
  81. }

TEMT6000

Diagram pengkabelan

VCC-V ...

GND GND

KELUAR GPIO34(D34)

membaca kode

  1. #include "driver/gpio.h"
  2. #include "driver/adc.h"
  3. #include "esp_adc_cal.h"
  4. #include "freertos/FreeRTOS.h"
  5. #include "freertos/task.h"
  6. // ADC所接的通道 GPIO34 if ADC1 = ADC1_CHANNEL_6
  7. #define ADC1_TEST_CHANNEL ADC1_CHANNEL_6
  8. // ADC斜率曲线
  9. static esp_adc_cal_characteristics_t *adc_chars;
  10. // 参考电压
  11. #define DEFAULT_VREF 3300 //使用adc2_vref_to_gpio()获得更好的估计值
  12. void check_efuse(void)
  13. {
  14. //检查TP是否烧入eFuse
  15. if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
  16. printf("eFuse Two Point: Supportedn");
  17. } else {
  18. printf("eFuse Two Point: NOT supportedn");
  19. }
  20. //检查Vref是否烧入eFuse
  21. if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
  22. printf("eFuse Vref: Supportedn");
  23. } else {
  24. printf("eFuse Vref: NOT supportedn");
  25. }
  26. }
  27. void adc_init(void)
  28. {
  29. adc1_config_width(ADC_WIDTH_BIT_12);// 12位分辨率
  30. adc1_config_channel_atten(ADC1_TEST_CHANNEL, ADC_ATTEN_DB_11);// 电压输入衰减
  31. adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t)); // 为斜率曲线分配内存
  32. 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);
  33. // print_char_val_type(val_type);
  34. }
  35. void app_main(void)
  36. {
  37. uint32_t read_raw;
  38. check_efuse();
  39. adc_init();
  40. while(1){
  41. read_raw = adc1_get_raw(ADC1_TEST_CHANNEL);// 采集ADC原始值//这里可以多次采样取平均值
  42. uint32_t voltage = esp_adc_cal_raw_to_voltage(read_raw, adc_chars);//通过一条斜率曲线把读取adc1_get_raw()的原始数值转变成了mV
  43. printf("ADC原始值: %d 转换电压值: %dmVn", read_raw, voltage);
  44. vTaskDelay(1000 / portTICK_RATE_MS);
  45. }
  46. }

Penundaan 1 detik

  • 1200 senter tingkat 1
  • 2688 Senter gigi 2
  • 4079 senter 3 tingkat

sensor asap

Diagram pengkabelan

3V3

VCC

GND

GND

MELAKUKAN

GPIO15

JADI

GPIO2

membaca kode

  1. /* ADC1 Example
  2. This example code is in the Public Domain (or CC0 licensed, at your option.)
  3. Unless required by applicable law or agreed to in writing, this
  4. software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  5. CONDITIONS OF ANY KIND, either express or implied.
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "freertos/FreeRTOS.h"
  10. #include "freertos/task.h"
  11. #include "driver/gpio.h"
  12. #include "driver/adc.h"
  13. #include "esp_adc_cal.h"
  14. #define DEFAULT_VREF 1100 //Use adc2_vref_to_gpio() to obtain a better estimate
  15. #define NO_OF_SAMPLES 64 //Multisampling
  16. static esp_adc_cal_characteristics_t *adc_chars;
  17. #if CONFIG_IDF_TARGET_ESP32
  18. static const adc_channel_t channel = ADC_CHANNEL_6; //GPIO34 if ADC1, GPIO14 if ADC2
  19. static const adc_bits_width_t width = ADC_WIDTH_BIT_12;
  20. #elif CONFIG_IDF_TARGET_ESP32S2
  21. static const adc_channel_t channel = ADC_CHANNEL_6; // GPIO7 if ADC1, GPIO17 if ADC2
  22. static const adc_bits_width_t width = ADC_WIDTH_BIT_13;
  23. #endif
  24. static const adc_atten_t atten = ADC_ATTEN_DB_0;
  25. static const adc_unit_t unit = ADC_UNIT_1;
  26. static void check_efuse(void)
  27. {
  28. #if CONFIG_IDF_TARGET_ESP32
  29. //Check if TP is burned into eFuse
  30. if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
  31. printf("eFuse Two Point: Supportedn");
  32. } else {
  33. printf("eFuse Two Point: NOT supportedn");
  34. }
  35. //Check Vref is burned into eFuse
  36. if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
  37. printf("eFuse Vref: Supportedn");
  38. } else {
  39. printf("eFuse Vref: NOT supportedn");
  40. }
  41. #elif CONFIG_IDF_TARGET_ESP32S2
  42. if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
  43. printf("eFuse Two Point: Supportedn");
  44. } else {
  45. printf("Cannot retrieve eFuse Two Point calibration values. Default calibration values will be used.n");
  46. }
  47. #else
  48. #error "This example is configured for ESP32/ESP32S2."
  49. #endif
  50. }
  51. static void print_char_val_type(esp_adc_cal_value_t val_type)
  52. {
  53. if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
  54. printf("Characterized using Two Point Valuen");
  55. } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
  56. printf("Characterized using eFuse Vrefn");
  57. } else {
  58. printf("Characterized using Default Vrefn");
  59. }
  60. }
  61. void app_main(void)
  62. {
  63. //Check if Two Point or Vref are burned into eFuse
  64. check_efuse();
  65. //Configure ADC
  66. if (unit == ADC_UNIT_1) {
  67. adc1_config_width(width);
  68. adc1_config_channel_atten(channel, atten);
  69. } else {
  70. adc2_config_channel_atten((adc2_channel_t)channel, atten);
  71. }
  72. //Characterize ADC
  73. adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
  74. esp_adc_cal_value_t val_type = esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
  75. print_char_val_type(val_type);
  76. //Continuously sample ADC1
  77. while (1) {
  78. uint32_t adc_reading = 0;
  79. //Multisampling
  80. for (int i = 0; i < NO_OF_SAMPLES; i++) {
  81. if (unit == ADC_UNIT_1) {
  82. adc_reading += adc1_get_raw((adc1_channel_t)channel);
  83. } else {
  84. int raw;
  85. adc2_get_raw((adc2_channel_t)channel, width, &raw);
  86. adc_reading += raw;
  87. }
  88. }
  89. adc_reading /= NO_OF_SAMPLES;
  90. //Convert adc_reading to voltage in mV
  91. uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
  92. printf("Raw: %dtVoltage: %dmVn", adc_reading, voltage);
  93. vTaskDelay(pdMS_TO_TICKS(1000));
  94. }
  95. }

bel

Diagram pengkabelan

VCC-V ...

GND GND

Masukan/Keluaran D2 (GPIO2)

Kode pengaturan

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include "driver/gpio.h"
  5. #define LED_PIN 2
  6. void app_main(void)
  7. {
  8. gpio_reset_pin(LED_PIN); //引脚复位
  9. gpio_pad_select_gpio(LED_PIN); //GPIO引脚功能选择
  10. gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); //设置方向为输出
  11. while (1)
  12. {
  13. gpio_set_level(LED_PIN,1); //设置LED_PIN为高电平
  14. sleep(1);
  15. gpio_set_level(LED_PIN,0); //设置LED_PIN为低电平
  16. sleep(1);
  17. }
  18. }

menyampaikan

DC+ (VCC) Hubungkan ke port 1

DC- (GND) terhubung ke port 6

IN1 terhubung ke port 7

Kode sistem secara keseluruhan

Alamat gudang Github