esp32-c-简单应用笔记

目录

    • 1、资料
    • 2、创建线程的LED闪烁
    • 3、创建线程的读取GPIO输入电平
    • 4、使用LEDC实现简单呼吸灯:

1、资料

ESP32 开发环境 Espressif-IDE:
https://blog.csdn.net/chuner0425/article/details/123466848
https://blog.csdn.net/bin_zhang1/article/details/129993820?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-129993820-blog-129054762.235v40pc_relevant_default_base&spm=1001.2101.3001.4242.1&utm_relevant_index=3

开发板资料:https://wiki.luatos.com/chips/esp32c3/hardware.html

API资料:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32c3/api-reference/peripherals/gpio.html

头文件路径:components/esp_driver_gpio/include/driver/gpio.h

应用示例路径:GPIO 输出和输入中断示例:peripherals/gpio/generic_gpio。

想要在CSDN文章中生成目录,需要两步:在博文中(一般是文章顶部)加上:@[TOC](这里写目录标题)
然后使用#对标题编号。
----------------------------------
程序调试的Log是可以在程序中选择:
esp_log_level_set( TAG, ESP_LOG_INFO );ESP_LOG_NONE: 禁用所有日志输出
ESP_LOG_ERROR: 仅输出错误信息
ESP_LOG_WARN: 输出警告和错误信息
ESP_LOG_INFO: 输出信息、警告和错误信息
ESP_LOG_DEBUG: 输出调试、信息、警告和错误信息
ESP_LOG_VERBOSE: 输出所有日志信息vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);               //延时1s
时钟速率设为1000hz,时间片是1ms及portTICK_PERIOD_MS=1000/configTICK_RATE_HZ=1ms
所以vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
等价于vTaskDelay(1000/1000=vTaskDelay(1=1s
————————————————#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "led_strip.h"
#include "sdkconfig.h"static const char *TAG = "LED";#define LED1_GPIO 12
#define LED2_GPIO 13static uint8_t s_led_state = 0;
static led_strip_handle_t led_strip;static void blink_led(void)
{//设置某个GPIO的 输出电平gpio_set_level(LED1_GPIO, s_led_state);gpio_set_level(LED2_GPIO, s_led_state);
}static void configure_led(void)
{/* Set the GPIO as a push/pull output */gpio_reset_pin(LED1_GPIO);gpio_set_direction(LED1_GPIO, GPIO_MODE_OUTPUT); //设置GPIO方向(输入 或者 输出)gpio_reset_pin(LED2_GPIO);gpio_set_direction(LED2_GPIO, GPIO_MODE_OUTPUT);
}void app_main(void)
{configure_led();esp_log_level_set(TAG, ESP_LOG_VERBOSE);while (1){ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");blink_led();/* Toggle the LED state */s_led_state = !s_led_state;vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);}
}运行后打印的:
I (3927313) LED: Turning the LED ON!
I (3928313) LED: Turning the LED OFF!

2、创建线程的LED闪烁

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "led_strip.h"
#include "sdkconfig.h"static const char *TAG = "LED";#define LED1_GPIO 12
#define LED2_GPIO 13static uint8_t s_led_state = 0;
static led_strip_handle_t led_strip;static void blink_led(void)
{/* Set the GPIO level according to the state (LOW or HIGH)*/gpio_set_level(LED1_GPIO, s_led_state);gpio_set_level(LED2_GPIO, s_led_state);
}static void configure_led(void)
{/* Set the GPIO as a push/pull output */gpio_reset_pin(LED1_GPIO);gpio_set_direction(LED1_GPIO, GPIO_MODE_OUTPUT);gpio_reset_pin(LED2_GPIO);gpio_set_direction(LED2_GPIO, GPIO_MODE_OUTPUT);
}static void LED_task(void *pvParameters)
{while (1){s_led_state = !s_led_state;blink_led();ESP_LOGI(TAG, "LED_task the LED %s!", s_led_state == true ? "ON" : "OFF");vTaskDelay(1000 / portTICK_PERIOD_MS); //1000ms}
}void app_main(void)
{configure_led();esp_log_level_set(TAG, ESP_LOG_VERBOSE);xTaskCreate(&LED_task, "LED_task", 2048, NULL, 5, NULL); // 创建任务while (1){vTaskDelay(5000 / portTICK_PERIOD_MS); //5000ms}
}

3、创建线程的读取GPIO输入电平

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "led_strip.h"
#include "sdkconfig.h"//----------------------LED_task begin--------------------------------------------
static const char *TAG = "LED";#define LED1_GPIO 12
#define LED2_GPIO 13static unsigned char s_led_state = 0;static void blink_led(void)
{gpio_set_level(LED1_GPIO, s_led_state); //设置某个GPIO的 输出电平gpio_set_level(LED2_GPIO, s_led_state);
}static void configure_led(void)
{gpio_reset_pin(LED1_GPIO);  //恢复 GPIO 默认值gpio_set_direction(LED1_GPIO, GPIO_MODE_OUTPUT); //设置GPIO方向(输入 或者 输出)gpio_reset_pin(LED2_GPIO);gpio_set_direction(LED2_GPIO, GPIO_MODE_OUTPUT);
}static void LED_task(void *pvParameters)
{while (1){s_led_state = !s_led_state;blink_led();ESP_LOGI(TAG, "LED_task the LED %s!", s_led_state == true ? "ON" : "OFF");vTaskDelay(1000 / portTICK_PERIOD_MS); //1000ms}
}
//----------------------LED_task END--------------------------------------------//----------------------Btn_task begin--------------------------------------------
#define Btn1_GPIO 0/*配置GPIO内部上下拉电阻
gpio_set_pull_mode(GPIO_PULLUP_ONLY) //仅上拉
gpio_set_pull_mode(GPIO_PULLDOWN_ONLY) //仅下拉
gpio_set_pull_mode(GPIO_PULLUP_PULLDOWN) // 全部启用
gpio_set_pull_mode(GPIO_FLOATING) // 悬空这个 GPIO配置GPIO使能上下拉电阻
gpio_pullup_en()
gpio_pullup_dis()
gpio_pulldown_en()
gpio_pulldown_dis()
*/
static void configure_Btn(void)
{gpio_set_direction(Btn1_GPIO, GPIO_MODE_INPUT);gpio_set_pull_mode(Btn1_GPIO, GPIO_PULLUP_ONLY);gpio_pullup_en(Btn1_GPIO);
}static void Btn_task(void *pvParameters)
{unsigned char mLevel = 0;configure_Btn();mLevel = gpio_get_level(Btn1_GPIO);while (1){if (mLevel != gpio_get_level(Btn1_GPIO)){mLevel = gpio_get_level(Btn1_GPIO);if (mLevel){ESP_LOGI("Btn_task", "---HIGH \n");}else{ESP_LOGI("Btn_task", "---LOW \n");}}vTaskDelay(20 / portTICK_PERIOD_MS); //20ms}
}
//----------------------Btn_task END--------------------------------------------void app_main(void)
{configure_led();esp_log_level_set(TAG, ESP_LOG_VERBOSE);xTaskCreate(&LED_task, "LED_task", 2048, NULL, 5, NULL); // 创建显示任务xTaskCreate(&Btn_task, "Btn_task", 2048, NULL, 5, NULL); // 创建按键任务while (1){vTaskDelay(5000 / portTICK_PERIOD_MS); //5000ms}
}运行后的打印:
I (5313) LED: LED_task the LED OFF!
I (6033) Btn_task: ---HIGH I (6313) LED: LED_task the LED ON!
I (7313) LED: LED_task the LED OFF!
I (7953) Btn_task: ---LOW 

4、使用LEDC实现简单呼吸灯:


//----------------------PWM_LED_task begin------------------------------------------#include <stdio.h>
#include "driver/ledc.h"      // 导入LEDC驱动库
#include "esp_err.h"           // 导入错误处理库// 定义LEDC定时器、模式、输出IO口、通道、占空比分辨率、初始占空比和频率
#define LEDC_TIMER              LEDC_TIMER_0
#define LEDC_MODE               LEDC_LOW_SPEED_MODE
#define LEDC_OUTPUT_IO          (12) // 定义输出的GPIO号
#define LEDC_CHANNEL            LEDC_CHANNEL_0
#define LEDC_DUTY_RES           LEDC_TIMER_13_BIT // 设置占空比分辨率为13位
#define LEDC_DUTY               (4096) // 设置50%的占空比. (2 ** 13) * 50% = 4096
#define LEDC_FREQUENCY          (4000) // 设置频率为4000赫兹。void my_ledc_pwm_init(void)
{ledc_fade_func_install(0);//安装LEDC渐变功能// 准备并应用LEDC PWM定时器配置ledc_timer_config_t ledc_timer ={.speed_mode       = LEDC_MODE,.duty_resolution  = LEDC_DUTY_RES,.timer_num        = LEDC_TIMER,.freq_hz          = LEDC_FREQUENCY,  // 设置输出频率为4000 Hz.clk_cfg          = LEDC_AUTO_CLK    // 自动选择时钟源};// 检测函数调用结果,确认无错误发生ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));// 准备并应用LEDC PWM通道配置ledc_channel_config_t ledc_channel ={.speed_mode     = LEDC_MODE,.channel        = LEDC_CHANNEL,.timer_sel      = LEDC_TIMER,.intr_type      = LEDC_INTR_DISABLE,  // 禁用中断.gpio_num       = LEDC_OUTPUT_IO,.duty           = 0,                  // 初始占空比设为0%.hpoint         = 0                   // 高电平时间点设置为0};// 检测函数调用结果,确认无错误发生ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}// 增加或减少LED亮度的函数
void ledc_fade(int start_duty, int end_duty, int step, int delay, bool fade_up)
{int duty;if (fade_up){// 渐亮for (duty = start_duty; duty <= end_duty; duty += step){ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);vTaskDelay(delay / portTICK_PERIOD_MS);}}else{// 渐暗for (duty = start_duty; duty >= end_duty; duty -= step){ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);vTaskDelay(delay / portTICK_PERIOD_MS);}}
}static void PWM_LED_task(void *pvParameters)
{//configure_led();// 设置LEDC外设配置my_ledc_pwm_init();// 设置占空比为50%ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY));// 更新占空比以应用新的值ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));printf("PWM----->ok\n");while (1){ESP_LOGI(TAG, "PWM_LED_task the LED up!");// 从0%占空比渐变到指定的亮度ledc_fade(0, LEDC_DUTY, 80, 30, true); // 慢慢亮起vTaskDelay(100 / portTICK_PERIOD_MS); // 在高亮度下停0.1秒ESP_LOGI(TAG, "PWM_LED_task the LED down!");// 从指定亮度渐变到0%占空比ledc_fade(LEDC_DUTY, 0, 80, 30, false); // 慢慢熄灭vTaskDelay(200 / portTICK_PERIOD_MS); // 在低亮度下停0.1秒}
}
//----------------------PWM_LED_task END--------------------------------------------
void app_main(void)
{configure_led();esp_log_level_set(TAG, ESP_LOG_VERBOSE);//xTaskCreate(&LED_task, "LED_task", 2048, NULL, 5, NULL); // 创建显示任务xTaskCreate(&PWM_LED_task, "PWM_LED_task", 2048, NULL, 5, NULL); // 创建显示任务xTaskCreate(&Btn_task, "Btn_task", 2048, NULL, 5, NULL); // 创建按键任务while (1){vTaskDelay(5000 / portTICK_PERIOD_MS); //5000ms}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/637944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 面试篇|(九)操作系统与网络篇 【全面总结 | 持续更新】

目录 1. 客户端与服务器交互方式有几种&#xff1f;2. OSI七层模型有哪些&#xff0c;每一层的作用3. UDP/TCP含义&#xff0c;区别4. TCP/IP协议栈各个层次及分别的功能&#xff1f;5. 写出WWW的几个方法&#xff1f;6. Socket粘包7. Socket的封包、拆包8. Socket 客户端 队列…

数学建模常见算法的通俗理解(2)

目录 6 K-Means&#xff08;K-均值&#xff09;聚类算法&#xff08;无需分割数据即可分类&#xff09; 6.1 粗浅理解 6.2 算法过程 6.2.1 选定质心 6.2.2 分配点 6.2.3 评价 7 KNN算法&#xff08;K近邻算法&#xff09;&#xff08;K个最近的决定方案&#xff09; 7.…

MyBatis中的resultMap:深度解析与实战指南

前言 在Java开发中&#xff0c;数据库操作是至关重要的部分&#xff0c;而MyBatis作为一款优秀的持久层框架&#xff0c;以其灵活和强大的映射能力深受开发者喜爱。其中&#xff0c;<resultMap> 是MyBatis中最核心的元素之一&#xff0c;它提供了自定义SQL查询结果到Jav…

GraphicsMagick 的 OpenCL 开发记录(十一)

<2022-03-26 Sat> 对ImageMagick的number_channels及PixelChannelMap结构体中的channel和offset成员的理解 这个标题有点长&#xff0c;可能文章的内容也有点长&#xff0c;但是思路越来越清晰。先来看PixelChannelMap的结构体定义&#xff1a; typedef struct _Pixel…

【每日一题】按分隔符拆分字符串

文章目录 Tag题目来源解题思路方法一&#xff1a;遍历方法二&#xff1a;getline 写在最后 Tag 【遍历】【getline】【字符串】【2024-01-20】 题目来源 2788. 按分隔符拆分字符串 解题思路 方法一&#xff1a;遍历 思路 分隔符在字符串开始和结束位置时不需要处理。 分隔…

Crow:实现点击下载功能

Crow:设置网站的index.html-CSDN博客 讲述了如何完成一个最简单的网页的路由 很多网页提供了下载功能,怎么实现呢,其实也很简单。 假设网页的目录结构如图 $ tree static static ├── img │ └── goodday.jpg └── index.html //index.html <html> <body&…

专业137总分439东南大学920专业基础综合考研经验电子信息与通信电路系统芯片

我本科是南京信息工程大学&#xff0c;今年报考东南大学信息学院&#xff0c;成功逆袭&#xff0c;专业137&#xff0c;政治69&#xff0c;英语86&#xff0c;数一147&#xff0c;总分439。以下总结了自己的复习心得和经验&#xff0c;希望对大家复习有一点帮助。啰嗦一句&…

C++ :命名空间域

目录 冲突与命名&#xff1a; 举个例子&#xff1a; 全局与局部&#xff1a; 域作用限定符&#xff1a; 命名空间域&#xff1a; 冲突与命名&#xff1a; 在C语言中&#xff0c;我们通常会使用stdlib.h 而stdlib.h 本质上是一个函数的库&#xff0c;在程序中使用的大多数…

Java学习笔记(八)——Lambda表达式

文章目录 Lambda表达式Lambda表达式的省略写法Lambda练习练习1练习2 算法题算法题1 斐波那契数列算法题2 猴子吃桃子算法题3 爬楼梯 Lambda表达式 Lambda表达式是JDK8开始的一种新语法形式。 基本作用&#xff1a;简化函数式接口的匿名内部类的写法。 注意&#xff1a; Lam…

2023年总结我所经历的技术大变革

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不仅…

STL---Stack和Queue

一、stack的介绍和使用 &#xff08;1&#xff09;介绍 翻译: &#xff08;1&#xff09;stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 &#xff08;2&#xff09; stack是作为容器…

STL-deque

双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低 deque相对而言&#xff0c;对头部的插入删除速度回比vector快 vector访问元素时的速度会比deque快,这和两者内部…

03 OSPF

参考文章 1 初步认识OSPF的大致内容(第三课)-CSDN博客 2

微服务环境搭建:docker+nacos单机

nacos需要连接mysql&#xff0c;持久化相关配置。 1. 部署好mysql后&#xff0c;新建nacos数据库然后初始化nacos脚本 -- -------------------------------------------------------- -- 主机: 192.168.150.101 -- 服务器版本: …

c#调用matlab生成的COM DLL,Matlab GUI程序封装成exe文件并在不安装Matlab的电脑上运行

最近根据需求用Matlab写了一个简单的软件&#xff0c;但需要安装到其他电脑上运行&#xff0c;倒腾了很久最终成功在其他电脑上运行&#xff0c;现将方法共享给大家。安装方法&#xff1a;①程序封装 首先用Matlab写完程序并封装好&#xff08;我用的是Matlab2018b&#xff0c;…

【Linux系统编程】环境变量详解

文章目录 1. 环境变量的基本概念2. 如何理解呢&#xff1f;&#xff08;测试PATH&#xff09;2.1 切入点1查看具体的环境变量原因剖析常见环境变量 2.2 切入点2给PATH环境变量添加新路径将我们自己的命令拷贝到PATH已有路径里面 2.3 切入点3 3. 显示所有环境变量4. 测试HOME5. …

Django ORM 中的单表查询 API(1)

在 Django 中&#xff0c;对象关系映射&#xff08;ORM&#xff09;提供了一种功能强大、表现力丰富的数据库交互方式。ORM 允许开发人员使用高级 Python 代码执行数据库查询&#xff0c;从而更轻松地处理数据库实体。 下面&#xff0c;我们将探讨 Django ORM 中单表查询 API …

JNPF低代码开发平台总体架构介绍

目录 一、JNPF介绍 二、团队能力 三、技术选型 1.后端技术栈 2.前端技术栈 3.数据库支持 四、JNPF界面示意图 五、开发环境 一、JNPF介绍 JNPF是一款企业级低代码开发平台。基于Springboot、Vue技术&#xff0c;采用微服务、前后端分离架构&#xff0c;基于可视化数据建…

【论文解读】用于代码处理的语言模型综述

目录 1.简要介绍 2.代码处理的语言模型的评估 3.通用语言模型 4.用于代码处理的特定语言模型 5.语言模型的代码特性 6.软件开发中的LLM 7.结论与挑战 ​​​​​​​1.简要介绍 在这项工作中&#xff0c;论文系统地回顾了在代码处理方面的最新进展&#xff0c;包括50个模…

Ubuntu下安装Gazebo仿真器

Ubuntu下安装Gazebo仿真器 Gazebo仿真平台通常需要配合ROS使用&#xff0c;因此需要先安装ROS。可以参考ROS安装教程 首先安装一些必要的工具 sudo apt-get update sudo apt-get install lsb-release wget gnupg修改源 sudo wget https://packages.osrfoundation.org/gazebo…