子產品介紹:
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);
}