ESP8266&点灯科技&arduino

esp8266实现温度传感器、利用超声波传感器测距与舵机控制

ESP8266驱动DS18B20

  1. ESP8266与DS18B20的硬件连接

esp8266 舵机 电位器 点灯科技esp8266控制舵机_科技

  1. DS18B20引脚排列

esp8266 舵机 电位器 点灯科技esp8266控制舵机_单片机_02

3.读取一次DS18B20温度数据

发送复位信号–>检测回应信号—>发送 0xCC–>发送 0x44->发送复位信号—>检测回应信号—>写 0xcc—>写 0xbe—>循环 8 次读取温度低字节—>循环 8 次读取温度高字节---->打印温度信息

4.硬件说明
DS18B20 GND和VDD分别与esp8266GND和3v3连接,DQ与引脚D4连接

舵机的控制

1.硬件说明

esp8266 舵机 电位器 点灯科技esp8266控制舵机_科技_03

连接方式如下:

橙线连接数字引脚D7

棕线连接到GND引脚

红线连接到3V3引脚

2.代码实现

利用超声波传感器测距

1.基本说明

超声波传感器可以通过使用超声波来测量距离。传感器头发射超声波并接收从目标反射回来的波。超声波传感器通过测量发射和接收之间的时间来测量到目标的距离。当然,简单来说,超声波传感器是通过使用声波来测量物体的距离的装置。它通过发出特定频率的声波来测量距离,并等待该声波反弹。通过记录在产生的声波和声波反弹之间所花费的时间,可以计算传感器和物体之间的距离。

接下来我们开始来搭建硬件。

1.原理说明

esp8266 舵机 电位器 点灯科技esp8266控制舵机_引脚_04

esp8266 舵机 电位器 点灯科技esp8266控制舵机_esp8266 舵机 电位器_05

超声波模块到底是怎么运行的呢?

在使用之前我们必须弄清楚这个传感器的运行方法,因为传感器本身只是把它的“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

esp8266 舵机 电位器 点灯科技esp8266控制舵机_esp8266 舵机 电位器_06

esp8266 舵机 电位器 点灯科技esp8266控制舵机_单片机_07

开始编程

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