This commit is contained in:
OMGiTzPomPom 2023-02-02 16:39:30 +01:00
parent 4aef9ea21c
commit 739d5580dd
12 changed files with 92894 additions and 0 deletions

91
tp1/ATOM_GPS/ATOM_GPS.ino Normal file
View File

@ -0,0 +1,91 @@
/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
* Equipped with Atom-Lite/Matrix sample source code
* Atom-Lite/Matrix
* Visit for more information: https://docs.m5stack.com/en/atom/atomicgps
* 访https://docs.m5stack.com/zh_CN/atom/atomicgps
*
* Product: GPS.
* Date: 2021/9/1
*******************************************************************************
This is an example used SerialBT,you can can view gps data by connecting
to Bluetooth assistant on your mobilephone or Serial Monitor
the GPS log will be written to SD card
使BT的示例GPS数据GPS日志将写入SD卡
*/
#include "M5Atom.h"
#include "GPSAnalyse.h"
#include <SPI.h>
#include "FS.h"
#include <SD.h>
#include <BluetoothSerial.h>
BluetoothSerial SerialBT;
GPSAnalyse GPS;
uint64_t chipid;
char chipname[256];
const char filename[] = "/GPSdata.txt";
File txtFile;
float Lat;
float Lon;
String Utc;
bool writeLog(
String filename) { // Write GPSdata to SDcard. 将 GPS 数据写入 SD 卡
txtFile = SD.open(filename, FILE_APPEND);
if (txtFile) {
txtFile.print(Lat);
txtFile.print(", ");
txtFile.print(Lon);
txtFile.print(", ");
txtFile.println(Utc);
txtFile.close();
} else {
return false;
}
return true;
}
void setup() {
M5.begin(true, false, true);
chipid = ESP.getEfuseMac();
sprintf(chipname, "SerialBT_%04X", (uint16_t)(chipid >> 32));
Serial.printf("Bluetooth: %s\n", chipname);
SPI.begin(23, 33, 19, -1);
if (!SD.begin(-1, SPI, 40000000)) {
Serial.println("initialization failed!");
}
sdcard_type_t Type = SD.cardType();
Serial.printf("SDCard Type = %d \r\n", Type);
Serial.printf("SDCard Size = %d \r\n", (int)(SD.cardSize() / 1024 / 1024));
M5.dis.fillpix(0x00004f);
Serial1.begin(9600, SERIAL_8N1, 22, -1);
SerialBT.begin(chipname);
GPS.setTaskName("GPS");
GPS.setTaskPriority(2);
GPS.setSerialPtr(Serial1);
GPS.start();
}
void loop() {
GPS.upDate();
Lat = GPS.s_GNRMC.Latitude;
Lon = GPS.s_GNRMC.Longitude;
Utc = GPS.s_GNRMC.Utc;
SerialBT.printf("Latitude= %.5f \r\n", Lat);
SerialBT.printf("Longitude= %.5f \r\n", Lon);
SerialBT.printf("DATA= %s \r\n", Utc);
Serial.printf("Latitude= %.5f \r\n", Lat);
Serial.printf("Longitude= %.5f \r\n", Lon);
Serial.printf("DATA= %s \r\n", Utc);
writeLog(filename);
delay(1000);
}

278
tp1/ATOM_GPS/GPSAnalyse.cpp Normal file
View File

