<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307R_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
'custom_main/src/uart.c',
'custom_main/src/sht3x.c',
current_dir + '/custom_main',
#include "custom_main.h"
#include "stdio.h"
#include "stdlib.h"
#include "cm_fs.h"
#include "cm_mem.h"
#include "cm_sys.h"
#include "cm_sim.h"
#include "cm_rtc.h"
#include "cm_os.h"
#include "cm_i2c.h"
#include "cm_gpio.h"
#include "cm_iomux.h"
#include "cm_uart.h"
#include "uart.h"
#include "sht3x.h"
/********************************************uart0**************************************************/
uartStruct uart0={0};//Определение переменных структуры последовательного порта
void uartRecvData(uint32_t flags, char *data, int len)
{
uartSendData(&uart0, data, len);//Вернем полученные данные
}
/********************************************Sht30**************************************************/
osThreadId_t osThreadIdSht30; //Дескриптор (идентификатор), используемый для записи задачи, который можно использовать для остановки задачи
static void osThreadIdSht30Fun(void *param)
{
cm_i2c_cfg_t config = {
CM_I2C_ADDR_TYPE_7BIT,
CM_I2C_MODE_MASTER,
CM_I2C_CLK_100KHZ
};
int32_t ret=0;
sht3x_init(&sht3x, SHT3X_DEV_ADDR);
char print_buff[100];
int len=0;
while (1)
{
//Запускаем i2c
if (cm_i2c_open(SHT3X_I2C_ID, &config)!=0)
{
cm_log_printf(0,"i2c init err, ret = %d\n", ret);
osDelay(1000/5);//Задержка
cm_i2c_close(SHT3X_I2C_ID);
osDelay(20/5);//Задержка
}
else
{
cm_log_printf(0,"i2c init ok\n");
// Датчик запуска
osDelay(20/5);//Задержка
ret = sht3x_begin(&sht3x);
if (ret != 0)
{
cm_log_printf(0,"SHT3x begin failed\n");
osDelay(1000/5);//Задержка
cm_i2c_close(SHT3X_I2C_ID);
osDelay(20/5);//Задержка
}
else
{
osDelay(20);//Задержка
while (1)
{
ret = sht3x_measure(&sht3x);// Чтение данных датчика
if (ret != 0)
{
cm_log_printf(0,"Failed to read from SHT3x\n");
break;
}
else
{
//Печать данных о температуре и влажности
len = snprintf(print_buff, sizeof(print_buff), "Temperature: %.2f C, Humidity: %.2f %%\n", sht3x.temperature, sht3x.humidity);
uartSendData(&uart0, print_buff, len);
}
osDelay(100); //Отложенное чтение однократных данных
}
}
}
}
}
int cm_opencpu_entry(void *param)
{
(void)param;
//Конфигурацияпоследовательный порт uart0.uartId = 0;//Конфигурация Номер последовательного порта
uart0.uartRecvCb = uartRecvData;//Настраиваем функцию приема
uart0.config.baudrate = 115200;//Скорость передачи данных
uart0.config.byte_size = CM_UART_BYTE_SIZE_8;//данные位数 uart0.config.flow_ctrl = CM_UART_FLOW_CTRL_NONE;//Аппаратное управление потоком данных
uart0.config.parity = CM_UART_PARITY_NONE;//Проверка четности
uart0.config.stop_bit = CM_UART_STOP_BIT_ONE; //Стоповый бит;
uart0.config.is_lpuart = 0;//Если вы хотите, чтобы Конфигурация находилась в режиме низкого энергопотребления, вы можете изменить его на 1
if (uart_init(&uart0) !=0)//Инициализируем последовательный порт
{
return -1;
}
//Задание настройки sht30
osThreadAttr_t app_task_attr = {0};
app_task_attr.name = "osThreadIdSht30";//Имя задачи — любое
app_task_attr.stack_size = 4096 * 2;//Задача использует размер стека - просто напишите это
app_task_attr.priority = osPriorityNormal;//Приоритет задачи-нормальный приоритет
// возвращаем дескриптор задачи Функция задачи 给Функция Параметры задачи Конфигурация задачи
osThreadIdSht30 = osThreadNew((osThreadFunc_t)osThreadIdSht30Fun, NULL, &app_task_attr);
return 0;
}
.