Κοινή χρήση τεχνολογίας

Έξυπνο θερμοκήπιο Qt ESP32 SQLite

2024-07-12

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

Περιβαλλοντική εισαγωγή

Περιβάλλον υλικού

ESP32, αισθητήρας φωτός, αισθητήρας θερμοκρασίας και υγρασίας, ρελέ, βομβητής

Βασική ροή εργασίας

  1. Ο επάνω υπολογιστής εκτελείται πρώτα και μετά την εκκίνηση του κάτω υπολογιστή, προσπαθήστε να συνδεθείτε στον επάνω υπολογιστή.
  2. Μετά την επιτυχή σύνδεση, τα δεδομένα του αισθητήρα αναφέρονται τακτικά στον κεντρικό υπολογιστή και ο κεντρικός υπολογιστής επεξεργάζεται και εμφανίζει τις πληροφορίες.
  3. Προσδιορίστε τα δεδομένα αισθητήρα του κάτω υπολογιστή Εάν υπερβούν το καθορισμένο όριο, τότε εκδώστε μια εντολή ελέγχου για τον έλεγχο του υλικού του κάτω υπολογιστή.
  4. Κάντε κλικ στο κουμπί ελέγχου του κεντρικού υπολογιστή για να εκδώσετε οδηγίες ελέγχου για τον έλεγχο του υλικού.

εφέ λειτουργίας υπολογιστή

Διάγραμμα σύνδεσης υλικού

Αισθητήρας θερμοκρασίας και υγρασίας DHT11

Διάγραμμα συνδεσμολογίας

VCC 3V3

GND GND

DATA GPIO21 (D21)

διαβάστε τον κώδικα

  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

Διάγραμμα συνδεσμολογίας

VCC VCC

GND GND

OUT GPIO34 (D34)

διαβάστε τον κώδικα

  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. }

Καθυστέρηση 1 δευτ

  • 1200 φακός επιπέδου 1
  • 2688 Φακός 2ης ταχύτητας
  • 4079 φακός 3 επιπέδων

αισθητήρα καπνού

Διάγραμμα συνδεσμολογίας

3V3

VCC

GND

GND

ΚΑΝΩ

GPIO15

ΑΟ

GPIO2

διαβάστε τον κώδικα

  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. }

βομβητής

Διάγραμμα συνδεσμολογίας

VCC VCC

GND GND

I/O D2 (GPIO2)

Κωδικός εγκατάστασης

  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. }

αναμετάδοση

DC+ (VCC) Σύνδεση στη θύρα 1

DC- (GND) συνδεδεμένο στη θύρα 6

Το IN1 συνδέεται στη θύρα 7

Συνολικός κωδικός συστήματος

Διεύθυνση αποθήκης Github