程序是这样的
#include <OneWire.h>
#include <DallasTemperature.h>
#define temperature_COMMAND 0x10 //气温测量命令字
#define Ultrasonic_COMMAND 0x11 //超声波测量命令字
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
byte comdata[3]={0};
const int Echo_Pin=3; // echo接3端口
const int Trig_Pin=2; // trig接2端口
float Ultrasonic_time; //超声波往返时间
void receive_data(void); //接受串口数据
void test_do_data(void); //测试串口数据是否正确,并执行命令
void setup()
{
Serial.begin(9600);
sensor.begin(); //启动单线,初始化传感器
pinMode(Echo_Pin,INPUT); //检测引脚上输入的脉冲宽度,设定echo为输入模式
pinMode(Trig_Pin,OUTPUT);//设定trig为输出模式
}
void loop()
{
while (Serial.available() > 0) //不断检测串口是否有数据
{
recive_data(); //接受串口数据
test_do_data(); //测试数据是否正确并执行命令
}
}
void receive_data(void)
{
int i ;
for(i=0;i<3;i++)
{
comdata[i] =Serial.read(); //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失
delay(2);
}
}
void test_do_data(void)
{
if(comdata[0] == 0x55) //0x55命令帧头,判断命令是否有效
{
if(commdata[1] == 0xAA)
{
switch (comdata[2])
{
case temperature_COMMAND: //测量气温
sensors.requestTemperatures();
Serial.print(sensors.getTempCByIndex(0)); //发送温度值
break;
case Ultrasonic_COMMAND:
digitalWrite(Trig_Pin,LOW);
delayMicroseconds(2);
digitalWrite(Trig_Pin,HIGH);
delayMicroseconds(10);
digitalWrite(Trig_Pin,LOW); //发一个10ms的高脉冲去触发TrigPin
Ultrasonic_time = pulseIn(Echo_Pin,HIGH);
Serial.print(Ultrasonic_time); //发送超声波
break ;
}
}
}
}
#include <OneWire.h>
#include <DallasTemperature.h>
#define temperature_COMMAND 0x10 //气温测量命令字
#define Ultrasonic_COMMAND 0x11 //超声波测量命令字
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
byte comdata[3]={0};
const int Echo_Pin=3; // echo接3端口
const int Trig_Pin=2; // trig接2端口
float Ultrasonic_time; //超声波往返时间
void receive_data(void); //接受串口数据
void test_do_data(void); //测试串口数据是否正确,并执行命令
void setup()
{
Serial.begin(9600);
sensor.begin(); //启动单线,初始化传感器
pinMode(Echo_Pin,INPUT); //检测引脚上输入的脉冲宽度,设定echo为输入模式
pinMode(Trig_Pin,OUTPUT);//设定trig为输出模式
}
void loop()
{
while (Serial.available() > 0) //不断检测串口是否有数据
{
recive_data(); //接受串口数据
test_do_data(); //测试数据是否正确并执行命令
}
}
void receive_data(void)
{
int i ;
for(i=0;i<3;i++)
{
comdata[i] =Serial.read(); //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失
delay(2);
}
}
void test_do_data(void)
{
if(comdata[0] == 0x55) //0x55命令帧头,判断命令是否有效
{
if(commdata[1] == 0xAA)
{
switch (comdata[2])
{
case temperature_COMMAND: //测量气温
sensors.requestTemperatures();
Serial.print(sensors.getTempCByIndex(0)); //发送温度值
break;
case Ultrasonic_COMMAND:
digitalWrite(Trig_Pin,LOW);
delayMicroseconds(2);
digitalWrite(Trig_Pin,HIGH);
delayMicroseconds(10);
digitalWrite(Trig_Pin,LOW); //发一个10ms的高脉冲去触发TrigPin
Ultrasonic_time = pulseIn(Echo_Pin,HIGH);
Serial.print(Ultrasonic_time); //发送超声波
break ;
}
}
}
}