| 本帖最后由 lihuahua 于 2024-4-2 21:22 编辑 
 
 小白手把手教你制作 “FireBeetle 2 ESP32 C6开发板”的屏幕+温湿度扩展板-2上一篇文章,小白教大家制作了ESP32 C6的扩展板,含有dht11传感器模块和0.96tft彩屏。链接 
 本篇文章教大家在已有硬件上,实现电池电压采集、dht11传感器数据读取,tft彩屏上显示数据功能。
 
 
 1、代码总体思想: 创建一个线程用于dht11温湿度读取,该线程通过定时器唤醒;
			
			
			复制代码#include <Arduino.h>
#include <Ticker.h>
#include "DHTesp.h" // Click here to get the library: http://librarymanager/All#DHTesp
/** Initialize DHT sensor 1 */
DHTesp dhtSensor1;
/** Task handle for the light value read task */
TaskHandle_t tempTaskHandle = NULL;
/** Pin number for DHT11 1 data pin */
int dhtPin1 = 17;
/** Ticker for temperature reading */
Ticker tempTicker;
/** Flags for temperature readings finished */
bool gotNewTemperature = false;
/** Data from sensor 1 */
TempAndHumidity sensor1Data;
/* Flag if main loop is running */
bool tasksEnabled = false;
/**
 * Task to reads temperature from DHT11 sensor
 * @param pvParameters
 *                pointer to task parameters
 */
void tempTask(void *pvParameters) {
        Serial.println("tempTask loop started");
        while (1) // tempTask loop
        {
                if (tasksEnabled && !gotNewTemperature) { // Read temperature only if old data was processed already
                        // Reading temperature for humidity takes about 250 milliseconds!
                        // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
                        sensor1Data = dhtSensor1.getTempAndHumidity();        // Read values from sensor 1
                        gotNewTemperature = true;
                }
                vTaskSuspend(NULL);
        }
}
/**
 * triggerGetTemp
 * Sets flag dhtUpdated to true for handling in loop()
 * called by Ticker tempTicker
 */
void triggerGetTemp() {
        if (tempTaskHandle != NULL) {
                 xTaskResumeFromISR(tempTaskHandle);
        }
}
 
 创建线程进行电池电压采集、驱动显示器显示温湿度数据和电压值。 线程1的优先级高于线程2的优先级。复制代码#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#define TFT_CS        1
#define TFT_RST        14 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         8
#define TFT_MOSI 22  // Data out
#define TFT_SCLK 23  // Clock out
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
int tft_blk = 15;
TaskHandle_t tftTaskHandle = NULL;
void tftTask(void *pvParameters) {
        while (1) // tempTask loop
        {
    vTaskDelay(2000);
//                Serial.println("Sensor 1 data:");
//                Serial.println("Temp: " + String(sensor1Data.temperature,2) + "'C Humidity: " + String(sensor1Data.humidity,1) + "%");
    
    //数据更新
//    tft.fillRect(5+11*6,15,12*5,15,ST77XX_BLACK);
//    tft.fillRect(5+11*10, 40,12*2,15,ST77XX_BLACK);
    tft.setTextSize(2);tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
    tft.setCursor(5+11*6, 15);  tft.print(String(sensor1Data.temperature,2));
    tft.setCursor(5+11*10, 40); tft.print(String(sensor1Data.humidity,0)+"%");
    //电池电压显示:
    //int analogValue = analogRead(0);
    int analogVolts = analogReadMilliVolts(0);
    tft.setTextSize(1);
    tft.setCursor(3, 3);  
    tft.print(String(analogVolts*0.002,2)+"V");
    gotNewTemperature = false;
        }
}
 复制代码#include <Arduino.h>
#include <Ticker.h>
#include "DHTesp.h" // Click here to get the library: http://librarymanager/All#DHTesp
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#define TFT_CS        1
#define TFT_RST        14 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         8
#define TFT_MOSI 22  // Data out
#define TFT_SCLK 23  // Clock out
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
int tft_blk = 15;
/** Initialize DHT sensor 1 */
DHTesp dhtSensor1;
/** Task handle for the light value read task */
TaskHandle_t tempTaskHandle = NULL;
TaskHandle_t tftTaskHandle = NULL;
/** Pin number for DHT11 1 data pin */
int dhtPin1 = 17;
/** Ticker for temperature reading */
Ticker tempTicker;
/** Flags for temperature readings finished */
bool gotNewTemperature = false;
/** Data from sensor 1 */
TempAndHumidity sensor1Data;
/* Flag if main loop is running */
bool tasksEnabled = false;
/**
 * Task to reads temperature from DHT11 sensor
 * @param pvParameters
 *                pointer to task parameters
 */
