Purpose:
利用手上ESP32板子為主架構搭配PIR HC-SR505 sensor感應去控制servo motor旋轉角度另添加一塊充電模組可以完成一個充電式感應垃圾桶!!
Using the ESP32 board as the main structure with the PIR HC-SR505 sensor to control the rotation angle of the servo motor, and adding a charging module to complete a rechargeable inductive trash can!!
BOM:
Figure1 PIR HC-SR505
Figure2 充電鋰電池
Figure3 ESP32
Figure4 充電板
Circuit:
Figure5 整體架構
YouTube Demo:
演示影片
Code Introduce:
#include <ESP32Servo.h>
#include <BluetoothSerial.h>
//--------- Flag structure --------------------------------------
typedef struct _vFlag
{
uint8_t LEDFlag=1;
uint8_t BTFlag = 0;
uint8_t ServoFlag = 0;
uint8_t PIR_Flag = 1;
uint8_t PIR_status = 0;
} vFlag;
vFlag *flag_Ptr;
vFlag flag;
//----------uart--------------
#define LINE_BUFFER_LENGTH 64
//--------- uart structure --------------------------------------
typedef struct _vUart
{
char c;
int lineIndex = 0;
int line1Index = 0;
int BTlineIndex = 0;
bool lineIsComment;
bool lineSemiColon;
char line[128];
char BTline[20];
String inputString;
String BTinputString;
String S1inputString;
int V[16];
char ctemp[30];
char I2C_Data[80];
int DC_Spped = 50;
float Voltage[16];
int Buffer[128];
int StartCnt = 0;
int ReadCnt = 0;
int sensorValue = 0;
} vUart;
vUart *Uart_Ptr;
vUart Uart;
//------------------------------------------------
#define LED_BUILTIN 2
BluetoothSerial SerialBT;
//------------------------------------------------
Servo myservo; // create servo object to control a servo
// Recommended PWM GPIO pins on the ESP32 include 2,4,12-19,21-23,25-27,32-33
int servoPin = 13;
//-----------------------
int inPin = 22; //PIR pin
//-------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println(F("init"));
pinMode(LED_BUILTIN, OUTPUT);
pinMode(inPin, INPUT);
SerialBT.begin("BT_Servo"); // BTName
myservo.setPeriodHertz(50); // standard 50 hz servo
myservo.attach(servoPin, 500, 2400); // attaches the servo on pin 13 to the servo object
myservo.write(0);
}
//-----------------------------------------
void loop()
{
Serial.print(F("Main at core:"));
Serial.println(xPortGetCoreID());
while(1)
{
if(flag.LEDFlag == 1) //flash LED
{
digitalWrite(LED_BUILTIN, HIGH);
vTaskDelay(300);
digitalWrite(LED_BUILTIN, LOW);
vTaskDelay(300);
}
if (flag.PIR_Flag == 1) //start PIR detect
{
Serial.println(flag.PIR_status);
if(digitalRead(inPin) == HIGH)
{
if(flag.PIR_status==0)
{
Serial.println("Presence detected");
myservo.write(100);
flag.PIR_status=1;
vTaskDelay(20);
}
}
else
{
if(flag.PIR_status==1)
{
Serial.println("No detected");
myservo.write(0);
flag.PIR_status=0;
}
}
}
while (Serial.available() > 0)
{
Uart.c = Serial.read();
if ((Uart.c == '\n') || (Uart.c == '\r'))
{ // End of line reached
if (Uart.lineIndex > 0)
{ // Line is complete. Then execute!
Uart.line[Uart.lineIndex] = '\0'; // Terminate string
//Serial.println( F("Debug") );
//Serial.println( Uart.inputString );
processCommand(Uart.line); // do something with the command
//傳輸給藍芽
SerialBT.println(Uart.line);
Uart.lineIndex = 0;
Uart.inputString = "";
}
else
{
// Empty or comment line. Skip block.
}
Uart.lineIsComment = false;
Uart.lineSemiColon = false;
Serial.println(F("ok>"));
}
else
{
//Serial.println( c );
if ((Uart.lineIsComment) || (Uart.lineSemiColon))
{
if (Uart.c == ')')
Uart.lineIsComment = false; // End of comment. Resume line.
}
else
{
if (Uart.c == '/')
{ // Block delete not supported. Ignore character.
}
else if (Uart.c == '~')
{ // Enable comments flag and ignore all characters until ')' or EOL.
Uart.lineIsComment = true;
}
else if (Uart.c == ';')
{
Uart.lineSemiColon = true;
}
else if (Uart.lineIndex >= LINE_BUFFER_LENGTH - 1)
{
Serial.println("ERROR - lineBuffer overflow");
Uart.lineIsComment = false;
Uart.lineSemiColon = false;
}
else if (Uart.c >= 'a' && Uart.c <= 'z')
{ // Upcase lowercase
Uart.line[Uart.lineIndex] = Uart.c - 'a' + 'A';
Uart.lineIndex = Uart.lineIndex + 1;
Uart.inputString += (char)(Uart.c - 'a' + 'A');
}
else
{
Uart.line[Uart.lineIndex] = Uart.c;
Uart.lineIndex = Uart.lineIndex + 1;
Uart.inputString += Uart.c;
}
}
}
} //while (Serial.available() > 0)
while (SerialBT.available())
{
//讀取藍芽資料
String BTdata = SerialBT.readString();
//顯示在序列視窗
Serial.println(BTdata);
//char charBuf[BTdata.length() + 1];
//BTdata.toCharArray(charBuf, BTdata.length());
BTprocessCommand(BTdata); // do something with the command
//processCommand(charBuf); // do something with the command
}//while (BT.available())
}
}
void BTprocessCommand(String data)
{
if (data == "100")
{
Serial.println(F("SERVO_100"));
myservo.write(100);
}
if (data == "10")
{
Serial.println(F("SERVO_10"));
myservo.write(10);
//myservo.detach();
}
if (data == "180")
{
Serial.println(F("SERVO_180"));
myservo.write(180);
}
if (data == "50")
{
Serial.println(F("SERVO_50"));
myservo.write(50);
//myservo.detach();
}
}
//----------------------------------------
void processCommand(char *data)
{
int len, xlen, ylen, zlen, alen;
int tempDIO;
String stemp;
len = Uart.inputString.length();
//---------------------------------------
if (strstr(data, "VER") != NULL)
{
Serial.println(F("ESP32_20230710"));
}
//-------------- Servo --------------------
if (strstr(data, "SERVO_5")!= NULL)
{
Serial.println(F("SERVO_5"));
myservo.write(5);
//myservo.detach();
}
if (strstr(data, "SERVO_10")!= NULL)
{
Serial.println(F("SERVO_10"));
myservo.write(10);
}
if (strstr(data, "SERVO_50")!= NULL)
{
Serial.println(F("SERVO_50"));
myservo.write(50);
}
if (strstr(data, "SERVO_100")!= NULL)
{
Serial.println(F("SERVO_100"));
myservo.write(100);
}
if (strstr(data, "SERVO_180")!= NULL)
{
Serial.println(F("SERVO_180"));
myservo.write(180);
}
if (strstr(data, "SERVO_270")!= NULL)
{
Serial.println(F("SERVO_270"));
myservo.write(270);
}
}
//------------------------------------------
沒有留言:
張貼留言