SMS 温度回复
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
你好。这个项目是一个更大的项目的一部分。因为我在这部分遇到了很多问题并最终找到了解决方案,所以我决定与社区分享,希望对他们的项目有所帮助。
项目描述
发送短信给Arduino,获取家里的温度。
软件
对于 SIM800L 模块,我使用了“Seeeduino_GPRS-master”库。我不得不更改“sim800.h”库中的以下几行以使其能够在 MEGA 上运行:
#define SIM800_TX_PIN 8#define SIM800_RX_PIN 7
...到 TX_PIN 10 和 RX_PIN 11。将库从“SoftwareSerial”更改为 Mega Serial 端口之一,即 Serial3,太困难了,所以我选择了简单的方法。
问题
基本上,我的代码是从两个库中剪切和粘贴示例:“DHT.h”和“Seeeduino_GPRS-master”。我遇到的问题是“gprs.h”示例只显示了如何用引号发送预定的消息。我不知道如何从我的温度传感器发送可变浮点值。我尝试过的其他库也是如此:“GPRS_SIM900-master”和“SIM800L-master”。
我花了数周时间在 WEB 上搜索示例来解决我的问题,但一无所获。我找到了关于同一主题的论坛帖子,对于那些没有得到答案的可怜的迷失灵魂,我希望你能找到这个帖子。
答案
将浮点值转换为字符串,然后将字符串转换为字符数组 - 简单!
代码片段
MyString =String(temp,0); //将float转换为StringMyString =(MyString + "Degrees C");//从这里开始将字符串转换为char//长度(空终止符多出一个字符)int str_len =MyString.length() + 1; // 准备字符数组(缓冲区) char char_array[str_len];// 将其复制到 MyString.toCharArray(char_array, str_len);// 将字符串转换为 char 结束 heregprs.sendSMS("04+++++++ +",char_array); //定义电话号码和文本。
接线
我使用 ULTRAFIRE 18650 电池为 sim 模块供电。稍后我将在电路中添加一个稳压器。请参阅本教程。
参考资料
- http://www.ayomaonline.com/programming/quickstart-sim800-sim800l-with-arduino/
- https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf
图书馆
- https://github.com/Seeed-Studio/Seeeduino_GPRS
- https://github.com/adafruit/DHT-sensor-library
代码
- DHT_SIMPosting.ino
DHT_SIMPosting.inoArduino
发送短信“InTemp”请求温度和 Arduino 回复的摄氏度。// 各种 DHT 湿度/温度传感器的示例测试草图// 由ladyada 撰写,公共领域#include“DHT.h”#define DHTPIN 2 // 我们连接的数字引脚#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321//#define DHTTYPE DHT21 // DHT 21 (AM2301)// 将传感器的引脚 1(左侧)连接到+5V // 将传感器的引脚 2 连接到任何 DHTPIN // 将传感器的引脚 4(右侧)连接到接地 // 将一个 10K 电阻从引脚 2(数据)连接到引脚 1(电源) sensor//初始化DHT sensor.DHT dht(DHTPIN, DHTTYPE);#include#include #define TIMEOUT 5000GPRS gprs;bool ITemp =false;float temp;String MyString;#define LED_PIN 13bool ledStatus;//用于保存SIM800char currentLine[500] ="";int currentLineIndex =0;//如果找到消息通知并且下一行串行输出是布尔值则设置为true的变量实际短信 contentbool nextLineIsMessage =false;void Reply()// 函数从这里开始{ Serial.println("GPRS - Send SMS Test ..."); gprs.preInit();延迟(1000);而(0 !=gprs.init()){延迟(1000); Serial.print("初始化错误\r\n"); } Serial.println("初始化成功,开始发送短信..."); if (ITemp ==true){ float t =dht.readTemperature();温度=t; ITemp =假; } MyString =String(temp,0); //将浮点数转换为字符串 MyString =(MyString + "Degrees C"); // 从这里开始将字符串转换为字符 // 长度(空终止符多了一个字符) int str_len =MyString.length() + 1; // 准备字符数组(缓冲区) char char_array[str_len]; // 将它复制到 MyString.toCharArray(char_array, str_len); // 将字符串转换为字符在这里结束 gprs.sendSMS("04++++++++",char_array); //定义电话号码和文本 // 函数到此结束}void setup() { Serial.begin(9600); Serial.println("DHTxx 测试!"); dht.begin(); gprs.preInit();延迟(1000);而(0 !=gprs.init()){延迟(1000); Serial.print("初始化错误\r\n"); //稍后在Nextion HMI主页上显示SIM ERROR } //设置短信模式为ASCII if(0 !=gprs.sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", TIMEOUT)) { ERROR( "错误:CNMI");返回; } //开始监听新短信提示 if(0 !=gprs.sendCmdAndWaitForResp("AT+CNMI=1,2,0,0,0\r\n", "OK", TIMEOUT)) { ERROR("错误:CNMI");返回; } Serial.println("Init success");}void loop() { // 在两次测量之间等待几秒钟。延迟(2000); // 读取温度或湿度大约需要 250 毫秒! // 传感器读数也可能长达 2 秒“旧”(它是一个非常慢的传感器) float h =dht.readHumidity(); // 读取摄氏温度(默认) float t =dht.readTemperature(); Serial.print("湿度:"); Serial.print(h); Serial.println(" %\t"); Serial.print("温度:"); Serial.print(t); Serial.println(" *C "); SIM();}void SIM(){ //将当前状态写入 LED 引脚 digitalWrite(LED_PIN, ledStatus); Serial.println("寻找短信"); //如果SIM800有串口输出 if(gprs.serialSIM800.available()){ char lastCharRead =gprs.serialSIM800.read(); //从串行输出中读取每个字符,直到到达 \r 或 \n(表示行尾) if(lastCharRead =='\r' || lastCharRead =='\n'){ String lastLine =String(currentLine); //如果最后一行读到+CMT,则收到新的SMS消息指示。 //因此,下一行是消息内容。 if(lastLine.startsWith("+CMT:")){ Serial.println(lastLine); nextLineIsMessage =true; } else if (lastLine.length()> 0) { if(nextLineIsMessage) { Serial.println(lastLine); //根据短信内容读取消息内容并设置状态 if(lastLine.indexOf("InTemp")>=0){ Serial.println("InTemp"); ITemp =真;回复 (); // LED状态=1; // Serial.println("打开灯"); // } else if(lastLine.indexOf("LED OFF")>=0) { // ledStatus =0; // Serial.println("关灯"); nextLineIsMessage =false; } } //清除下一行读取的字符数组 for( int i =0; i
示意图
制造工艺