本帖最后由 LightP 于 2025-1-10 23:14 编辑  
 
#define LED_PIN_IN1 25
#define LED_PIN_IN2 27
#define LED_PIN_IN3 32
void setup(){
pinMode(LED_PIN_IN1,INPUT_PULLDOWN);
pinMode(LED_PIN_IN2,INPUT_PULLDOWN);
pinMode(LED_PIN_IN3,INPUT_PULLDOWN);
}
void loop()
{
                Serial.print(String(digitalRead(LED_PIN_IN1))+String(digitalRead(LED_PIN_IN2))+String(digitalRead(LED_PIN_IN3)));
                Serial.println("");
}复制代码 
 
 
 
void getFanLevel()
{
static uint8_t fanLevelLast = 0;
                if(digitalRead(LED_PIN_IN1) == 1 && digitalRead(LED_PIN_IN2) == 1 && digitalRead(LED_PIN_IN3) == 1)
                {
                        fanLevel = 0;
                }
                else if(digitalRead(LED_PIN_IN1) == 0 && digitalRead(LED_PIN_IN2) == 1 && digitalRead(LED_PIN_IN3) == 0)
                {
                        fanLevel = 1;
                }
                else if(digitalRead(LED_PIN_IN1) == 0 && digitalRead(LED_PIN_IN2) == 0 && digitalRead(LED_PIN_IN3) == 1 && fanLevelLast == 1)
                {
                        fanLevel = 2;
                }
                else if(digitalRead(LED_PIN_IN1) == 1 && digitalRead(LED_PIN_IN2) == 0 && digitalRead(LED_PIN_IN3) == 0)
                {
                        fanLevel = 3;
                }
                else if(digitalRead(LED_PIN_IN1) == 0 && digitalRead(LED_PIN_IN2) == 0 && digitalRead(LED_PIN_IN3) == 1 && fanLevelLast == 3)
                {
                        fanLevel = 4;
                }
                if(fanLevel != fanLevelLast)
                {
                        fanLevelLast = fanLevel;
                }
}复制代码 
 至此,风扇挡位读取搞定,接下来搞按键部分,接下来的代码部分比较多,所以我把它上传到github 和gitee :letter-shell (在这里对原作者表示感谢),根据手册这个shell的移植也非常简单,只要将对应的文件移入工程,但是由于arduino属于Cpp,所以要把src文件夹中的shell.h换成extensions/cpp_support中的shell_cpp.h。然后再实现两个接口函数就行
#define     SHELL_USING_CMD_EXPORT      0复制代码 
 
static signed short shellWrite(char *data, unsigned short len)
{
        Serial.write((uint8_t *)data, len);
        return len;
}
static signed short shellRead(char *data, unsigned short len)
{
        unsigned short i = 0;
        while (Serial.available() && i < len)
        {
                data[i] = Serial.read();
                i++;
        }
        return i;
}复制代码 
 然后在setup函数添加对应的初始化如下
Serial.begin(115200);
        debugShell.read = shellRead;
        debugShell.write = shellWrite;
        shellInit(&debugShell, shellBuffer, 512);复制代码 
 
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>复制代码 
 创建对应的任务
xTaskCreate(fanLevelJudge, "fanLevelJudge", 4096, NULL, 2, NULL);
        xTaskCreate(shellTask, "shellTask", 4096, &debugShell, tskIDLE_PRIORITY, NULL);复制代码 
 注意这里letter-shell任务是原生支持在rtos中直接执行,再将letter-shell中的shellTask传入,再将shell控制handle作为形参传入任务
#define     SHELL_TASK_WHILE            0复制代码 
 至
#define     SHELL_TASK_WHILE            1复制代码