任务11 雷达与超声波感应灯(arduino程序)

本文介绍了微波雷达感应开关模块RCWL-0516和超声波模块的工作原理及应用。RCWL-0516利用微波多普勒雷达技术检测移动物体,而超声波模块通过测量回波时间计算距离。在实际应用中,结合这两种技术可以实现更精确的安全监测,例如在避障小车、水位监控和防盗报警系统中。文中还给出了测试程序和代码示例,展示如何通过Arduino进行集成和控制,以及如何通过OLED屏幕显示检测结果和LED灯状态变化。
摘要由CSDN通过智能技术生成

模块介绍:

1、微波雷达感应开关模块

RCWL-0516传感器模块是替代常见的PIR运动传感器的极佳选择,RCWL-0516传感器广泛应用于防盗报警器和安全灯。RCWL-0516传感器与PIR传感器一样,只能检测到探测范围内的物体运动,不能探测到移动物体的黑体辐射。RCWL-0516传感器是采用“微波多普勒雷达”技术来探测移动物体,因此它也被称作多普勒传感器,探测距离范围是7米左右。 当被触发时,它的TTL-level (OUT)针将在2s到3s内从低电平(0V)转换到高电平(3.5V),然后返回到IDLE(低)状态.

2、超声波模块

超声波模块是一种常用的测距工具,一般用在避障小车,水位监控系统中

工作原理就是起初先给这两个引脚都拉低,然后让TRIG引脚拉高10微秒以上再拉低产生一个脉冲起始信号(程序中我们是拉高20微秒)。起始信号一开启,ECHO引脚就会被拉高的同时,超声波开始发射,ECHO引脚检测到反射回来的信号时就会被拉低,因为声速为340m/s。那么测出的距离就是

(ECHO引脚高电平持续的时间*340m/s)/2。

接线:

测试程序:

1、雷达测试:

观察LED灯和串口的状态,无人为0

volatile int item;

void setup(){
  item = 0;
  Serial.begin(9600);
  pinMode(11, OUTPUT);
}

void loop(){
  item = analogRead(A0);
  Serial.println(item);
  if (item >= 70) {
    digitalWrite(11,HIGH);

  } else {
    digitalWrite(11,LOW);

  }

}

2、超声波测试程序

串口打印超声波的距离,单位cm


#define Trig 2 //引脚Tring 连接 IO D2
#define Echo 3 //引脚Echo 连接 IO D3 
 
float cm; //距离变量
float temp; // 
 
void setup() {
  Serial.begin(9600);
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
}
 