void tempTask(void *pvParameters) {
        Serial.println("tempTask loop started");
        while (1) // tempTask loop
        {
                if (tasksEnabled && !gotNewTemperature) { // Read temperature only if old data was processed already
                        // Reading temperature for humidity takes about 250 milliseconds!
                        // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
                        sensor1Data = dhtSensor1.getTempAndHumidity();        // Read values from sensor 1
                        gotNewTemperature = true;
                }
                vTaskSuspend(NULL);
        }
}
void tftTask(void *pvParameters) {
        while (1) // tempTask loop
        {
    vTaskDelay(2000);
//                Serial.println("Sensor 1 data:");
//                Serial.println("Temp: " + String(sensor1Data.temperature,2) + "'C Humidity: " + String(sensor1Data.humidity,1) + "%");
    
    //数据更新
//    tft.fillRect(5+11*6,15,12*5,15,ST77XX_BLACK);
//    tft.fillRect(5+11*10, 40,12*2,15,ST77XX_BLACK);
    tft.setTextSize(2);tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
    tft.setCursor(5+11*6, 15);  tft.print(String(sensor1Data.temperature,2));
    tft.setCursor(5+11*10, 40); tft.print(String(sensor1Data.humidity,0)+"%");
    //电池电压显示:
    //int analogValue = analogRead(0);
    int analogVolts = analogReadMilliVolts(0);
    tft.setTextSize(1);
    tft.setCursor(3, 3);  
    tft.print(String(analogVolts*0.002,2)+"V");
    gotNewTemperature = false;
        }
}
/**
 * triggerGetTemp
 * Sets flag dhtUpdated to true for handling in loop()
 * called by Ticker tempTicker
 */
void triggerGetTemp() {
        if (tempTaskHandle != NULL) {
                 xTaskResumeFromISR(tempTaskHandle);
        }
}
/**
 * Arduino setup function (called once after boot/reboot)
 */
void setup() {
        Serial.begin(115200);
  
  //set the resolution to 12 bits (0-4096)
  analogReadResolution(12);
  //Init ST7735S mini display
  tft.initR(INITR_MINI160x80_PLUGIN);  
  tft.setRotation(1);  tft.fillScreen(ST77XX_BLACK);
  pinMode(tft_blk,OUTPUT);  digitalWrite(tft_blk,HIGH);
  //输出固定文字
  tft.setTextSize(2); tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
  tft.setCursor(5, 15);  tft.print("Temp: ");
  tft.setCursor(5, 40);  tft.print("Humidity: ");
        // Initialize temperature sensor 1
        dhtSensor1.setup(dhtPin1, DHTesp::DHT11);
        xTaskCreatePinnedToCore(
                        tftTask,                                                                                         /* Function to implement the task */
                        "tftTask ",                                                                                /* Name of the task */
                        4000,                                                                                                         /* Stack size in words */
                        NULL,                                                                                                         /* Task input parameter */
                        4,                                                                                                                        /* Priority of the task */
                        &tftTaskHandle,                                                                /* Task handle. */
                        1);                                                                                                                 /* Core where the task should run */
        // Start task to get temperature
        xTaskCreatePinnedToCore(
                        tempTask,                                                                                         /* Function to implement the task */
                        "tempTask ",                                                                                /* Name of the task */
                        4000,                                                                                                         /* Stack size in words */
                        NULL,                                                                                                         /* Task input parameter */
                        5,                                                                                                                        /* Priority of the task */
                        &tempTaskHandle,                                                                /* Task handle. */
                        1);                                                                                                                 /* Core where the task should run */
        if (tempTaskHandle == NULL) {
                Serial.println("[ERROR] Failed to start task for temperature update");
        } else {
                // Start update of environment data every 30 seconds
                tempTicker.attach(2, triggerGetTemp);
        }
        // Signal end of setup() to tasks
        tasksEnabled = true;
} // End of setup.
/**
 * loop
 * Arduino loop function, called once 'setup' is complete (your own code should go here)
 */
void loop() {
} // End of loop
 
 
 
 2、效果图: 如果大家和我一样,遇到tft彩屏边缘有彩条,则需要更改库文件Adafruit_ST7735.cpp中的屏幕偏移值,操作步骤如下:
 
 
 
 3、参考链接: https://wiki.dfrobot.com.cn/_SKU_DFR1075_FireBeetle_2_Board_ESP32_C6https://wiki.dfrobot.com.cn/_SKU_DFR1075_FireBeetle_2_Board_ESP32_C6_Basic_Tutorialhttps://wiki.dfrobot.com.cn/_SKU_DFR1075_FireBeetle_2_Board_ESP32_C6_Advanced_Tutorial
 
 |