#include <Wire.h>
#include <Adafruit_BMP085.h>
//--------- Flag structure --------------------------------------
typedef struct _vFlag
{
uint8_t BTFlag = 0;
uint8_t DC_Flag = 0;
uint8_t CANFlag = 0;
uint8_t I2C_Flag = 0;
uint8_t BMP180Flag = 0;
uint8_t JSONFlag = 0;
uint8_t Radar_L_Flag = 0;
uint8_t Radar_R_Flag = 0;
uint8_t sensor_Flag = 0;
uint8_t sensor1_Flag = 0;
uint8_t initial_Flag = 0;
uint8_t Tone_Flag = -1;
uint8_t IR_RECV_Flag=0;
uint8_t IR_SEND_Flag=0;
uint8_t FunctionFlag = 3;
uint8_t SendFlag = 0;
uint8_t BMPCnt = 0;
} vFlag;
vFlag *flag_Ptr;
vFlag flag;
//----- BMP085 ------------------
Adafruit_BMP085 bmp;
//----------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;
char line[128];
//char line1[128];
char BTline[20];
//char R_line[20];
//char L_line[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;
//-------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println(F("init"));
Wire.begin(); //--i2c scanner
//-------bmp180----------------------
if (!bmp.begin())
{
Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
//while (1);
}
else{
Serial.println(F("find a valid BMP085 sensor"));
}
}
//-----------------------------------------
void loop()
{
Serial.print(F("Main at core:"));
Serial.println(xPortGetCoreID());
while(1)
{
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
//傳輸給藍芽
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)
if(flag.I2C_Flag == 1)
{
vI2C_0_Task();
}
if(flag.BMP180Flag == 1)
{
vBMPTask();
}
}
}
//----------------------------------------
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_20230626"));
}
//-------------- I2C --------------------
if (strstr(data, "I2C_SCAN") != NULL)
{
flag.I2C_Flag = 1;
Serial.println(F("I2C_SCAN"));
}
if (strstr(data, "I2C_SCAN_OFF")!= NULL)
{
flag.I2C_Flag = 0;
Serial.println(F("I2C_SCAN_OFF"));
}
//
if (strstr(data, "BMP180_ON")!= NULL)
{
flag.BMP180Flag = 1;
flag.BMPCnt = 0;
Serial.println(F("BMP180_ON"));
}
if (strstr(data, "BMP180_OFF")!= NULL)
{
flag.BMP180Flag = 0;
Serial.println(F("BMP180_OFF"));
}
}
//-----------------------------------------
void vI2C_0_Task()
{
byte count = 0;
Serial.println(F("I2C scanner. Scanning ..."));
for (byte i = 1; i < 127; i++) //---scan address
{
Wire.beginTransmission(i);
if (Wire.endTransmission() == 0)
{
Serial.print("Found_address:" + String(count + 1) + "_");
Serial.print(i, DEC);
Serial.print("_(0x");
Serial.print(i, HEX);
Serial.println(F(")"));
count++;
delay(5);
}
else
{
continue;
}
}
Serial.println(F("Done."));
Serial.print(F("Found: "));
Serial.print(count, DEC);
Serial.println(F(" device(s)."));
flag.I2C_Flag = 0;
}
//-------------------------------------------
void vBMPTask()
{
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1013.25));
Serial.println(" m");
flag.BMP180Flag = 0;
}