当前位置: 首页 > news >正文

ESP 32控制无刷电机2

import machine
import time
import socket
import network
from machine import I2C, Pin, ADC

def start_ap():
    """
    启动ESP32的AP模式
    """
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    ssid = 'ESP32_APTest'
    password = '12345678'
    ap.config(essid=ssid, password=password)
    
    # 设置其他可选参数
    ap.config(authmode=3)  # WPA2-PSK加密
    ap.config(max_clients=10)  # 最大允许客户端连接数
    print('AP模式已启动')
    print('SSID:', ssid)
    print('IP地址:', ap.ifconfig()[0])


def start_udp():
    """
    初始化UDP套接字
    """
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(("0.0.0.0", 7788))  # 绑定端口7788
    udp_socket.setblocking(False)  # 设置为非阻塞模式
    print("UDP套接字已启动,端口:7788")
    return udp_socket


def read_voltage(adc, R1=10000, R2=4700, samples=100):
    """
    读取ADC平均值并计算分压后的电压值
    - 参数:
        - adc: ADC对象
        - R1: 分压电阻1 (默认10kΩ)
        - R2: 分压电阻2 (默认4.7kΩ)
        - samples: 采样数量 (默认100)
    - 返回值: 测量电压(单位: 伏)
    """
    try:
        total = 0
        for _ in range(samples):
            total += adc.read()
        adc_value = total / samples  # 平均ADC值
        divider_ratio = (R1 + R2) / R2  # 分压比
        voltage = (adc_value * 3.3 / 4095) * divider_ratio  # 转换为实际电压
        return round(voltage, 2)
    except Exception as e:
        print("读取电压时出错:", e)
        return 0.0


def main():
    """
    主程序
    """
    # 初始化ADC引脚
    adc = ADC(Pin(34))          # 使用GPIO34(ADC1通道6)
    adc.atten(ADC.ATTN_11DB)    # 设置衰减范围为11dB(量程0-3.6V)
    
    # 配置PWM参数
    pwm_pin = 14  # 根据实际硬件连接情况调整引脚编号
    pwm_freq = 500  # PWM频率设置为500Hz
    pwm = machine.PWM(machine.Pin(pwm_pin), freq=pwm_freq, duty=0)
    
    # 测试PWM输出
    pwm.duty(1023)
    time.sleep(2)
    pwm.duty(400)
    time.sleep(2)
    
    # 启动AP模式和UDP套接字
    start_ap()
    udp_socket = start_udp()
    
    print("系统已启动,等待UDP数据...")
    
    # 初始化计时器
    last_print_time = time.time()
    
    while True:
        try:
            # 尝试接收UDP数据(非阻塞)
            try:
                recv_data, sender_info = udp_socket.recvfrom(1024)  # 缓冲区大小为1024字节
                recv_data = recv_data.decode('utf-8').strip()  # 解码为字符串并去掉多余空白
                print(f"接收到数据: {recv_data} 来自 {sender_info}")
                
                # 读取电压
#                 vbat = read_voltage(adc) + 0.55  # 补偿+0.55V
#                 print(f"当前电压: {vbat} V")
                
                # 判断电压范围
#                 if vbat > 7.7:
                if recv_data.startswith('D') or recv_data.startswith('C'):
                        pwm.duty(0)  # 关闭PWM输出
                        print("指令接收,PWM关闭")
                else:
                        # 提取数值并设置PWM
                        if len(recv_data) >= 5:
                            raw_value_str = recv_data[1:5]  # 截取数值部分
                            try:
                                raw_value = int(raw_value_str)
                                value = raw_value // 2
                                if 500 <= value <= 1000:
                                    pwm.duty(value)
                                    print(f"设置PWM占空比为: {value}")
                                else:
                                    print("接收到的数值转换后不在500到1000的范围内")
                            except ValueError:
                                print("无法解析接收到的数值部分")
                        else:
                            print("接收到的数据长度不足")
#                 else:
#                     pwm.duty(0)  # 低电压时关闭PWM
#                     print("电压过低,PWM关闭")
            except OSError:
                # 如果没有数据到达,继续执行
                pass
        
        except Exception as e:
            print("主循环中发生错误:", e)
        
        # 每秒打印一次电压值
        current_time = time.time()
        if current_time - last_print_time >= 1:
            vbat = read_voltage(adc) + 0.55  # 补偿+0.55V
            print(f"abc当前电压: {vbat} V")
            if vbat < 7.0:
                pwm.duty(0)  # 低电压时关闭PWM
            last_print_time = current_time
        
        time.sleep(0.1)  # 避免循环过快


if __name__ == "__main__":
    main()

相关文章:

ESP 32控制无刷电机2

import machine import time import socket import network from machine import I2C, Pin, ADC def start_ap(): """ 启动ESP32的AP模式 """ ap network.WLAN(network.AP_IF) ap.active(True) ssid ESP32_APTest …...

揭开人工智能中 Tokens 的神秘面纱

揭开人工智能中 Tokens 的神秘面纱 在人工智能&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;"tokens" 是一个频繁出现且至关重要的概念。对于理解语言模型如何处理和理解人类语言&#xff0c;tokens 起着基础性的作用。那么&#xff…...

萌新学 Python 之 random 函数

random 模块&#xff1a;主要用来生成随机数 先导入包&#xff1a;import random randint(a, b)&#xff0c;生成 [a, b] 之间的整数&#xff0c;包含边界 a 和 b&#xff0c;a 和 b 为整数 random()&#xff0c;生成的是 [0,1) 之间的浮点数&#xff0c;包含 0 不包含 1 r…...

2-2linux系统IO

