亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

SMS 温度回复

组件和用品

Arduino Mega 2560
× 1
DHT22 温度传感器
× 1
SIM800L
× 1
电阻 10k ohm
× 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  

示意图


制造工艺

  1. 温控风扇
  2. Raspberry Pi 温度记录器
  3. 使用 DS18B20 读取温度 |树莓派 2
  4. Raspberry Pi 上的温度监控
  5. 使用 RASPBERRY PI 测量温度
  6. 使用 Raspberry Pi 监测温度
  7. IoT 101 项目:来自 Raspberry Pi 的流温度
  8. 实验室“气象站”
  9. Raspberry Pi 温度传感器
  10. Rover
  11. AuGe12