ESP8266&点灯科技&arduino
esp8266实现温度传感器、利用超声波传感器测距与舵机控制
ESP8266驱动DS18B20
- ESP8266与DS18B20的硬件连接
- DS18B20引脚排列
3.读取一次DS18B20温度数据
发送复位信号–>检测回应信号—>发送 0xCC–>发送 0x44->发送复位信号—>检测回应信号—>写 0xcc—>写 0xbe—>循环 8 次读取温度低字节—>循环 8 次读取温度高字节---->打印温度信息
4.硬件说明
DS18B20 GND和VDD分别与esp8266GND和3v3连接,DQ与引脚D4连接
舵机的控制
1.硬件说明
连接方式如下:
橙线连接数字引脚D7
棕线连接到GND引脚
红线连接到3V3引脚
2.代码实现
利用超声波传感器测距
1.基本说明
超声波传感器可以通过使用超声波来测量距离。传感器头发射超声波并接收从目标反射回来的波。超声波传感器通过测量发射和接收之间的时间来测量到目标的距离。当然,简单来说,超声波传感器是通过使用声波来测量物体的距离的装置。它通过发出特定频率的声波来测量距离,并等待该声波反弹。通过记录在产生的声波和声波反弹之间所花费的时间,可以计算传感器和物体之间的距离。
接下来我们开始来搭建硬件。
1.原理说明
超声波模块到底是怎么运行的呢?
在使用之前我们必须弄清楚这个传感器的运行方法,因为传感器本身只是把它的“ECHO”引脚保持在高电平,使之持续一段时间,这对应于从发送的波形到接收反射(回波)所花费的这一段时间。
模块发出一阵声波,同时向回声引脚施加电压。
该模块从声波接收反射并从回波引脚消除电压。
在测距的时候,超声波传感器中产生脉冲将数据发送到NodeMCU或任何其它的微控制器。
起始脉冲约为10us,基于距离的PWM信号将为150 us-25us。如果没有障碍物,则NodeMCU生成38us脉冲,以确认没有检测到物体。
在读取HC-SR04测的距离之前,得先了解如何计算距离的,这有一个公式。
Distance = 1/2×T×C
其中Distance是距离,T是发射和接收之间的时间,C是声速。
(该值乘以1/2,因为T是返回距离的时间。)
2.连接HC-SR04
开始编程
//wifi模块 温度传感器
#define BLINKER_WIFI //定义wifi模块
#include <Blinker.h>
#include<OneWire.h>
#include<DallasTemperature.h>
#include <Servo.h>
char auth[]="daced4da6547";//点灯中的密钥
char ssid[]=""; //此处输入热点名称
char pswd[]=""; //此处输入热点密码
const int TrigPin = 4; //设置发射脚位,对应ESP8266 D2
const int EchoPin = 5; //设置接收脚位,对应ESP8266 D1
float cm; //浮点型数据类型(加小数点,提高精准度)
BlinkerButton Button1("btn-max"); //位置1 按钮 数据键名
BlinkerSlider Slider1("max-num"); //位置1 滑块 数据键名 范围0-180
Servo myservo;
BlinkerNumber JULI("num-juli");
BlinkerNumber TEMP("num-wendu");
float juli_read =0;
float temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
#define ONE_WIRE_BUS D4
//定义一个OneWire对象,并使用D4引脚作为单总线的引脚
//单总线的引脚的对象作为传感器的参数。
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//定义温度数据键名
int servo_max;
void button1_callback(const String & state) { //位置1 按钮
BLINKER_LOG("get button state: ", servo_max);
myservo.write(servo_max);
Blinker.vibrate();
}
void slider1_callback(int32_t value)
{
BLINKER_LOG("get slider value: ", value);
servo_max = value;
Slider1.color("#1E90FF");
Slider1.print();
myservo.write(value);//去掉即可用按钮控制
}
int counter = 0;
void heartbeat()
{
TEMP.print(temp_read); //给blinkerapp回传温度数据
JULI.print(juli_read); //给blinkerapp回传juli数据
}
void setup()
{
//初始化端口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
Blinker.begin(auth, ssid, pswd);//运行blinker
Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上
Button1.attach(button1_callback);
Slider1.attach(slider1_callback);
myservo.attach(D7);
myservo.write(10);
}
void loop(void)
{
Blinker.run();//运行Blinker
sensors.requestTemperatures();
float t=sensors.getTempCByIndex(0);
temp_read=t;
digitalWrite(TrigPin, LOW); //用低高低电平发送脉冲给Trigpin引脚
delayMicroseconds(2); //微秒级延时
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH)/ 58.0; //读取脉冲宽度,换算成厘米
float s =cm;
juli_read = s;
delay(1000);
}