文章目录 linux系统文件io1 open /close1.1 open1.2 close1.3 示例1.3.1 打开已经存在的文件 2 read/write2.1 read2.2 write使用 遗留问题&#xff1a;新创建的文件权限很奇怪3 lseek3.1 文件指针的移动3.2 文件拓展 perror函数 linux系统文件io 系统函数是系统专有的函数&am…...

周边游平台设计与实现(代码+数据库+LW)

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对旅游信息管理的提升&#xff0c…...

视频批量分段工具

参考原文&#xff1a;视频批量分段工具 选择视频文件 当您启动这款视频批量分段工具程序后&#xff0c;有两种便捷的方式来选择要处理的视频文件。其一&#xff0c;您可以点击程序界面中的 “文件” 菜单&#xff0c;在下拉选项里找到 “选择视频文件” 按钮并点击&#xff1b…...

Android -- 使用Sharepreference保存List储存失败,原因是包含Bitmap,drawable等类型数据

1.报错信息如下&#xff1a; class android.content.res.ColorStateList declares multiple JSON fields named mChangingConfigurations 2.Bean类属性如下&#xff1a; data class AppInfoBean( val appName: String?, val appIcon: Drawable, val appPackage: String?,…...

java项目之基于ssm的图书馆书库管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的图书馆书库管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 该系统可以实现图书信息管理…...

编写一个程序,输入一个数字并输出其阶乘(Python版)

编写一个程序&#xff0c;输入一个数字并输出其阶乘 要计算一个数字的阶乘&#xff0c;可以编写一个简单的 Python 程序&#xff0c;使用循环或者递归来实现: 1. 使用 for 循环计算阶乘 # 输入一个数字 num int(input("请输入一个数字: "))# 初始化阶乘结果 facto…...

dify基础之prompts

摘要&#xff1a;在大型语言模型&#xff08;LLM&#xff09;应用中&#xff0c;Prompt&#xff08;提示词&#xff09;是连接用户意图与模型输出的核心工具。本文从概念、组成、设计原则到实践案例&#xff0c;系统讲解如何通过Prompt解锁LLM的潜能&#xff0c;提升生成内容的…...

实践教程:使用DeepSeek实现PDF转Word的高效方案

&#x1f388;Deepseek推荐工具 PDF文件因其跨平台、格式稳定的特性被广泛使用&#xff0c;但在内容编辑场景中&#xff0c;用户常需将PDF转换为可编辑的Word文档。传统的付费工具&#xff08;如Adobe Acrobat&#xff09;或在线转换平台存在成本高、隐私风险等问题。本文将使…...

网络安全审计员

在当今数字化时代&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;成为各行各业不容忽视的重要议题。特别是对于企业、政府机构等组织而言&#xff0c;网络安全不仅关乎数据资产的安全&#xff0c;更与组织的声誉、客户信任乃至法律法规的遵从…...

算法-二叉树篇13-路径总和

路径总和 力扣题目链接 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…...

如何设计一个短链系统?

短链系统设计的关键要点: 系统功能实现 短链生成:接收长链接,先检查是否已有对应短链,存在则直接返回。否则,使用分布式 ID 生成器(如号段模式、SnowFlake 算法、数据库自增 ID、Redis 自增等)生成唯一 ID,或通过哈希算法(如 MurmurHash)处理长链接得到哈希值。再将生…...

医疗行业电脑终端如何防病毒——火绒企业版杀毒软件

医疗物联网技术广泛应用&#xff0c;使得医院网络空间中增加了诸多新型终端设备。这些设备类型多样、型号各异&#xff0c;风险暴露面积大。火绒安全对医疗机构终端安全出现的问题、不足、需求等&#xff0c;提出整体解决方案。 医疗行业终端安全防护痛点 系统老旧 医院、区…...

云平台DeepSeek满血版:引领AI推理革新,开启智慧新时代

引言&#xff1a;人工智能的未来——云平台的卓越突破 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正深刻地改变着我们生活与工作方式的方方面面。作为AI领域的创新者与领航者&#xff0c;云平台始终走在技术前沿&#xff0c;凭借无穷的热情…...

Java进阶——数据类型深入解析

Java数据类型深入解析 本文主要介绍 Java 数据类型的相关知识&#xff0c;包括8 种基本类型、默认值、字面量表示、自动装箱与拆箱、类型转换规则&#xff08;隐式转换、强制转换&#xff09;、浮点型精度问题、字符与字符串、引用类型比较与常量池、数值溢出与处理、类型推断等…...

R语言+AI提示词:贝叶斯广义线性混合效应模型GLMM生物学Meta分析

全文链接&#xff1a;https://tecdat.cn/?p40797 本文旨在帮助0基础或只有简单编程基础的研究学者&#xff0c;通过 AI 的提示词工程&#xff0c;使用 R 语言完成元分析&#xff0c;包括数据处理、模型构建、评估以及结果解读等步骤&#xff08;点击文末“阅读原文”获取完整代…...

深度解析 ANSI X9.31 TR-31:金融行业密钥管理核心标准20250228

深度解析 ANSI X9.31 TR-31&#xff1a;金融行业密钥管理核心标准 在当今数字化金融时代&#xff0c;信息安全至关重要&#xff0c;而密钥管理则是保障金融数据安全的核心环节。ANSI X9.31 TR-31作为金融行业密钥管理的关键标准&#xff0c;为对称密钥的全生命周期管理提供了坚…...

视频字幕识别和翻译

下载的视频很多不是汉语的&#xff0c;我们需要用剪映将语音识别出来作为字幕压制到视频中去。 剪映6.0以后语音识别需要收费&#xff0c;但是低版本还是没有问题。 如果想要非汉语字幕转成中文&#xff0c;剪映低版本不提供这样功能。但是&#xff0c;用剪映导出识别字幕&am…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...