@ -0,0 +1,278 @@
#include "GPSAnalyse.h"
GPSAnalyse::GPSAnalyse()
{
_GPS_Str.clear();
}
void GPSAnalyse::setSerialPtr(HardwareSerial &serial)
{
_serial = &serial;
_xSemaphore = xSemaphoreCreateMutex();
}
GPSAnalyse::~GPSAnalyse()
{
}
void GPSAnalyse::run(void *data)
{
GPSReadBuff = (char*)calloc(1024,sizeof(char));
Serial.println("GPS Task");
while (1)
{
if (_serial->available())
{
memset(GPSReadBuff, 1024, sizeof(char));
_serial->readBytes(GPSReadBuff, _serial->available());
_GPS_Str.concat(GPSReadBuff);
xSemaphoreTake(_xSemaphore, portMAX_DELAY);
Analyse();
xSemaphoreGive(_xSemaphore);
delay(1);
}
else
{
delay(5);
}
}
}
void GPSAnalyse::upDate()
{
xSemaphoreTake(_xSemaphore, portMAX_DELAY);
memcpy(&s_GNRMC,&_s_GNRMC,sizeof(GNRMC_t));
memcpy(&s_GNGAS,&_s_GNGAS,sizeof(GNGSA_t));
memcpy(&s_GPGSV,&_s_GPGSV,sizeof(GPGSV_t));
xSemaphoreGive(_xSemaphore);
}
void GPSAnalyse::AnaGPRMC(String str)
{
str = str.substring(str.indexOf("GNRMC"), str.length());
if (str.indexOf('*') != -1)
{
int indexsub = str.indexOf('*');
String sumstr = str.substring(indexsub + 1, str.length());
str = str.substring(0, indexsub);
//Serial.println(sumstr);
}
int index = 0, last_index = 0, pamindex = 1;
while (str.indexOf(',', index) != -1)
{
index = str.indexOf(',', index + 1);
last_index = str.indexOf(',', index + 1);
//Serial.printf("index:%d,%d\n", index, last_index);
if (index != -1)
{
last_index = (last_index == -1) ? str.length() : last_index;
if ((last_index - index) > 1)
{
String pamstr = str.substring(index + 1, last_index);
#ifdef DEBUG_GPS
Serial.printf("%d:", pamindex);
Serial.println(pamstr);
#endif
_s_GNRMC.pamstr[pamindex] = pamstr;
}
else
{
_s_GNRMC.pamstr[pamindex].clear();
}
pamindex++;
}
}
_s_GNRMC.Utc = _s_GNRMC.pamstr[1];
if (_s_GNRMC.pamstr[2].length() != 0)
{
_s_GNRMC.State = _s_GNRMC.pamstr[2].charAt(0);
}
{
_s_GNRMC.Latitude = _s_GNRMC.pamstr[3].substring(0, 2).toDouble() + _s_GNRMC.pamstr[3].substring(2, 4).toDouble() / 60 + _s_GNRMC.pamstr[3].substring(5, 9).toDouble() / 600000;
}
//_s_GNRMC.Latitude = _s_GNRMC.pamstr[3].toDouble();
_s_GNRMC.LatitudeMark = _s_GNRMC.pamstr[4].charAt(0);
{
_s_GNRMC.Longitude = _s_GNRMC.pamstr[5].substring(0, 3).toDouble() + _s_GNRMC.pamstr[5].substring(3, 5).toDouble() / 60 + _s_GNRMC.pamstr[5].substring(6, 10).toDouble() / 600000;
}
//_s_GNRMC.Longitude = _s_GNRMC.pamstr[5].toDouble();
_s_GNRMC.LongitudeMark = _s_GNRMC.pamstr[6].charAt(0);
_s_GNRMC.TrackSpeed = _s_GNRMC.pamstr[7].toFloat();
_s_GNRMC.TrackAngle = _s_GNRMC.pamstr[8].toFloat();
_s_GNRMC.Date = _s_GNRMC.pamstr[9];
_s_GNRMC.Magnetic = _s_GNRMC.pamstr[10].toFloat();
_s_GNRMC.Declination = _s_GNRMC.pamstr[11].charAt(0);
_s_GNRMC.mode = _s_GNRMC.pamstr[12].charAt(0);
}
void GPSAnalyse::AnaGNGAS(String str)
{
str = str.substring(str.indexOf("GNGSA"), str.length());
if (str.indexOf('*') != -1)
{
int indexsub = str.indexOf('*');
String sumstr = str.substring(indexsub + 1, str.length());
str = str.substring(0, indexsub);
//Serial.println(sumstr);
}
int index = 0, last_index = 0, pamindex = 1;
while (str.indexOf(',', index) != -1)
{
index = str.indexOf(',', index + 1);
last_index = str.indexOf(',', index + 1);
if (index != -1)
{
last_index = (last_index == -1) ? str.length() : last_index;
if ((last_index - index) > 1)
{
String pamstr = str.substring(index + 1, last_index);
#ifdef DEBUG_GPS
Serial.printf("%d:", pamindex);
Serial.println(pamstr);
#endif
_s_GNGAS.pamstr[pamindex] = pamstr;
}
else
{
_s_GNGAS.pamstr[pamindex].clear();
}
pamindex++;
}
}
_s_GNGAS.mode2 = _s_GNGAS.pamstr[1].charAt(0);
_s_GNGAS.mode1 = _s_GNGAS.pamstr[2].toInt();
for (size_t i = 0; i < 12; i++)
{
_s_GNGAS.PINMap[i] = _s_GNGAS.pamstr[3 + i].toInt();
}
_s_GNGAS.PDOP = _s_GNGAS.pamstr[15].toFloat();
_s_GNGAS.HDOP = _s_GNGAS.pamstr[16].toFloat();
_s_GNGAS.VDOP = _s_GNGAS.pamstr[17].toFloat();
}
void GPSAnalyse::AnaGPGSV(String str)
{
//Serial.println(str);
str = str.substring(str.indexOf("GPGSV"), str.length());
if (str.indexOf('*') != -1)
{
int indexsub = str.indexOf('*');
String sumstr = str.substring(indexsub + 1, str.length());
str = str.substring(0, indexsub);
//Serial.println(sumstr);
}
int index = 0, last_index = 0, pamindex = 1;
while (str.indexOf(',', index) != -1)
{
index = str.indexOf(',', index + 1);
last_index = str.indexOf(',', index + 1);
if (index != -1)
{
last_index = (last_index == -1) ? str.length() : last_index;
if ((last_index - index) > 1)
{
String pamstr = str.substring(index + 1, last_index);
#ifdef DEBUG_GPS
Serial.printf("%d:", pamindex);
Serial.println(pamstr);
#endif
_s_GPGSV.pamstr[pamindex] = pamstr;
}
else
{
_s_GPGSV.pamstr[pamindex].clear();
}
pamindex++;
}
}
int SatelliteSize = (pamindex - 4) / 4;
//Serial.printf("Number%d\n", SatelliteSize);
_s_GPGSV.size = _s_GPGSV.pamstr[1].toInt();
_s_GPGSV.Number = _s_GPGSV.pamstr[2].toInt();
_s_GPGSV.SatelliteSize = _s_GPGSV.pamstr[3].toInt();
if (_s_GPGSV.Number == 1)
{
for (size_t i = 0; i < 32; i++)
{
_s_GPGSV.Satellite[i].flag = false;
}
}
for (size_t i = 0; i < SatelliteSize; i++)
{
int id = _s_GPGSV.pamstr[4 + (i * 4) + 0].toInt();
if( id >= 32 ) continue;
if(( 7 + (i * 4)) > 50 )
{
break;
}
_s_GPGSV.Satellite[id].elevation = _s_GPGSV.pamstr[4 + (i * 4) + 1].toInt();
_s_GPGSV.Satellite[id].Azimuth = _s_GPGSV.pamstr[4 + (i * 4) + 2].toInt();
_s_GPGSV.Satellite[id].SNR = (_s_GPGSV.pamstr[4 + (i * 4) + 3].length() == 0) ? -1 : _s_GPGSV.pamstr[4 + (i * 4) + 3].toInt();
_s_GPGSV.Satellite[id].flag = true;
}
if (_s_GPGSV.Number == _s_GPGSV.size)
{
for (size_t i = 0; i < 32; i++)
{
if (_s_GPGSV.Satellite[i].flag == true)
{
Serial.printf("ID %d:%d,%d,%d\n", i, _s_GPGSV.Satellite[i].elevation, _s_GPGSV.Satellite[i].Azimuth, _s_GPGSV.Satellite[i].SNR);
}
}
}
}
void GPSAnalyse::Analyse()
{
while (_GPS_Str.indexOf('\r') != -1)
{
int index = _GPS_Str.indexOf('\r');
String str = _GPS_Str.substring(0, index);
_GPS_Str = _GPS_Str.substring(index + 3, _GPS_Str.length());
str.trim();
//Serial.println(str);
if (str.indexOf("GNRMC") != -1)
{
AnaGPRMC(str);
}
else if (str.indexOf("GPVTG") != -1)
{
}
else if (str.indexOf("GPGGA") != -1)
{
}
else if (str.indexOf("GNGSA") != -1)
{
//Serial.print("GNGSA:");
//AnaGNGAS(str);
}
else if (str.indexOf("GPGSV") != -1)
{
//Serial.print("GPGSV:");
AnaGPGSV(str);
}
else if (str.indexOf("GPGLL") != -1)
{
}
}
}

