当前位置: 首页 > 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…...

OpenClaw学术利器:Phi-3-vision-128k自动批改作业与生成错题集

OpenClaw学术利器&#xff1a;Phi-3-vision-128k自动批改作业与生成错题集 1. 为什么需要自动化作业批改系统 作为一名经常需要批改大量作业的教育工作者&#xff0c;我深知手工批改的痛点。每次面对堆积如山的作业本&#xff0c;不仅耗时费力&#xff0c;还难以系统性地记录…...

2026简历模板服务商推荐排行 最新口碑榜 AI智能/高性价比

一、摘要据易观分析2026年行业报告显示&#xff0c;国内简历模板服务市场规模同比增长38%&#xff0c;但市场集中度较低&#xff0c;近40%的服务商存在模板更新滞后、服务响应不及时等问题&#xff1b;80%的求职者表示&#xff0c;优质简历模板能提升50%以上的面试邀约率&#…...

运维工具汇总

一、远程工具列表 1. MobaXterm site: MobaXterm隧道使用_mobaxterm怎么读-CSDN博客 二、httpclient 1. small:https://zhuanlan.zhihu.com/p/701243358 2.small2: 客户端下载 | Reqable API抓包调试 API测试一站式工具 small2: https://reqable.com/zh-CN/download/ …...

慕尼黑工业大学突破:让AI医生像真正的放射科医生一样诊断病情

在传统的医学诊断中&#xff0c;放射科医生需要像侦探一样工作——他们不是简单地看一张X光片或CT图像就下结论&#xff0c;而是要仔细翻阅整套医学影像资料&#xff0c;在不同的切片之间寻找线索&#xff0c;调整显示设置来看得更清楚&#xff0c;有时还需要使用专业工具进行测…...

discuz所有下载版本和升级工具,2.0版本

此文章仅作参考&#xff0c;已无效&#xff0c;移步到3.0版本 下载版本&#xff1a; &#xff01;&#xff01;&#xff01;升级UCenter和升级工具使用&#xff08;都在里面&#xff09;Discuz! X3.2 - X3.4 升级至 Discuz! X3.5 详细教程 - 程序发布 - Powered by Discuz! …...

AI人脸隐私卫士企业应用:会议合影自动脱敏合规方案

AI人脸隐私卫士企业应用&#xff1a;会议合影自动脱敏合规方案 关键词&#xff1a;企业隐私合规、会议合影脱敏、人脸自动打码、MediaPipe、本地离线处理、数据安全、GDPR、个人信息保护 摘要&#xff1a;在企业日常运营中&#xff0c;会议、团建、培训等活动产生的合影照片&…...

Magisk+EdXposed+抹机王 组合安装避坑指南:从环境配置到权限优化

1. 环境准备&#xff1a;搭建稳定的测试平台 第一次接触MagiskEdXposed抹机王组合的朋友&#xff0c;最容易在环境配置环节翻车。我见过太多人因为基础环境没搭好&#xff0c;导致后续步骤全盘崩溃的情况。这里分享一个经过20设备验证的稳定方案&#xff1a;Win10系统雷电模拟…...

Windows下TensorFlow CPU加速终极方案:AVX2指令集优化版安装指南

Windows平台TensorFlow CPU性能飞跃&#xff1a;AVX2指令集优化实战手册 当你在PyCharm中运行TensorFlow代码时&#xff0c;是否见过这样的警告&#xff1a;"Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2"&#xff1f…...

AnyLogic-Pypeline:打破仿真与AI壁垒的智能集成方案

AnyLogic-Pypeline&#xff1a;打破仿真与AI壁垒的智能集成方案 【免费下载链接】AnyLogic-Pypeline A custom AnyLogic library for running Python inside an AnyLogic model (Java) 项目地址: https://gitcode.com/gh_mirrors/an/AnyLogic-Pypeline 还在为AnyLogic与…...

R语言中的loess函数:从原理到实战时序数据分析

1. 理解loess回归&#xff1a;从数学原理到生活场景 第一次接触loess函数时&#xff0c;我盯着金融数据里那些弯弯曲曲的折线图发愁——传统的线性回归画出来的直线根本抓不住股价的波动规律。这就像用直尺画蒙娜丽莎的微笑&#xff0c;技术没错&#xff0c;但完全不对味。loes…...