1. 项目概述几年前我在一个需要远程监控仓库温湿度的项目里遇到了一个头疼的问题仓库位置偏僻没有稳定的Wi-Fi网络但环境数据又必须及时掌握以防货物受潮或设备过热。当时尝试了各种方案最终发现最可靠、最直接的通信方式往往是最“古老”的那一个——短信。基于这个需求我搭建了一套使用SIM900 GSM模块和Arduino的温湿度短信监控系统。这套系统的核心思路非常清晰用传感器采集数据用微控制器处理最后通过覆盖最广的移动网络把信息直接送到你的手机上。它不依赖任何复杂的网络配置只要有手机信号的地方就能工作特别适合那些网络基础设施不完善但对可靠性要求又极高的场景比如农业大棚、偏远地区的设备机房、或者临时性的施工现场环境监测。今天要分享的就是这套系统的完整实现过程。我们将使用Arduino UNO作为大脑DHT11温湿度传感器作为感知器官SIM900 GSM扩展板作为通信嘴巴再借助Visuino这款图形化编程工具让整个开发过程变得直观高效。你不需要是嵌入式开发专家只要跟着步骤走就能亲手做出一个能每分钟或者你设定的任意间隔向你汇报环境状况的“电子哨兵”。无论是想监控家里的花房、公司的服务器机房还是作为一个物联网入门练手项目它都再合适不过了。2. 系统核心设计与硬件选型解析2.1 为什么选择“GSM短信”作为通信方案在物联网项目里数据传输方式的选择直接决定了系统的适用场景和可靠性。常见的方案有Wi-Fi、蓝牙、LoRa、NB-IoT等。我最终选择传统的GSM短信主要基于以下几点考量首先是极致的可靠性与普适性。GSM网络经过数十年的发展覆盖范围远超其他网络。在那些Wi-Fi信号无法到达、甚至4G/5G信号都微弱的偏远角落GSM的2G网络往往依然坚挺。短信服务作为GSM网络的基础功能其送达率非常高几乎不受数据网络拥堵的影响。对于温湿度报警这种关键信息你需要的是“一定能收到”而不是“大概率很快收到”。其次是极低的系统复杂度和功耗。相比于需要连接路由器、配置MQTT服务器、处理网络重连的Wi-Fi方案GSM短信方案在软件逻辑上简单得多。模块上电、注册网络、发送短信流程直接。在功耗方面虽然GSM模块在发送瞬间电流较大可达2A但在待机状态下功耗很低。我们可以通过编程让系统绝大部分时间处于深度休眠仅在需要采集和发送数据的瞬间唤醒非常适合由电池或太阳能供电的长期监测点。最后是对用户端的零要求。接收端只需要一部能收短信的普通手机无需安装任何特定APP无需保持网络在线。这对于向不擅长智能设备的用户例如农场主、仓库管理员发送警报信息来说是巨大的优势。信息直接出现在手机的通知栏无法被忽略。2.2 核心硬件组件深度剖析一套稳定工作的系统离不开对每个硬件“成员”的深入了解。我们来逐一拆解1. Arduino UNO (微控制器)这是系统的大脑。我选择UNO是因为其生态极其成熟引脚布局标准兼容 shield扩展板的设计让与SIM900的连接变得非常傻瓜化。它基于ATmega328P芯片有14个数字I/O口和6个模拟输入口处理DHT11的数据和通过串口控制SIM900绰绰有余。对于这个项目它的性能完全足够且价格低廉易于获取。2. SIM900 GSM Shield (通信模块)这是项目的核心也是最容易出问题的部分。SIM900是一个经典的2G GSM/GPRS模块。选择它一方面是因为其资料丰富社区支持好另一方面它被做成了Arduino Shield的形式可以直接插在UNO上省去了复杂的接线工作。你需要特别注意它的供电GSM模块在搜索网络和发送信号时峰值电流可能超过1A普通的USB口或9V电池根本无法满足。这就是为什么必须使用独立5V、2A以上的电源适配器为其供电并将板载的电源开关拨到“External”档位。忽视这一点会导致模块反复重启、无法注册网络等问题。3. DHT11 (温湿度传感器)这是一个数字式传感器通过单总线协议与Arduino通信。它的优点是价格极低、接线简单仅需三根线VCC, GND, DATA。但其精度一般温度±2°C湿度±5%响应速度也较慢约2秒一次。对于环境监控的预警用途这个精度是完全可以接受的。它的DATA引脚需要连接一个4.7K-10K的上拉电阻到VCC不过很多模块已经内置了这个电阻购买时留意即可。4. SIM卡这是一把“钥匙”。你需要准备一张已激活的普通手机SIM卡。至关重要的一步是务必在插入模块前用手机先拨打客服电话或通过手机设置关闭这张SIM卡的PIN码锁。否则模块启动后会不断提示输入PIN码导致初始化失败。此外确保这张卡有短信功能并且账户内有余额或套餐包含短信。2.3 工具链选择为什么是Visuino传统Arduino开发使用基于文本的IDE和C语言编写代码。这对于初学者来说理解串口通信、状态机、字符串处理等概念有一定门槛。Visuino则采用了完全可视化的编程方式通过拖放组件和连接引脚来构建逻辑。它的优势在于直观和快速原型开发。你不需要记忆“ATCMGF1”这样的GSM指令只需要知道“需要设置文本模式”这个逻辑然后通过配置一个“Text Value”组件来完成。时序控制可以通过“Sequence”和“Period”组件像搭积木一样实现。这对于专注于功能实现而非语法细节的 maker、教育者或跨领域工程师来说效率提升是巨大的。当然它生成的底层代码仍然是标准的Arduino C代码你可以导出并在此基础上进行更深入的文本编码修改。3. 硬件连接与电路搭建实操3.1 分步接线指南与原理说明正确的硬件连接是成功的一半。请严格按照以下顺序和说明操作并理解每一步的目的第一步核心主板对接将SIM900 GSM Shield小心地对准引脚直接插在Arduino UNO板上。确保所有引脚都插入对应的插孔没有弯曲或错位。这个操作完成了两个板子之间电源5V, GND和大部分数字引脚D0-D13的电气连接。第二步启用软件串口关键跳线SIM900模块通过串口UART与Arduino通信。Arduino UNO的硬件串口D0-RX, D1-TX通常用于和电脑通信以输出调试信息。为了避免冲突我们需要使用Arduino的另外两个数字引脚通过“软件模拟”的方式创建一个新的串口来与SIM900通信。 在SIM900 Shield上找到标有“D8”和“D7”的排针位置。使用两个跳线帽分别将“D8”连接到“RX”将“D7”连接到“TX”。这个操作的意义是告诉Shield我们将使用Arduino的数字引脚8D8作为软件串口的接收端RX引脚7D7作为发送端TX并通过Shield板上的电路将其连接到SIM900模块的对应引脚。第三步连接DHT11传感器VCC电源正极用杜邦线将DHT11的VCC引脚连接到Arduino的5V输出引脚。这为传感器提供了工作电压。GND电源地用杜邦线将DHT11的GND引脚连接到Arduino的任意一个GND引脚。确保所有器件共地这是电路正常工作的基础。DATA/S数据信号用杜邦线将DHT11的数据引脚连接到Arduino的数字引脚2。在Visuino中我们将指定D2来读取这个传感器的数据。如果模块已内置上拉电阻则接线完成如果没有需要在数据线和5V之间外接一个4.7K-10K的电阻。第四步连接天线与配置电源将GSM天线通常随Shield附送拧到SIM900 Shield上的SMA天线接口上。天线必须连接否则信号极弱无法注册网络。找到Shield上的电源选择开关通常标有“PWR_SEL”将其从默认的“Arduino”档位拨到“External”档位。这表示我们将为GSM模块使用外部独立电源而不是从Arduino取电。将5V/2A的外接电源适配器的直流插头插入Shield上专用的电源接口注意正负极。注意供电是重中之重切勿在未接外部电源或开关未拨到“External”的情况下试图让GSM模块搜索网络或发送短信。Arduino板自身的稳压器无法提供如此大的电流会导致整个系统电压被拉低Arduino自动复位形成不断重启的死循环。3.2 上电启动与网络状态诊断完成所有连接后可以按顺序上电首先通过USB线将Arduino UNO连接到电脑仅为其供电和编程不为GSM供电。然后接通SIM900 Shield的外部5V电源适配器。找到Shield上的电源按钮通常是一个黑色小按钮长按约2秒钟直到板载的红色电源指示灯PWR常亮。这相当于手动开启了手机。接下来观察状态指示灯网络状态灯NET开始会快速闪烁表示模块正在搜索网络。等待约30秒到1分钟如果SIM卡正常且信号良好这个灯的闪烁会变慢变为每3秒闪烁一次。这个“3秒一闪”的节奏是SIM900模块已成功注册到GSM网络的标志如果它一直快速闪烁或不亮请检查天线是否接好、SIM卡是否插紧且已关闭PIN码、当地是否有2G网络信号。4. Visuino可视化编程详解4.1 Visuino界面与项目初始化打开Visuino软件你会看到一个左侧是组件工具箱中间是设计画布右侧是属性面板的界面。首先我们需要告诉Visuino我们使用的硬件。在画布上默认已经有一个“Arduino”组件。点击它右侧属性面板会展开。在属性面板中找到“Arduino”属性组点击旁边的“...”按钮或直接双击Arduino组件。在弹出的对话框中选择“Arduino UNO”作为板卡类型然后点击确认。这一步确保了后续代码编译和上传的正确性。4.2 核心组件添加与功能解读我们需要从左侧工具箱中将以下组件拖拽到设计画布上。每个组件都扮演着特定的角色SoftwareSerial这是我们创建的“软件串口”组件用于让Arduino通过D7、D8引脚与SIM900模块“对话”。DHT11温湿度传感器组件负责从D2引脚读取数据。Text Value这是一个可以存储和操作字符串文本的容器。我们将用它来构建要发送给GSM模块的AT指令和短信内容。Sequence序列发生器是本次项目的“指挥家”。它可以按顺序、按时间触发一系列事件用来控制“先发指令A等待再发指令B”的流程。Char Value字符值组件这里我们用它来存储一个特殊的控制字符“CtrlZ”ASCII码26这是告诉GSM模块“短信内容已结束可以发送了”的指令。Text Multi-Source Merger文本合并器。它可以将多个文本源如AT指令和短信正文按顺序拼接成一个完整的字符串流然后一次性通过串口发送出去。Formatted Text格式化文本组件。它的作用是将DHT11读取到的数值浮点数格式化成我们想要的文本样式例如“TEMP: 25.5 HUM: 60.2”。4.3 组件参数配置构建AT指令集AT指令是控制GSM模块的“语言”。我们需要在TextValue1组件里设置三条核心指令。双击TextValue1组件会打开其元素编辑器。从左侧工具箱拖动一个Set Value元素到编辑区。在右侧属性面板中找到“Value”属性输入ATCMGF1。这条指令将GSM模块的工作模式设置为“文本模式”Text Mode这是发送普通短信的前提。再次拖动一个Set Value元素。在其“Value”属性中输入ATCMGS8613800138000。请务必将引号内的号码替换成你自己的国际格式手机号中国号码为86开头。这条指令告诉模块接下来要发送短信的目标号码。拖动第三个Set Value元素。这次我们不直接输入固定值。点击其“Value”属性旁边的“引脚”图标从弹出菜单中选择“String SinkPin”。这意味着这个元素的值将由外部输入动态决定这里我们将把格式化后的温湿度文本输入进来作为短信正文。关闭TextValue1的编辑窗口。接下来配置格式化文本和结束符双击FormattedText1组件拖动两个Analog Element到编辑区。分别选中它们在属性面板中将“Precision”精度都设置为1这表示数值将保留一位小数。关闭编辑窗口回到主画布选中FormattedText1组件在属性面板中找到“Text”属性输入TEMP: %0 HUM: %1。这里的%0和%1是占位符将分别被第一个和第二个Analog Element即温度和湿度值替换。选中CharValue1组件在属性面板中设置“Value”为26。这是“CtrlZ”字符的十进制ASCII码是短信正文结束的标志。4.4 时序逻辑配置让一切按部就班我们需要让系统按“初始化 - 设置号码 - 发送数据 - 结束发送”的顺序并且每个步骤之间有足够的延迟等待模块响应。选中Sequence1组件在属性面板中将“Repeat”属性设置为True。这会让整个发送序列循环执行实现定时发送。双击Sequence1组件打开其编辑器。我们需要四个时间节点来控制节奏。从左侧连续拖动四个Period周期元素到编辑区。它们将按顺序成为Period1到Period4。分别设置它们的“Delay”延迟属性Period1-5000(5000毫秒即5秒)上电或一轮结束后等待5秒再开始给系统一个稳定时间。Period2-15000(15秒)发送ATCMGF1指令后等待15秒确保模块已切换到文本模式。GSM模块响应有时较慢这个等待很重要。Period3-20000(20秒)发送目标电话号码指令ATCMGS...后等待20秒。模块收到此指令后会回复一个“”提示符等待我们输入正文需要留足时间。Period4-25000(25秒)在发送完短信正文和结束符后等待25秒让模块有足够时间处理并发送短信然后再开始下一轮循环。4.5 组件连线构建数据流与逻辑流连线是Visuino编程的灵魂它定义了数据如何流动、事件如何触发。请按照以下逻辑顺序连接1. 启动与传感器数据流将画布左上角Arduino组件上的Start1引脚的[Out]连接到Sequence1组件的[Start]引脚。这表示Arduino一启动就触发发送序列开始运行。将DHT11组件的[Sensor]引脚连接到Arduino组件的Digital Pin 2。这指定了传感器连接在D2口。将DHT11组件的[Temperature]引脚连接到FormattedText1组件内第一个AnalogElement1的[In]引脚。将DHT11组件的[Humidity]引脚连接到FormattedText1组件内第二个AnalogElement2的[In]引脚。将FormattedText1组件的[Out]引脚连接到TextValue1组件内第三个Set Value3的[Value]引脚。这样格式化好的文本就成为了短信正文。2. 序列控制流指挥家发号施令将Sequence1组件内Period1的[Out]引脚连接到TextValue1组件内第一个Set Value1的[Clock]引脚。意思是等待5秒后触发“设置文本模式”指令。将Period2的[Out]引脚连接到Set Value2的[Clock]引脚。等待15秒后触发“设置电话号码”指令。将Period3的[Out]引脚连接到Set Value3的[Clock]引脚。等待20秒后触发“设置短信正文”指令。将Period4的[Out]引脚连接到CharValue1组件的[Clock]引脚。等待25秒后触发“发送结束符”指令。3. 指令合并与发送流将TextValue1组件的[Out]引脚连接到TextMultiMerger1组件的[0]输入引脚。所有设置好的AT指令和短信正文会从这里流出。将CharValue1组件的[Out]引脚连接到TextMultiMerger1组件的[1]输入引脚。结束符从这里流出。将TextMultiMerger1组件的[Out]引脚连接到SoftwareSerial1组件的[In]引脚。合并后的完整指令流AT指令正文结束符被送入软件串口。将SoftwareSerial1组件的[RX]引脚连接到Arduino的Digital Pin 7。将SoftwareSerial1组件的[TX]引脚连接到Arduino的Digital Pin 7。这完成了软件串口引脚的定义。4. 可选调试监控流如果你想在电脑的串口监视器上看到GSM模块的回复非常推荐便于调试可以将SoftwareSerial1组件的[Out]引脚连接到Arduino组件上的Serial串口的[In]引脚。这样模块返回的任何信息都会转发到电脑。5. 代码生成、上传与系统测试5.1 编译上传与潜在问题排查完成所有连线后你的Visuino设计图应该像一个精密的电路图逻辑清晰。点击Visuino界面底部的“Build”选项卡。在“Port”下拉菜单中选择你的Arduino UNO所连接的COM端口如果不知道可以在Arduino IDE中查看。点击“Compile/Build and Upload”按钮。Visuino会开始将图形化逻辑转换为Arduino C代码然后编译并上传到板子中。这个过程可能需要一两分钟。如果遇到错误请关注输出窗口的提示编译错误通常是组件连接有逻辑错误或未定义。检查是否有引脚未连接或连接到了错误类型的引脚上。上传错误检查COM端口选择是否正确USB线是否连接稳固Arduino板卡类型是否选为“Arduino UNO”。5.2 系统运行测试与效果验证上传成功后系统会自动开始运行。观察步骤如下电源与网络确保外部5V电源已接通GSM模块的PWR灯常亮NET灯进入“3秒一闪”的稳定状态。观察短信接收将你的手机放在一旁静候。从Arduino上电开始计算大约需要5秒(初始等待) 15秒(模式设置等待) 20秒(号码设置等待) 发送时间 ≈ 40-50秒后你应该能收到第一条短信。短信内容格式为“TEMP: 23.5 HUM: 55.8”。循环验证收到第一条短信后系统会等待Period4设置的25秒然后重新开始整个Sequence。因此第二条短信将在第一条收到的约25秒后到来。这验证了“Repeat”循环功能正常工作。5.3 定时间隔调整技巧项目中原定的延迟设置5, 15, 20, 25秒是为了确保GSM模块在每个步骤后有绝对充足的响应时间特别适用于信号较弱的环境。如果你想调整发送间隔例如改为每5分钟发送一次主要修改两个地方调整循环间隔Sequence1的总时长由四个Period的延迟之和决定。最直接的方法是增加Period4最后一个等待周期的延迟。例如想每分钟发送一次总周期需约60秒。目前前三个Period总延迟为5152040秒那么将Period4的延迟从25000毫秒25秒增加到20000毫秒20秒总周期就变成了60秒。计算公式期望总间隔(秒) (P1P2P3)/1000 P4/1000。优化等待时间进阶在信号好的地方GSM模块响应很快。你可以尝试适当缩短Period2和Period3的延迟比如分别改为8000毫秒和10000毫秒以加快单轮速度。但切忌过短否则模块来不及响应“”提示符就发送正文会导致短信发送失败。一个稳妥的做法是先在串口监视器中观察模块的回复节奏来精确设定时间。6. 常见问题排查与实战经验分享即使按照教程一步步操作在实际搭建中仍可能遇到各种问题。下面是我在多个项目中总结出的“排坑指南”。6.1 硬件与电源类问题问题1GSM模块指示灯不亮或快速闪烁后熄灭。排查这是最典型的供电不足症状。立即检查① 外部5V/2A电源适配器是否已连接并通电② Shield上的电源选择开关是否已拨到“External”③ USB线是否只连接了电脑给Arduino供电如果是请确保外部电源已单独为Shield供电。经验准备一个质量好的5V/2A以上电源劣质电源标称2A但可能峰值输出不足。问题2NET灯无法稳定在“3秒一闪”一直快闪或常亮。排查天线确保GSM天线已牢固拧紧。SIM卡确认SIM卡已正确插入卡槽金属触点朝下并已在手机上关闭了PIN码锁。信号将设备移到窗边或信号更好的位置。有些地区2G网络已退网需确认当地仍有2G覆盖。模块兼容性检查SIM卡是否支持2G网络目前大多数手机卡都支持。6.2 通信与软件类问题问题3收不到短信但模块NET灯正常。排查手机号码格式检查Visuino中ATCMGS指令后的号码是否为国际格式中国为86开头。去掉号码前的0例如8613800138000。串口监听务必启用“可选”的调试连线在电脑上打开串口监视器波特率通常为9600或115200在SoftwareSerial1组件的属性中设置。观察是否有“OK”、“”等模块回复。如果没有回复说明AT指令未正确发送或模块未就绪。时序过快如果模块回复了“”但马上又出现错误可能是Period3延迟太短模块还没准备好接收正文就收到了数据。尝试将Period3的延迟增加到30000毫秒30秒再试。结束符确认CharValue1的值是26CtrlZ。问题4短信内容乱码或格式不对。排查检查FormattedText1的“Text”属性设置是否正确是否为TEMP: %0 HUM: %1。确保DHT11组件的温度和湿度输出引脚正确连接到了FormattedText1内的两个Analog Element。问题5Visuino编译或上传失败。排查确保已正确选择“Arduino UNO”板卡。确保所有必要的组件都已添加并正确连线没有“悬空”的必需引脚。尝试关闭Visuino重新打开项目有时可以解决临时性错误。6.3 系统优化与扩展思路这个基础项目稳定后你可以考虑以下优化和扩展让它更实用降低功耗目前系统持续运行耗电大。可以引入“休眠”机制。在Arduino代码中在Sequence循环结束后让Arduino进入深度睡眠Deep Sleep仅通过定时器或外部中断如用DHT11的报警功能需换用DHT22唤醒采集发送一次数据后再继续睡眠。这样可用电池供电数月。增加报警阈值Visuino可以通过添加“Compare”比较组件来实现。例如添加一个“Compare Range”组件将DHT11的温度引脚与之连接设置上限为30下限为10。当温度超出范围时比较组件的输出引脚会触发你可以将这个触发信号连接到一个新的Sequence或直接修改短信内容为报警信息。使用更稳定的传感器DHT11性价比高但DHT22或SHT30在精度和响应速度上更优接线方式类似只需在Visuino中更换对应的传感器组件即可。数据记录与云端备份虽然本项目是短信上报但你可以在发送短信的同时通过SIM900的GPRS功能需额外配置将数据同步上传到简单的HTTP服务器或物联网平台实现数据持久化存储。这个项目的魅力在于它用最直观的方式打通了从物理感知到移动通信的完整链条。当你第一次收到由自己亲手搭建的系统发来的环境数据短信时那种跨越空间的连接感和创造实现的成就感正是嵌入式开发和物联网的魅力所在。希望这份详细的指南能帮你顺利搭建起自己的监控节点解决实际问题。
基于Arduino与SIM900的GSM短信温湿度监控系统实战指南
发布时间:2026/5/30 12:21:52
1. 项目概述几年前我在一个需要远程监控仓库温湿度的项目里遇到了一个头疼的问题仓库位置偏僻没有稳定的Wi-Fi网络但环境数据又必须及时掌握以防货物受潮或设备过热。当时尝试了各种方案最终发现最可靠、最直接的通信方式往往是最“古老”的那一个——短信。基于这个需求我搭建了一套使用SIM900 GSM模块和Arduino的温湿度短信监控系统。这套系统的核心思路非常清晰用传感器采集数据用微控制器处理最后通过覆盖最广的移动网络把信息直接送到你的手机上。它不依赖任何复杂的网络配置只要有手机信号的地方就能工作特别适合那些网络基础设施不完善但对可靠性要求又极高的场景比如农业大棚、偏远地区的设备机房、或者临时性的施工现场环境监测。今天要分享的就是这套系统的完整实现过程。我们将使用Arduino UNO作为大脑DHT11温湿度传感器作为感知器官SIM900 GSM扩展板作为通信嘴巴再借助Visuino这款图形化编程工具让整个开发过程变得直观高效。你不需要是嵌入式开发专家只要跟着步骤走就能亲手做出一个能每分钟或者你设定的任意间隔向你汇报环境状况的“电子哨兵”。无论是想监控家里的花房、公司的服务器机房还是作为一个物联网入门练手项目它都再合适不过了。2. 系统核心设计与硬件选型解析2.1 为什么选择“GSM短信”作为通信方案在物联网项目里数据传输方式的选择直接决定了系统的适用场景和可靠性。常见的方案有Wi-Fi、蓝牙、LoRa、NB-IoT等。我最终选择传统的GSM短信主要基于以下几点考量首先是极致的可靠性与普适性。GSM网络经过数十年的发展覆盖范围远超其他网络。在那些Wi-Fi信号无法到达、甚至4G/5G信号都微弱的偏远角落GSM的2G网络往往依然坚挺。短信服务作为GSM网络的基础功能其送达率非常高几乎不受数据网络拥堵的影响。对于温湿度报警这种关键信息你需要的是“一定能收到”而不是“大概率很快收到”。其次是极低的系统复杂度和功耗。相比于需要连接路由器、配置MQTT服务器、处理网络重连的Wi-Fi方案GSM短信方案在软件逻辑上简单得多。模块上电、注册网络、发送短信流程直接。在功耗方面虽然GSM模块在发送瞬间电流较大可达2A但在待机状态下功耗很低。我们可以通过编程让系统绝大部分时间处于深度休眠仅在需要采集和发送数据的瞬间唤醒非常适合由电池或太阳能供电的长期监测点。最后是对用户端的零要求。接收端只需要一部能收短信的普通手机无需安装任何特定APP无需保持网络在线。这对于向不擅长智能设备的用户例如农场主、仓库管理员发送警报信息来说是巨大的优势。信息直接出现在手机的通知栏无法被忽略。2.2 核心硬件组件深度剖析一套稳定工作的系统离不开对每个硬件“成员”的深入了解。我们来逐一拆解1. Arduino UNO (微控制器)这是系统的大脑。我选择UNO是因为其生态极其成熟引脚布局标准兼容 shield扩展板的设计让与SIM900的连接变得非常傻瓜化。它基于ATmega328P芯片有14个数字I/O口和6个模拟输入口处理DHT11的数据和通过串口控制SIM900绰绰有余。对于这个项目它的性能完全足够且价格低廉易于获取。2. SIM900 GSM Shield (通信模块)这是项目的核心也是最容易出问题的部分。SIM900是一个经典的2G GSM/GPRS模块。选择它一方面是因为其资料丰富社区支持好另一方面它被做成了Arduino Shield的形式可以直接插在UNO上省去了复杂的接线工作。你需要特别注意它的供电GSM模块在搜索网络和发送信号时峰值电流可能超过1A普通的USB口或9V电池根本无法满足。这就是为什么必须使用独立5V、2A以上的电源适配器为其供电并将板载的电源开关拨到“External”档位。忽视这一点会导致模块反复重启、无法注册网络等问题。3. DHT11 (温湿度传感器)这是一个数字式传感器通过单总线协议与Arduino通信。它的优点是价格极低、接线简单仅需三根线VCC, GND, DATA。但其精度一般温度±2°C湿度±5%响应速度也较慢约2秒一次。对于环境监控的预警用途这个精度是完全可以接受的。它的DATA引脚需要连接一个4.7K-10K的上拉电阻到VCC不过很多模块已经内置了这个电阻购买时留意即可。4. SIM卡这是一把“钥匙”。你需要准备一张已激活的普通手机SIM卡。至关重要的一步是务必在插入模块前用手机先拨打客服电话或通过手机设置关闭这张SIM卡的PIN码锁。否则模块启动后会不断提示输入PIN码导致初始化失败。此外确保这张卡有短信功能并且账户内有余额或套餐包含短信。2.3 工具链选择为什么是Visuino传统Arduino开发使用基于文本的IDE和C语言编写代码。这对于初学者来说理解串口通信、状态机、字符串处理等概念有一定门槛。Visuino则采用了完全可视化的编程方式通过拖放组件和连接引脚来构建逻辑。它的优势在于直观和快速原型开发。你不需要记忆“ATCMGF1”这样的GSM指令只需要知道“需要设置文本模式”这个逻辑然后通过配置一个“Text Value”组件来完成。时序控制可以通过“Sequence”和“Period”组件像搭积木一样实现。这对于专注于功能实现而非语法细节的 maker、教育者或跨领域工程师来说效率提升是巨大的。当然它生成的底层代码仍然是标准的Arduino C代码你可以导出并在此基础上进行更深入的文本编码修改。3. 硬件连接与电路搭建实操3.1 分步接线指南与原理说明正确的硬件连接是成功的一半。请严格按照以下顺序和说明操作并理解每一步的目的第一步核心主板对接将SIM900 GSM Shield小心地对准引脚直接插在Arduino UNO板上。确保所有引脚都插入对应的插孔没有弯曲或错位。这个操作完成了两个板子之间电源5V, GND和大部分数字引脚D0-D13的电气连接。第二步启用软件串口关键跳线SIM900模块通过串口UART与Arduino通信。Arduino UNO的硬件串口D0-RX, D1-TX通常用于和电脑通信以输出调试信息。为了避免冲突我们需要使用Arduino的另外两个数字引脚通过“软件模拟”的方式创建一个新的串口来与SIM900通信。 在SIM900 Shield上找到标有“D8”和“D7”的排针位置。使用两个跳线帽分别将“D8”连接到“RX”将“D7”连接到“TX”。这个操作的意义是告诉Shield我们将使用Arduino的数字引脚8D8作为软件串口的接收端RX引脚7D7作为发送端TX并通过Shield板上的电路将其连接到SIM900模块的对应引脚。第三步连接DHT11传感器VCC电源正极用杜邦线将DHT11的VCC引脚连接到Arduino的5V输出引脚。这为传感器提供了工作电压。GND电源地用杜邦线将DHT11的GND引脚连接到Arduino的任意一个GND引脚。确保所有器件共地这是电路正常工作的基础。DATA/S数据信号用杜邦线将DHT11的数据引脚连接到Arduino的数字引脚2。在Visuino中我们将指定D2来读取这个传感器的数据。如果模块已内置上拉电阻则接线完成如果没有需要在数据线和5V之间外接一个4.7K-10K的电阻。第四步连接天线与配置电源将GSM天线通常随Shield附送拧到SIM900 Shield上的SMA天线接口上。天线必须连接否则信号极弱无法注册网络。找到Shield上的电源选择开关通常标有“PWR_SEL”将其从默认的“Arduino”档位拨到“External”档位。这表示我们将为GSM模块使用外部独立电源而不是从Arduino取电。将5V/2A的外接电源适配器的直流插头插入Shield上专用的电源接口注意正负极。注意供电是重中之重切勿在未接外部电源或开关未拨到“External”的情况下试图让GSM模块搜索网络或发送短信。Arduino板自身的稳压器无法提供如此大的电流会导致整个系统电压被拉低Arduino自动复位形成不断重启的死循环。3.2 上电启动与网络状态诊断完成所有连接后可以按顺序上电首先通过USB线将Arduino UNO连接到电脑仅为其供电和编程不为GSM供电。然后接通SIM900 Shield的外部5V电源适配器。找到Shield上的电源按钮通常是一个黑色小按钮长按约2秒钟直到板载的红色电源指示灯PWR常亮。这相当于手动开启了手机。接下来观察状态指示灯网络状态灯NET开始会快速闪烁表示模块正在搜索网络。等待约30秒到1分钟如果SIM卡正常且信号良好这个灯的闪烁会变慢变为每3秒闪烁一次。这个“3秒一闪”的节奏是SIM900模块已成功注册到GSM网络的标志如果它一直快速闪烁或不亮请检查天线是否接好、SIM卡是否插紧且已关闭PIN码、当地是否有2G网络信号。4. Visuino可视化编程详解4.1 Visuino界面与项目初始化打开Visuino软件你会看到一个左侧是组件工具箱中间是设计画布右侧是属性面板的界面。首先我们需要告诉Visuino我们使用的硬件。在画布上默认已经有一个“Arduino”组件。点击它右侧属性面板会展开。在属性面板中找到“Arduino”属性组点击旁边的“...”按钮或直接双击Arduino组件。在弹出的对话框中选择“Arduino UNO”作为板卡类型然后点击确认。这一步确保了后续代码编译和上传的正确性。4.2 核心组件添加与功能解读我们需要从左侧工具箱中将以下组件拖拽到设计画布上。每个组件都扮演着特定的角色SoftwareSerial这是我们创建的“软件串口”组件用于让Arduino通过D7、D8引脚与SIM900模块“对话”。DHT11温湿度传感器组件负责从D2引脚读取数据。Text Value这是一个可以存储和操作字符串文本的容器。我们将用它来构建要发送给GSM模块的AT指令和短信内容。Sequence序列发生器是本次项目的“指挥家”。它可以按顺序、按时间触发一系列事件用来控制“先发指令A等待再发指令B”的流程。Char Value字符值组件这里我们用它来存储一个特殊的控制字符“CtrlZ”ASCII码26这是告诉GSM模块“短信内容已结束可以发送了”的指令。Text Multi-Source Merger文本合并器。它可以将多个文本源如AT指令和短信正文按顺序拼接成一个完整的字符串流然后一次性通过串口发送出去。Formatted Text格式化文本组件。它的作用是将DHT11读取到的数值浮点数格式化成我们想要的文本样式例如“TEMP: 25.5 HUM: 60.2”。4.3 组件参数配置构建AT指令集AT指令是控制GSM模块的“语言”。我们需要在TextValue1组件里设置三条核心指令。双击TextValue1组件会打开其元素编辑器。从左侧工具箱拖动一个Set Value元素到编辑区。在右侧属性面板中找到“Value”属性输入ATCMGF1。这条指令将GSM模块的工作模式设置为“文本模式”Text Mode这是发送普通短信的前提。再次拖动一个Set Value元素。在其“Value”属性中输入ATCMGS8613800138000。请务必将引号内的号码替换成你自己的国际格式手机号中国号码为86开头。这条指令告诉模块接下来要发送短信的目标号码。拖动第三个Set Value元素。这次我们不直接输入固定值。点击其“Value”属性旁边的“引脚”图标从弹出菜单中选择“String SinkPin”。这意味着这个元素的值将由外部输入动态决定这里我们将把格式化后的温湿度文本输入进来作为短信正文。关闭TextValue1的编辑窗口。接下来配置格式化文本和结束符双击FormattedText1组件拖动两个Analog Element到编辑区。分别选中它们在属性面板中将“Precision”精度都设置为1这表示数值将保留一位小数。关闭编辑窗口回到主画布选中FormattedText1组件在属性面板中找到“Text”属性输入TEMP: %0 HUM: %1。这里的%0和%1是占位符将分别被第一个和第二个Analog Element即温度和湿度值替换。选中CharValue1组件在属性面板中设置“Value”为26。这是“CtrlZ”字符的十进制ASCII码是短信正文结束的标志。4.4 时序逻辑配置让一切按部就班我们需要让系统按“初始化 - 设置号码 - 发送数据 - 结束发送”的顺序并且每个步骤之间有足够的延迟等待模块响应。选中Sequence1组件在属性面板中将“Repeat”属性设置为True。这会让整个发送序列循环执行实现定时发送。双击Sequence1组件打开其编辑器。我们需要四个时间节点来控制节奏。从左侧连续拖动四个Period周期元素到编辑区。它们将按顺序成为Period1到Period4。分别设置它们的“Delay”延迟属性Period1-5000(5000毫秒即5秒)上电或一轮结束后等待5秒再开始给系统一个稳定时间。Period2-15000(15秒)发送ATCMGF1指令后等待15秒确保模块已切换到文本模式。GSM模块响应有时较慢这个等待很重要。Period3-20000(20秒)发送目标电话号码指令ATCMGS...后等待20秒。模块收到此指令后会回复一个“”提示符等待我们输入正文需要留足时间。Period4-25000(25秒)在发送完短信正文和结束符后等待25秒让模块有足够时间处理并发送短信然后再开始下一轮循环。4.5 组件连线构建数据流与逻辑流连线是Visuino编程的灵魂它定义了数据如何流动、事件如何触发。请按照以下逻辑顺序连接1. 启动与传感器数据流将画布左上角Arduino组件上的Start1引脚的[Out]连接到Sequence1组件的[Start]引脚。这表示Arduino一启动就触发发送序列开始运行。将DHT11组件的[Sensor]引脚连接到Arduino组件的Digital Pin 2。这指定了传感器连接在D2口。将DHT11组件的[Temperature]引脚连接到FormattedText1组件内第一个AnalogElement1的[In]引脚。将DHT11组件的[Humidity]引脚连接到FormattedText1组件内第二个AnalogElement2的[In]引脚。将FormattedText1组件的[Out]引脚连接到TextValue1组件内第三个Set Value3的[Value]引脚。这样格式化好的文本就成为了短信正文。2. 序列控制流指挥家发号施令将Sequence1组件内Period1的[Out]引脚连接到TextValue1组件内第一个Set Value1的[Clock]引脚。意思是等待5秒后触发“设置文本模式”指令。将Period2的[Out]引脚连接到Set Value2的[Clock]引脚。等待15秒后触发“设置电话号码”指令。将Period3的[Out]引脚连接到Set Value3的[Clock]引脚。等待20秒后触发“设置短信正文”指令。将Period4的[Out]引脚连接到CharValue1组件的[Clock]引脚。等待25秒后触发“发送结束符”指令。3. 指令合并与发送流将TextValue1组件的[Out]引脚连接到TextMultiMerger1组件的[0]输入引脚。所有设置好的AT指令和短信正文会从这里流出。将CharValue1组件的[Out]引脚连接到TextMultiMerger1组件的[1]输入引脚。结束符从这里流出。将TextMultiMerger1组件的[Out]引脚连接到SoftwareSerial1组件的[In]引脚。合并后的完整指令流AT指令正文结束符被送入软件串口。将SoftwareSerial1组件的[RX]引脚连接到Arduino的Digital Pin 7。将SoftwareSerial1组件的[TX]引脚连接到Arduino的Digital Pin 7。这完成了软件串口引脚的定义。4. 可选调试监控流如果你想在电脑的串口监视器上看到GSM模块的回复非常推荐便于调试可以将SoftwareSerial1组件的[Out]引脚连接到Arduino组件上的Serial串口的[In]引脚。这样模块返回的任何信息都会转发到电脑。5. 代码生成、上传与系统测试5.1 编译上传与潜在问题排查完成所有连线后你的Visuino设计图应该像一个精密的电路图逻辑清晰。点击Visuino界面底部的“Build”选项卡。在“Port”下拉菜单中选择你的Arduino UNO所连接的COM端口如果不知道可以在Arduino IDE中查看。点击“Compile/Build and Upload”按钮。Visuino会开始将图形化逻辑转换为Arduino C代码然后编译并上传到板子中。这个过程可能需要一两分钟。如果遇到错误请关注输出窗口的提示编译错误通常是组件连接有逻辑错误或未定义。检查是否有引脚未连接或连接到了错误类型的引脚上。上传错误检查COM端口选择是否正确USB线是否连接稳固Arduino板卡类型是否选为“Arduino UNO”。5.2 系统运行测试与效果验证上传成功后系统会自动开始运行。观察步骤如下电源与网络确保外部5V电源已接通GSM模块的PWR灯常亮NET灯进入“3秒一闪”的稳定状态。观察短信接收将你的手机放在一旁静候。从Arduino上电开始计算大约需要5秒(初始等待) 15秒(模式设置等待) 20秒(号码设置等待) 发送时间 ≈ 40-50秒后你应该能收到第一条短信。短信内容格式为“TEMP: 23.5 HUM: 55.8”。循环验证收到第一条短信后系统会等待Period4设置的25秒然后重新开始整个Sequence。因此第二条短信将在第一条收到的约25秒后到来。这验证了“Repeat”循环功能正常工作。5.3 定时间隔调整技巧项目中原定的延迟设置5, 15, 20, 25秒是为了确保GSM模块在每个步骤后有绝对充足的响应时间特别适用于信号较弱的环境。如果你想调整发送间隔例如改为每5分钟发送一次主要修改两个地方调整循环间隔Sequence1的总时长由四个Period的延迟之和决定。最直接的方法是增加Period4最后一个等待周期的延迟。例如想每分钟发送一次总周期需约60秒。目前前三个Period总延迟为5152040秒那么将Period4的延迟从25000毫秒25秒增加到20000毫秒20秒总周期就变成了60秒。计算公式期望总间隔(秒) (P1P2P3)/1000 P4/1000。优化等待时间进阶在信号好的地方GSM模块响应很快。你可以尝试适当缩短Period2和Period3的延迟比如分别改为8000毫秒和10000毫秒以加快单轮速度。但切忌过短否则模块来不及响应“”提示符就发送正文会导致短信发送失败。一个稳妥的做法是先在串口监视器中观察模块的回复节奏来精确设定时间。6. 常见问题排查与实战经验分享即使按照教程一步步操作在实际搭建中仍可能遇到各种问题。下面是我在多个项目中总结出的“排坑指南”。6.1 硬件与电源类问题问题1GSM模块指示灯不亮或快速闪烁后熄灭。排查这是最典型的供电不足症状。立即检查① 外部5V/2A电源适配器是否已连接并通电② Shield上的电源选择开关是否已拨到“External”③ USB线是否只连接了电脑给Arduino供电如果是请确保外部电源已单独为Shield供电。经验准备一个质量好的5V/2A以上电源劣质电源标称2A但可能峰值输出不足。问题2NET灯无法稳定在“3秒一闪”一直快闪或常亮。排查天线确保GSM天线已牢固拧紧。SIM卡确认SIM卡已正确插入卡槽金属触点朝下并已在手机上关闭了PIN码锁。信号将设备移到窗边或信号更好的位置。有些地区2G网络已退网需确认当地仍有2G覆盖。模块兼容性检查SIM卡是否支持2G网络目前大多数手机卡都支持。6.2 通信与软件类问题问题3收不到短信但模块NET灯正常。排查手机号码格式检查Visuino中ATCMGS指令后的号码是否为国际格式中国为86开头。去掉号码前的0例如8613800138000。串口监听务必启用“可选”的调试连线在电脑上打开串口监视器波特率通常为9600或115200在SoftwareSerial1组件的属性中设置。观察是否有“OK”、“”等模块回复。如果没有回复说明AT指令未正确发送或模块未就绪。时序过快如果模块回复了“”但马上又出现错误可能是Period3延迟太短模块还没准备好接收正文就收到了数据。尝试将Period3的延迟增加到30000毫秒30秒再试。结束符确认CharValue1的值是26CtrlZ。问题4短信内容乱码或格式不对。排查检查FormattedText1的“Text”属性设置是否正确是否为TEMP: %0 HUM: %1。确保DHT11组件的温度和湿度输出引脚正确连接到了FormattedText1内的两个Analog Element。问题5Visuino编译或上传失败。排查确保已正确选择“Arduino UNO”板卡。确保所有必要的组件都已添加并正确连线没有“悬空”的必需引脚。尝试关闭Visuino重新打开项目有时可以解决临时性错误。6.3 系统优化与扩展思路这个基础项目稳定后你可以考虑以下优化和扩展让它更实用降低功耗目前系统持续运行耗电大。可以引入“休眠”机制。在Arduino代码中在Sequence循环结束后让Arduino进入深度睡眠Deep Sleep仅通过定时器或外部中断如用DHT11的报警功能需换用DHT22唤醒采集发送一次数据后再继续睡眠。这样可用电池供电数月。增加报警阈值Visuino可以通过添加“Compare”比较组件来实现。例如添加一个“Compare Range”组件将DHT11的温度引脚与之连接设置上限为30下限为10。当温度超出范围时比较组件的输出引脚会触发你可以将这个触发信号连接到一个新的Sequence或直接修改短信内容为报警信息。使用更稳定的传感器DHT11性价比高但DHT22或SHT30在精度和响应速度上更优接线方式类似只需在Visuino中更换对应的传感器组件即可。数据记录与云端备份虽然本项目是短信上报但你可以在发送短信的同时通过SIM900的GPRS功能需额外配置将数据同步上传到简单的HTTP服务器或物联网平台实现数据持久化存储。这个项目的魅力在于它用最直观的方式打通了从物理感知到移动通信的完整链条。当你第一次收到由自己亲手搭建的系统发来的环境数据短信时那种跨越空间的连接感和创造实现的成就感正是嵌入式开发和物联网的魅力所在。希望这份详细的指南能帮你顺利搭建起自己的监控节点解决实际问题。