117
tp1/ATOM_GPS/GPSAnalyse.h Normal file
View File

@ -0,0 +1,117 @@
#ifndef _GPSANALYSE_H_
#define _GPSANALYSE_H_
#include <Arduino.h>
#include "utility/Task.h"
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
//#define DEBUG_GPS
typedef struct GNRMC
{
String pamstr[13];
String Utc; //1
char State; //2
double Latitude; //3
char LatitudeMark; //4
double Longitude; //5
char LongitudeMark; //6
float TrackSpeed; //7
float TrackAngle; //8
String Date; //9
float Magnetic; //10
char Declination; //11
int mode; //12
String Sum;
}GNRMC_t;
typedef struct GNGSA
{
String pamstr[50];
char mode2;
int mode1;
int PINMap[12];
float PDOP;
float HDOP;
float VDOP;
String Sum;
}GNGSA_t;
typedef struct GPSSatellite
{
bool flag;
int id;
int elevation;
int Azimuth;
int SNR;
}GPSSatellite_t;
typedef struct GPGSV
{
String pamstr[128];
int size;
int Number;
int SatelliteSize;
GPSSatellite_t Satellite[32];
String sum;
}GPGSV_t;
/*
typedef struct GPGGA
{
}GPGGA_t;
typedef struct GPGGA
{
}GPGGA_t;
typedef struct GPGLL
{
}GPGLL_t;
*/
class GPSAnalyse : public Task
{
private:
/* data */
String _GPS_Str;
HardwareSerial *_serial;
SemaphoreHandle_t _xSemaphore = NULL;
char *GPSReadBuff;
void Analyse();
void AnaGPRMC(String str);
void AnaGNGAS(String str);
void AnaGPGSV(String str);
void run(void *data);
GNRMC_t _s_GNRMC;
GNGSA_t _s_GNGAS;
GPGSV_t _s_GPGSV;
public:
GPSAnalyse();
~GPSAnalyse();
void setSerialPtr(HardwareSerial &serial);
void upDate();
GNRMC_t s_GNRMC;
GNGSA_t s_GNGAS;
GPGSV_t s_GPGSV;
};
#endif