void loop() {
  //给Trig发送一个低高低的短时间脉冲,触发测距
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  delayMicroseconds(2);    //等待 2微妙
  digitalWrite(Trig,HIGH); //给Trig发送一个高电平
  delayMicroseconds(10);    //等待 10微妙
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  
  temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
  //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
  //返回脉冲的长度
  
  //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
  //因为发送到接收,实际是相同距离走了2回,所以要除以2
  //距离(厘米)  =  (回波时间 * (34 / 1000)) / 2
  //简化后的计算公式为 (回波时间 * 17)/ 1000
  
  cm = (temp * 17 )/1000; //把回波时间换算成cm
 
  Serial.print("Echo =");
  Serial.print(temp);//串口输出等待时间的原始数据
  Serial.print(" | | Distance = ");
  Serial.print(cm);//串口输出距离换算成cm的结果
  Serial.println("cm");
  delay(100);

最终程序:

现象:雷达和超声波检测,OLED屏幕显示是否有人,并显示人的距离,同时ws2812b亮起

/************************************
 * 项目:雷达和超声波检测+OLED+ws2812b
 * 现象:检测到人分别亮不同的颜色,并在LED显示状态
 ***********************************/

#include "U8glib.h"
#include "FastLED.h"            //程序需要使用FastLED库

#define button1 13               //触摸按键接口定义
#define NUM_LEDS 8             // LED灯珠数量
#define LED_DT 2                // Arduino输出控制信号引脚
#define DATA_PIN 9              // Arduino输出控制信号引脚
#define LED_TYPE WS2812         // LED灯带型号
#define COLOR_ORDER GRB         // RGB灯珠中红色、绿色、蓝色LED的排列顺序
const int ledPin = 13; 
const int inputPin = 8;
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
CRGB leds[NUM_LEDS];     // 建立光带leds

uint8_t max_bright = 128;       // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
uint8_t openState = 0;
uint8_t c = 0;
uint8_t cishu = 0;
uint8_t val, flag=0;

const  int TrigPin =  4;    //超声波引脚
const  int EchoPin =  5;
long duration, cm;

unsigned long previousBlinkTime;
int blinkInterval = 1000; //LED闪烁时间间隔
bool toggle;

static unsigned char deng[] U8G_PROGMEM = {0x00,0x00,0x7E,0x3E,0x40,0x22,0x40,0x12,0x42,0x12,0x24,0x0A,0x28,0x12,0x10,0x12,
0x10,0x22,0x28,0x22,0x28,0x22,0x44,0x16,0x42,0x0A,0x01,0x02,0x00,0x02,0x00,0x02,/*"邓",0*/};
static unsigned char zhao[] U8G_PROGMEM = {0x00,0x00,0xBE,0x3F,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x29,0xBE,0x10,0x22,0x3F,
0x22,0x21,0x22,0x21,0x22,0x21,0x3E,0x3F,0x00,0x00,0x12,0x11,0x22,0x22,0x21,0x22,/*"照",1*/};
static unsigned char quan[] U8G_PROGMEM = {0x08,0x00,0xC8,0x3F,0x88,0x20,0x88,0x20,0xBF,0x20,0x08,0x11,0x0C,0x11,0x1C,0x11,
0x2A,0x0A,0x2A,0x0A,0x09,0x04,0x08,0x04,0x08,0x0A,0x08,0x11,0x88,0x20,0x68,0x40,/*"权",2*/};

void button_State()
{ 
//A
  if(digitalRead(button1)){ //检测按键是否按下
      delay(20); //延时去抖动
      if(digitalRead(button1)){//判断长短键
        openState++;
      }
      while(digitalRead(button1));
  }
}

void millisBlink(unsigned long currentTime) { 
  //检查是否到达时间间隔
  if (currentTime - previousBlinkTime >= blinkInterval) {    //如果时间间隔达到了
    /**执行的内容**/
    cishu++;
    
    previousBlinkTime = currentTime;  // 将检查时间复位   
    
    Serial.print(F("toggle = "));Serial.println(toggle);          
  }  else if (currentTime - previousBlinkTime <= 0) {   // 如果millis时间溢出
    previousBlinkTime = currentTime;
  }
}

void csb_cj(void)
{
  //pinMode(TrigPin, OUTPUT);
  digitalWrite(TrigPin, LOW);
  delayMicroseconds( 2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds( 5);
  digitalWrite(TrigPin, LOW);
  //pinMode(EchoPin, INPUT);
  duration = pulseIn(EchoPin, HIGH);
  cm = microsecondsToCentimeters(duration);
//  Serial.print(cm);
//  Serial.print( " cm ");
//  Serial.println();
}
long microsecondsToCentimeters( long microseconds)
{
   return microseconds /  29 /  2;
}

void LED_Blink(void)
{
  if(val == HIGH)
  {
    flag = 0;
    leds[0] = CRGB::Red;
//    FastLED.show();
    leds[1] = CRGB::Blue;
    FastLED.show();
    delay(200);
    leds[0] = CRGB::Blue;
//    FastLED.show();
    leds[1] = CRGB::Red;
    FastLED.show();
    delay(150);
  }
  else if(val == LOW)
  {
    flag = 1;
    leds[0] = CRGB::Black;          // 设置光带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
    FastLED.show();                // 更新LED色彩
    delay(150);
    leds[1] = CRGB::Black;
    FastLED.show();
  }
}


void draw0(void) {
  u8g.drawXBMP( 0, 16, 16, 16, deng);
  u8g.drawXBMP( 16, 16, 16, 16, zhao);
  u8g.drawXBMP( 32, 16, 16, 16, quan);
  u8g.setFont(u8g_font_unifont);


  if(flag)
    u8g.drawStr( 52, 28, "AnQuan");
  else
    u8g.drawStr( 52, 28, "WARNING!");
  u8g.drawStr( 0, 45, "SR04:");

  u8g.setPrintPos(42,45);
  u8g.print(cm);
  u8g.drawStr( 65, 45, "cm");
}

void draw1(void) {
//  u8g.drawXBMP( 0, 16, 16, 16, deng);
//  u8g.drawXBMP( 16, 16, 16, 16, zhao);
//  u8g.drawXBMP( 32, 16, 16, 16, quan);
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 0, 45, "Numb:");
  
//  u8g2.drawUTF8(0, 45,"距离:");
  u8g.setPrintPos(42,45);
  
  u8g.print(c++);
}

void mode_0()
{
  u8g.firstPage();  
  do {
    draw0();
  } while( u8g.nextPage() );  
}

void mode_1()
{
  u8g.firstPage();  
  do {
    draw1();
  } while( u8g.nextPage() );  
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
//  u8g2.begin();
//  u8g2.enableUTF8Print();
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
  pinMode(TrigPin, OUTPUT);   //超声波引脚初始化
  pinMode(EchoPin, INPUT);
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);  // 初始化光带 
  FastLED.setBrightness(max_bright);                            // 设置光带亮度
  //将引脚13设置为输出模式
//  pinMode(ledPin, OUTPUT); 
  //将引脚2设置为输入上拉模式
  //引脚2与外部按钮连接
  pinMode(inputPin, INPUT_PULLUP);
}

void loop() {
  csb_cj();
  val = digitalRead(inputPin); 
  unsigned long currentMillis = millis(); // 获取当前时间
  millisBlink(currentMillis);
  Serial.println(val);
  LED_Blink();
  //delay(100);
//  int sensorValue = analogRead(A0);
//  // print out the value you read:
//  Serial.println(sensorValue);
  button_State();
  switch (openState)
  {
    case 0:
//      openState = 0;
      mode_0();     //
      break;
    case 1:
      mode_1();     //
      break;
    case 2:
//      mode_2();     //
      break;
    case 3:
//      mode_3();     //
      break;
    default:

      break;
  }
  if(openState == 3) openState = 0;
//  Serial.println(openState);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值