#include <SCoop.h> //多线程库文件
#include <OneWire.h>
#include <DallasTemperature.h> // 数字温度传感器函数库
#include "U8glib.h" // OLed函数库
#include <SoftwareSerial.h> // SIM800C函数库
#define ONE_WIRE_BUS A1 // Arduino温度接收引脚
#define number 15865369579 // 这里改成你的号码
OneWire oneWire(ONE_WIRE_BUS); // 数字温度传感器初始化
DallasTemperature sensors(&oneWire);
defineTask(TemTask); //定义温度线程
/*SPI协议*/ // OLED初始化
U8GLIB_SSD1306_128X64 u8g(13, 12, 11, 10); // SW SPI Com: SCK = 13, MOSI = 12, CS = 10, DC = 9
SoftwareSerial SIM800C(5, 6); // SIM800C初始化 5(RX), 6(TX)
boolean bState, bOldState;
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(19200); // Arduino串口
SIM800C.begin(19200); // SIM800C串口
sensors.begin(); // 数字温度传感器启动
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Welcome......");
SIM800C.println("AT");
mySCoop.start(); //多线程启动
}
void TemTask::setup()
{
//Oled初始化
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255, 255, 255);
}
}
void TemTask::loop()
{
u8g.firstPage();
do {
draw();
} while ( u8g.nextPage() );
}
float getTem() {
sensors.requestTemperatures(); // 发送命令获取温度
Serial.print("Temperature for the device 1 (index 0) is: ");
float tem = sensors.getTempCByIndex(0);
Serial.println(tem);
return tem;
}
//发送短信
void sendMeg(float tem)
{
SIM800C.println("AT");
delay(2000);
SIM800C.println("AT+CMGF=1");
delay(2000);
SIM800C.println("AT+CMGS=\"15865369579\"");
delay(2000);
SIM800C.print("Temperature: ");//这里写内容
SIM800C.print(tem);//这里写内容
SIM800C.print("'C");//这里写内容
delay(2000);
//发送:0x1A,即“CTRL+Z”的键值,用于告诉 SIM800C,要执行发送操作
//发送: 0x1B,即“ESC”的键值,用于告诉 SIM800C,取消本次操作,不执行发送。
SIM800C.write(0x1A);
}
//检测SIM800C串口发出来的信息
int flag() {
if (SIM800C.available()) {
int res = SIM800C.read();
Serial.println(res);
return res;
} else {
return -1;
}
}
//状态位
int pos = 0;
//温度
float tem = 0.0;
//OLed显示内容
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 15, 21, "Temperature:");
u8g.setFont(u8g_font_gdr14);
u8g.setPrintPos(30, 50);
u8g.print(getTem());
u8g.print(" 'C");
}
void loop() {
yield();
//序列是82(R)、73(I)、78(N)、71(G)时代表来电
if (pos == 0 && flag() == 82) {
++pos;
} else if (pos == 1 && flag() == 73) {
++pos;
} else if (pos == 2 && flag() == 78) {
++pos;
} else if (pos == 3 && flag() == 71) {
Serial.println("RING........");
//挂断电话
SIM800C.println("ATH");
delay(2000);
//获取温度
tem = getTem();
delay(1000);
//发送短信
sendMeg(tem);
pos = 0;
} else {
//状态位重置
pos = 0;
}
if (Serial.available()) {
SIM800C.write(Serial.read());
digitalWrite(13, !digitalRead(13));
}
}
Arduino之大棚温度传感器设计
最新推荐文章于 2023-11-14 10:58:40 发布