38
tp2/bt/bt.ino Normal file
View File

@ -0,0 +1,38 @@
#include "BluetoothSerial.h"
#include <M5StickC.h>
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
BluetoothSerial SerialBT;
void setup() {
M5.begin(115200);
SerialBT.begin("PomPomBT");
Serial.println("The device started.");
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("PomPom ON");
}
void loop() {
String cmd = String("AJ");
String eol = String("\r\n");
String cmdR;
if (SerialBT.available()) {
cmdR = SerialBT.readString();
if(cmdR == (cmd + eol)) {
SerialBT.println("Applejack is best pony !");
} else {
SerialBT.println("Pony doesn't received !");
}
}
delay(2000);
}

14
tp2/bt/debug.cfg Normal file
View File

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Example OpenOCD configuration file for ESP32-WROVER-KIT board.
#
# For example, OpenOCD can be started for ESP32 debugging on
#
# openocd -f board/esp32-wrover-kit-3.3v.cfg
#
# Source the JTAG interface configuration file
source [find interface/ftdi/esp32_devkitj_v1.cfg]
set ESP32_FLASH_VOLTAGE 3.3
# Source the ESP32 configuration file
source [find target/esp32.cfg]

19
tp2/bt/debug_custom.json Normal file
View File

@ -0,0 +1,19 @@
{
"name":"Arduino on ESP32",
"toolchainPrefix":"xtensa-esp32-elf",
"svdFile":"esp32.svd",
"request":"attach",
"postAttachCommands":[
"set remote hardware-watchpoint-limit 2",
"monitor reset halt",
"monitor gdb_sync",
"thb setup",
"c"
],
"overrideRestartCommands":[
"monitor reset halt",
"monitor gdb_sync",
"thb setup",
"c"
]
}

46087
tp2/bt/esp32.svd Normal file

File diff suppressed because it is too large Load Diff

BIN
tp2/smartHome.docx Normal file

Binary file not shown.

130
tp3/BLE/BLE.ino Normal file
View File

