Arduino之大棚温度传感器设计

#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));
  }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值