DIY無線傳感器集線器
在這個項目中,我們設(shè)計了一個無線傳感器集線器,利用ESP32和Arduino通過NRF24L01收發(fā)器連接。
您可以從JLCMC獲得所有組件。
特性和功能
ESP32中心:
?菜單配置與按鈕:選擇傳感器節(jié)點,切換警報模式,查看系統(tǒng)狀態(tài),設(shè)置開關(guān)定時器。
?開關(guān)控制:通過物理開關(guān)撥動連接的繼電器/燈/電器。
?OLED UI:實時顯示傳感器數(shù)據(jù)和系統(tǒng)狀態(tài)。
?NRF24通信:無線接收來自多個節(jié)點的傳感器告警。
Arduino(ATMEGA328P) -實時監(jiān)控
Arduino板作為專用警報節(jié)點,負(fù)責(zé)監(jiān)控關(guān)鍵的安全和自動化組件:
?門傳感器:使用簧片開關(guān)檢測打開/關(guān)閉狀態(tài),以監(jiān)控未經(jīng)授權(quán)的訪問或進(jìn)入。
?氣體泄漏傳感器:使用mq系列傳感器連續(xù)檢查氣體泄漏(例如,LPG,甲烷)。
?自動門鈴:檢測存在使用PIR或按鈕按下,觸發(fā)門鈴警報。
?LED指示燈:根據(jù)觸發(fā)的傳感器(例如,門,氣體,運動)點亮四個LED。
?蜂鳴器警報:當(dāng)任何傳感器檢測到故障或存在時,一個響亮的蜂鳴器會激活。
該節(jié)點將所有警報無線傳輸?shù)紼SP32,實現(xiàn)快速和集中的顯示或操作。
由JLCMC贊助:您的機(jī)械零件首選合作伙伴!
介紹JLCMC,值得信賴的JLC家族的最新成員,以市場上最優(yōu)惠的價格提供高質(zhì)量的機(jī)械零件。憑借JLCPCB建立的卓越傳統(tǒng),JLCMC在這里為您的所有機(jī)械需求提供可靠且價格合理的解決方案。
為什么選擇JLCMC?
一個值得信賴的名字:JLCMC建立在JLC服務(wù)的基礎(chǔ)上,JLC是PCB制造和原型設(shè)計的全球領(lǐng)導(dǎo)者。他們對質(zhì)量和客戶滿意度的承諾體現(xiàn)在他們的機(jī)械零件服務(wù)中。
無與倫比的價格:忠實于JLC的傳統(tǒng),JLCMC以行業(yè)領(lǐng)先的價格提供機(jī)械零件,確保您的項目在不影響質(zhì)量的情況下保持預(yù)算。
廣泛的產(chǎn)品范圍:從精密工程組件到定制解決方案,JLCMC擁有將您的想法變?yōu)楝F(xiàn)實所需的一切,無論您是業(yè)余愛好者還是專業(yè)人士。
全球信任:JLC的服務(wù)贏得了全球數(shù)百萬制造商的信任。有了JLCMC,你就有了同樣的可靠性,現(xiàn)在是在機(jī)械部件領(lǐng)域。
代碼
#include
#include
#include
#define CE 9
#define CSN 10
#define BUZZER A0
#define DOOR_STATUS_LED 8
RF24 radio(CE, CSN); // CE, CSN
const byte address[6] = "10001";
// Define data structure
struct data {
uint8_t nodeId;
uint8_t nodeState;
uint8_t doorState;
};
unsigned long previousMillis = 0;
bool buzzerState = false;
// bool wasDisconnected = false; // Flag to track disconnection state
void setup() {
Serial.begin(115200);
Serial.println("\nInitializing...");
pinMode(DOOR_STATUS_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
NRF24_Init();
}
void loop() {
if (radio.available()) {
struct data receiveData;
radio.read(&receiveData, sizeof(receiveData));
Serial.print("ID: ");
Serial.print(receiveData.nodeId);
Serial.print(", Status: ");
Serial.print(receiveData.nodeState);
Serial.print(", Door: ");
Serial.println(receiveData.doorState);
digitalWrite(DOOR_STATUS_LED, receiveData.doorState);
// digitalWrite(BUZZER, receiveData.doorState == 1 ? HIGH : LOW);
buzzer(receiveData.doorState, 100);
}
}
void NRF24_Init() {
if (!radio.begin()) {
Serial.println("? NRF24L01 Initialization Failed!");
return;
}
radio.openReadingPipe(1, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
Serial.println("? NRF24L01 Initialized Successfully!");
}
void buzzer(int signal, int delayTime) {
if (signal == 1) {
if (millis() - previousMillis >= delayTime) {
previousMillis = millis();
buzzerState = !buzzerState;
digitalWrite(BUZZER, buzzerState);
}
} else {
digitalWrite(BUZZER, LOW);
}
}
本文編譯自hackster.io