@ -0,0 +1,130 @@
/*
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cpp
Ported to Arduino ESP32 by Evandro Copercini
updates by chegewara
*/
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLEAdvertisedDevice.h>
int lux;
int mini;
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "f608bae5-6eec-4be7-aafb-2bd43ce942bf"
#define POWER_READ_UUID "06c79a69-54b1-46e9-9b1d-afb77e6fad15"
#define POWER_CHECK_UUID "f54a0bdf-afa3-4d18-a96c-770ba5bc3577"
#define SEUILS_UUID "e7588746-cde4-44c4-aec6-8ef838a71480"
bool estConnecte = false;
char msgTOsend[30];
//char rxValue [255];
class MyCallback : public BLECharacteristicCallbacks {
void onRead(BLECharacteristic* pCharacteristic) {
// Do something before the read completes
int lux=random(0, 9999);
sprintf(msgTOsend,"Puissance : %d",lux);
pCharacteristic->setValue(msgTOsend);
Serial.printf("Hello : %d \n",lux);
//Serial.print('\n'):
}
void onWrite(BLECharacteristic* pCharacteristic) {
// Do something because a new value was written.
std::string rxValue=pCharacteristic->getValue(); //ex tel envoi 5000
mini = atoi(rxValue.c_str());
Serial.print("message received :");
Serial.println(rxValue.c_str());
// si valeur numérique :
//uint8_t* received_data = pCharacteristic->getData();
// Serial.println(*received_data,HEX);
}
};
class EtatServeur : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
estConnecte = true;
Serial.println("Connecté");
}
void onDisconnect(BLEServer* pServer) {
estConnecte = false;
BLEDevice::startAdvertising();
Serial.println("Déconnecté");
}
};
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Advertised Device: %s", advertisedDevice.toString().c_str());
if (advertisedDevice.haveRSSI()){
Serial.printf("Rssi: %d \n", (int)advertisedDevice.getRSSI());
}
else {
Serial.printf("\n");
}
}
};
BLECharacteristic *pCharacteristic;
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE ");
BLEDevice::init("PomPom");
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new EtatServeur());
BLEService *pService = pServer->createService(SERVICE_UUID);
//BLECharacteristic *pCharacteristic = pService->createCharacteristic(
pCharacteristic = pService->createCharacteristic(
POWER_READ_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setValue("Hello ESP32 ");
//BLECharacteristic::setCallbacks(new MyCallback())
pCharacteristic->setCallbacks(new MyCallback());
pService->start();
// BLEAdvertising *pAdvertising = pServer->getAdvertising(); // this still is working for backward compatibility
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
/*pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06); // functions that help with iPhone connections issue
pAdvertising->setMinPreferred(0x12);*/
//pAdvertising->setCallbacks(new MyAdvertisedDeviceCallbacks());
BLEDevice::startAdvertising();
Serial.println("Characteristic defined! Now you can read it in your phone!");
}
void loop() {
//float h = getRssi();
// put your main code here, to run repeatedly:
if (estConnecte) {
lux=random(0, 9999);
if(lux<mini) {
Serial.println("Pas assez de lumière");
sprintf(msgTOsend,"Pas assez de lumière. Lux = %d",lux);
pCharacteristic->setValue(msgTOsend);
pCharacteristic->notify();
}
}
delay(2000);
//BLEDevice::startAdvertising();
}

14
tp3/BLE/debug.cfg Normal file
View File

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Example OpenOCD configuration file for ESP32-WROVER-KIT board.
#
# For example, OpenOCD can be started for ESP32 debugging on
#
# openocd -f board/esp32-wrover-kit-3.3v.cfg
#
# Source the JTAG interface configuration file
source [find interface/ftdi/esp32_devkitj_v1.cfg]
set ESP32_FLASH_VOLTAGE 3.3
# Source the ESP32 configuration file
source [find target/esp32.cfg]

19
tp3/BLE/debug_custom.json Normal file
View File

@ -0,0 +1,19 @@
{
"name":"Arduino on ESP32",
"toolchainPrefix":"xtensa-esp32-elf",
"svdFile":"esp32.svd",
"request":"attach",
"postAttachCommands":[
"set remote hardware-watchpoint-limit 2",
"monitor reset halt",
"monitor gdb_sync",
"thb setup",
"c"
],
"overrideRestartCommands":[
"monitor reset halt",
"monitor gdb_sync",
"thb setup",
"c"
]
}

46087
tp3/BLE/esp32.svd Normal file

File diff suppressed because it is too large Load Diff