lihuahua 发表于 2024-4-2 21:22:00

FireBeetle 2 ESP32 C6+小白手把手教你制作屏幕+温湿度扩展板 2

本帖最后由 lihuahua 于 2024-4-2 21:22 编辑

小白手把手教你制作 “FireBeetle 2 ESP32 C6开发板”的屏幕+温湿度扩展板-2上一篇文章,小白教大家制作了ESP32 C6的扩展板,含有dht11传感器模块和0.96tft彩屏。链接

本篇文章教大家在已有硬件上,实现电池电压采集、dht11传感器数据读取,tft彩屏上显示数据功能。

1、代码总体思想:代码使用freertos,创建两个线程:

[*]温湿度传感器数据读取
创建一个线程用于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(" 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_C6
[*]https://wiki.dfrobot.com.cn/_SKU_DFR1075_FireBeetle_2_Board_ESP32_C6_Basic_Tutorial
[*]https://wiki.dfrobot.com.cn/_SKU_DFR1075_FireBeetle_2_Board_ESP32_C6_Advanced_Tutorial


页: [1]
查看完整版本: FireBeetle 2 ESP32 C6+小白手把手教你制作屏幕+温湿度扩展板 2