1. 为什么你需要这个股票监控系统作为一个经常关注股市的投资者我深知盯盘的痛苦。以前我经常遇到这种情况上班开会时错过最佳买卖点吃饭时突然发现股票暴涨暴跌却来不及操作甚至半夜醒来还要摸手机看美股行情。这种24小时紧绷的状态实在太折磨人了。直到我发现用ESP32开发板可以轻松搭建一个自动化监控系统。这个小玩意价格不到50元却能帮你全天候盯盘价格达到设定条件时自动打电话提醒。实测下来我的操作效率提升了3倍以上再也不用担心错过关键行情。这个系统特别适合以下几类人上班族没时间实时盯盘但又不想错过行情高频交易者需要快速响应价格波动量化投资新手想尝试简单的自动化交易策略物联网爱好者想做个实用的智能硬件项目2. 系统工作原理与核心组件整个系统的运行逻辑其实很简单每隔5分钟查询一次股票价格当发现最新价格高于上次记录的价格时就自动拨打预设的电话号码。听起来是不是很像一个智能化的股票报警器核心硬件只需要三样ESP32开发板负责运行主控程序价格约30-50元SIM7600 4G模块实现拨打电话功能价格约150元电源适配器建议使用5V/2A的稳定电源软件部分主要依赖MicroPythonESP32上的轻量级Python环境Requests库用于获取股票API数据UART通信控制4G模块拨打电话这里有个生活化的类比你可以把整个系统想象成一个尽职的股票小秘书。它每隔5分钟就会查一次股价相当于秘书看报表发现涨价就立即给你打电话汇报相当于秘书打电话通知你汇报完就挂断等下次检查。3. 手把手搭建开发环境3.1 硬件连接指南首先要把ESP32和4G模块正确连接。我建议使用杜邦线按以下方式接线ESP32 GPIO16(TX) - 4G模块RX ESP32 GPIO17(RX) - 4G模块TX ESP32 GND -- 4G模块GND注意不同型号的4G模块引脚定义可能略有不同建议先查阅你的模块说明书。我第一次做的时候就因为接反了TX/RX导致模块无法通信排查了好久才发现问题。3.2 软件环境配置在ESP32上刷写MicroPython固件是第一步。我用的是Thonny IDE配置过程非常简单下载最新的MicroPython固件(.bin文件)用USB线连接ESP32在Thonny中选择工具-选项-解释器选择ESP32端口点击安装或更新MicroPython选择下载的固件文件安装完成后你可以在Thonny的Shell界面看到熟悉的Python提示符这时就可以开始写代码了。3.3 依赖库安装系统需要两个关键Python库urequestsMicroPython版的requestsjson在Thonny的工具-管理包中搜索并安装即可。如果遇到网络问题也可以手动下载.py文件上传到ESP32。4. 获取实时股票数据的正确姿势4.1 选择合适的股票API原示例中使用的是第三方API但实际开发中我更推荐使用官方数据源。比如新浪财经的免费接口# 获取贵州茅台(600519)实时数据 api_url http://hq.sinajs.cn/listsh600519这个接口返回的数据格式是这样的var hq_str_sh600519贵州茅台,1799.990,1800.000,...;我们需要用字符串处理提取第二个价格值当前价。虽然比JSON格式麻烦点但胜在稳定免费。4.2 数据处理与异常处理完善的错误处理是保证系统稳定运行的关键。这是我的经验之谈 - 第一次部署时没加异常处理结果API偶尔超时导致整个程序崩溃。改进后的代码def fetch_stock_price(): try: response requests.get(api_url, timeout10) if response.status_code 200: data response.text.split(,) return float(data[1]) # 提取当前价格 else: print(fAPI错误: {response.status_code}) return None except Exception as e: print(f获取价格失败: {e}) return None这个版本会设置10秒超时防止无限等待检查HTTP状态码捕获所有异常并返回None打印详细错误信息方便调试5. 电话提醒功能实现细节5.1 4G模块AT指令控制拨打电话主要依靠发送AT指令。SIM7600模块常用的指令有指令功能示例AT测试模块响应ATATD拨打电话ATD13800138000;ATH挂断电话ATH在代码中我封装了几个实用函数def send_at(command, timeout1): uart.write(command \r\n) start_time time.time() while time.time() - start_time timeout: if uart.any(): response uart.read().decode().strip() print(fAT响应: {response}) return response return None def make_call(number): response send_at(fATD{number};) if OK in response: print(f正在拨打 {number}) return True return False5.2 通话时长控制原代码是固定等待30秒后挂断但实际使用中我发现这样体验不好。改进方案让电话响铃6秒足够让人注意到如果接听就保持通话10秒可以说简单提示语无论是否接听都自动挂断实现代码def smart_call(number): make_call(number) ring_start time.time() while time.time() - ring_start 6: if check_call_status() ACTIVE: time.sleep(10) # 接听后保持10秒 break hang_up()6. 完整代码解析与优化6.1 主程序架构整个程序采用事件循环模式主要流程连接WiFi初始化4G模块进入主循环获取股票价格与上次价格比较满足条件则拨打电话等待5分钟优化后的主程序def main(): # 初始化 wifi_connect() init_4g_module() last_price None while True: current_price get_stock_price() if current_price and last_price: if current_price last_price: smart_call(PHONE_NUMBER) send_notification(f股票上涨: {last_price}→{current_price}) last_price current_price time.sleep(300) # 5分钟6.2 配置管理改进原代码使用config.json存储配置我建议增加配置检查和默认值DEFAULT_CONFIG { wifi: {ssid: , password: }, phone: {number: 13800138000}, stock: {code: sh600519} } def load_config(): try: with open(config.json) as f: config json.load(f) # 合并默认配置 return {**DEFAULT_CONFIG, **config} except: return DEFAULT_CONFIG7. 实际部署中的经验分享7.1 电源稳定性问题第一次部署时我用的是普通手机充电器结果发现ESP32偶尔会重启。后来换用5V/2A的工业电源就再没出现过问题。建议使用优质电源适配器在电源输入端加装1000μF电容如果可能给ESP32和4G模块分别供电7.2 网络连接优化同时使用WiFi和4G可能会遇到干扰我的解决方案将WiFi天线和4G天线尽量分开在代码中加入网络重连逻辑定期重启网络模块每天一次def check_connection(): if not wifi.isconnected(): wifi_connect() if not check_4g_signal(): reset_4g_module()7.3 日志记录与监控添加SD卡模块记录运行日志非常有用。我的日志格式[2023-08-20 10:00] 价格获取成功: 1799.99 [2023-08-20 10:05] 价格上涨: 1799.99→1805.00 [2023-08-20 10:05] 拨打13800138000遇到问题时这些日志就是最好的调试依据。8. 功能扩展思路基础功能实现后你可以考虑这些增强功能多股票监控同时监控多只股票配置不同的提醒条件多种提醒方式除了电话增加短信、邮件通知复杂条件判断支持涨跌幅百分比、成交量等条件云端同步将数据同步到服务器做长期分析OLED显示屏增加本地显示当前股价比如实现短信提醒只需要增加def send_sms(number, message): send_at(ATCMGF1) # 设置文本模式 send_at(fATCMGS{number}) uart.write(message chr(26)) # CtrlZ结束这个项目最吸引我的地方就是它的可扩展性。你可以根据自己的需求不断添加新功能把它打造成一个真正个性化的智能投资助手。