Accel working, Temp working, two way communication basically wrking

This commit is contained in:
Lukas Bachschwell 2018-04-22 21:46:19 +02:00
parent 0cffbf9aa4
commit 329fdf2ee8
2 changed files with 237 additions and 56 deletions

View File

@ -4,18 +4,39 @@
#include "SSD1306.h" #include "SSD1306.h"
#include <esp_now.h> #include <esp_now.h>
#include <WiFi.h> #include <WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "mac_config.h"
#define esc1pin 15 #define esc1pin 15
#define esc2pin 13 #define esc2pin 13
#define fallbackpin 36 #define fallbackpin 36
#define failsafeValue 127 #define failsafeValue 127
#define ONE_WIRE_BUS 14
#define fanRelais 16
#define DELETEBEFOREPAIR 0
Servo esc1; Servo esc1;
Servo esc2; Servo esc2;
SSD1306 display(0x3c, 5, 4); SSD1306 display(0x3c, 5, 4);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); // one instance for all sensrs
esp_now_peer_info_t remote;
float temperature = 0;
float voltage = 0;
float speed = 0;
uint8_t sendTemperature = 0;
uint8_t sendTemperatureDecimals = 0;
uint8_t sendVoltage = 0;
uint8_t sendSpeed = 0;
//#define pairingMode //#define pairingMode
#define CONNECTION_TIMEOUT 300 #define CONNECTION_TIMEOUT 300
#define CHANNEL 1 #define CHANNEL 1
@ -39,7 +60,7 @@ void writeServos(uint8_t firstServo, uint8_t secondServo) {
esc2.write(secondServo); esc2.write(secondServo);
} }
// callback when data is recv from Master // callback when data is recv from remote
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) { void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
char macStr[18]; char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
@ -49,6 +70,31 @@ void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
memcpy(recData, data, data_len); memcpy(recData, data, data_len);
Serial.print("Last Packet Recv Data: "); Serial.println(recData[0]); Serial.print(" "); Serial.print(recData[1]); Serial.print(" len:"); Serial.println(data_len); Serial.print("Last Packet Recv Data: "); Serial.println(recData[0]); Serial.print(" "); Serial.print(recData[1]); Serial.print(" len:"); Serial.println(data_len);
// Answer with response
const uint8_t respData[] = { sendTemperature, sendTemperatureDecimals, sendVoltage }; // sendSpeed
Serial.print("Sending RESPONSE.... ");
esp_err_t result = esp_now_send(mac_addr, respData, sizeof(data));
if (result == ESP_OK) {
Serial.println("Success");
} else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW not Init.");
} else if (result == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
} else if (result == ESP_ERR_ESPNOW_INTERNAL) {
Serial.println("Internal Error");
} else if (result == ESP_ERR_ESPNOW_NO_MEM) {
Serial.println("ESP_ERR_ESPNOW_NO_MEM");
} else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
Serial.println("Peer not found.");
} else if (result == ESP_ERR_ESPNOW_IF) {
Serial.println("ESP_ERR_ESPNOW_IF");
} else {
Serial.println("Not sure what happened");
}
lastPacket = millis(); lastPacket = millis();
isConnected = true; isConnected = true;
// Could check mac here for some security // Could check mac here for some security
@ -61,8 +107,90 @@ void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
display.display(); display.display();
} }
void deletePeer() {
const esp_now_peer_info_t *peer = &remote;
const uint8_t *peer_addr = remote.peer_addr;
esp_err_t delStatus = esp_now_del_peer(peer_addr);
Serial.print("Slave Delete Status: ");
if (delStatus == ESP_OK) {
// Delete success
Serial.println("Success");
} else if (delStatus == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW Not Init");
} else if (delStatus == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
} else if (delStatus == ESP_ERR_ESPNOW_NOT_FOUND) {
Serial.println("Peer not found.");
} else {
Serial.println("Not sure what happened");
}
}
bool manageRemote() {
if (remote.channel == CHANNEL) {
if (DELETEBEFOREPAIR) {
deletePeer();
}
Serial.print("Remote Status: ");
const esp_now_peer_info_t *peer = &remote;
const uint8_t *peer_addr = remote.peer_addr;
// check if the peer exists
bool exists = esp_now_is_peer_exist(peer_addr);
if ( exists) {
// Slave already paired.
Serial.println("Already Paired");
return true;
} else {
// Slave not paired, attempt pair
esp_err_t addStatus = esp_now_add_peer(peer);
if (addStatus == ESP_OK) {
// Pair success
Serial.println("Pair success");
return true;
} else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW Not Init");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_FULL) {
Serial.println("Peer list full");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
Serial.println("Out of memory");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
Serial.println("Peer Exists");
return true;
} else {
Serial.println("Not sure what happened");
return false;
}
}
} else {
// No slave found to process
Serial.println("No Slave found to process");
return false;
}
}
// end ESPNOW functions // end ESPNOW functions
void checkTemperature() {
sensors.requestTemperatures(); // Send the command to get temperatures
temperature = sensors.getTempCByIndex(0);
Serial.print("Temp: ");
Serial.println(temperature);
if(temperature < 35) digitalWrite(fanRelais, LOW);
if(temperature > 40) digitalWrite(fanRelais, HIGH);
sendTemperature = (uint16_t) temperature;
sendTemperatureDecimals = (uint16_t)(temperature - sendTemperature) *100;
}
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
Serial.println("ESPNowSkate Receiver"); Serial.println("ESPNowSkate Receiver");
@ -76,6 +204,10 @@ void setup() {
esc1.attach(esc1pin, 0, 0, 255, 1100, 1900); esc1.attach(esc1pin, 0, 0, 255, 1100, 1900);
esc2.attach(esc2pin, 1, 0, 255, 1100, 1900); esc2.attach(esc2pin, 1, 0, 255, 1100, 1900);
sensors.begin();
pinMode(fanRelais, OUTPUT);
//Set device in AP mode to begin with //Set device in AP mode to begin with
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
// configure device AP mode // configure device AP mode
@ -95,9 +227,19 @@ void setup() {
Serial.println("ESPNow Init Failed"); Serial.println("ESPNow Init Failed");
ESP.restart(); ESP.restart();
} }
// Once ESPNow is successfully Init, we will register for recv CB to // Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info. // get recv packer info.
esp_now_register_recv_cb(OnDataRecv); esp_now_register_recv_cb(OnDataRecv);
for (int i = 0; i < 6; ++i ) {
remote.peer_addr[i] = (uint8_t) mac_remote[i];
}
remote.channel = CHANNEL; // pick a channel
remote.encrypt = 0; // no encryption
remote.ifidx = ESP_IF_WIFI_AP;
manageRemote();
} }
@ -113,4 +255,6 @@ void loop() {
display.drawString(2, 0, buf); display.drawString(2, 0, buf);
display.display(); display.display();
} }
checkTemperature();
} }

View File

@ -9,6 +9,8 @@
#include "mac_config.h" #include "mac_config.h"
#include "graphics.h" #include "graphics.h"
#include "accel.h"
// Defining variables for OLED display // Defining variables for OLED display
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R2, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16); U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R2, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16);
char displayBuffer[20]; char displayBuffer[20];
@ -29,7 +31,7 @@ bool settingsChangeValueFlag = false;
short hallMeasurement; short hallMeasurement;
int throttle = 127; int throttle = 127;
int sendThrottle = 127; int sendThrottle = 127;
byte hallCenterMargin = 4; byte hallCenterMargin = 5;
byte currentSetting = 0; byte currentSetting = 0;
const byte numOfSettings = 11; const byte numOfSettings = 11;
@ -39,14 +41,14 @@ const float maxVoltage = 4.1;
const float refVoltage = 3.3; const float refVoltage = 3.3;
// Global copy of slave // Global copy of board
esp_now_peer_info_t slave; esp_now_peer_info_t board;
#define CHANNEL 3 #define CHANNEL 1
#define PRINTSCANRESULTS 0 #define PRINTSCANRESULTS 0
#define DELETEBEFOREPAIR 0 #define DELETEBEFOREPAIR 0
#define HAL_MIN 1390 #define HAL_MIN 1390
#define HAL_MAX 2260 #define HAL_MAX 2230
#define HAL_CENTER 1890 #define HAL_CENTER 1880
#define TRIM_LOW 180 #define TRIM_LOW 180
#define TRIM_HIGH 0 #define TRIM_HIGH 0
@ -57,13 +59,23 @@ esp_now_peer_info_t slave;
// ESPNOW functions ############################## // ESPNOW functions ##############################
// Scan for slaves in AP mode // Scan for boards in AP mode
void configDeviceAP(bool hidden) {
bool result = WiFi.softAP("ESK8Remote", "ESK8_Password+vD8z2YAvoDBW?Zx", CHANNEL, hidden);
if (!result) {
Serial.println("AP Config failed.");
} else {
Serial.println("AP Config Success. Broadcasting with AP: " + String("ESK8"));
}
}
#ifdef pairingMode #ifdef pairingMode
void ScanForSlave() { void ScanForboard() {
int8_t scanResults = WiFi.scanNetworks(); int8_t scanResults = WiFi.scanNetworks();
// reset on each scan // reset on each scan
bool slaveFound = 0; bool boardFound = 0;
memset(&slave, 0, sizeof(slave)); memset(&board, 0, sizeof(board));
Serial.println(""); Serial.println("");
if (scanResults == 0) { if (scanResults == 0) {
@ -85,35 +97,36 @@ void ScanForSlave() {
Serial.print(")"); Serial.print(")");
Serial.println(""); Serial.println("");
} }
delay(10); delay(10);
// Check if the current device starts with `Slave` // Check if the current device starts with `board`
if (SSID.indexOf("ESK8") == 0) { if (SSID.indexOf("ESK8") == 0) {
// SSID of interest // SSID of interest
Serial.println("Found a Slave."); Serial.println("Found a board.");
Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print(" ["); Serial.print(BSSIDstr); Serial.print("]"); Serial.print(" ("); Serial.print(RSSI); Serial.print(")"); Serial.println(""); Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print(" ["); Serial.print(BSSIDstr); Serial.print("]"); Serial.print(" ("); Serial.print(RSSI); Serial.print(")"); Serial.println("");
// Get BSSID => Mac Address of the Slave // Get BSSID => Mac Address of the board
int mac[6]; int mac[6];
if ( 6 == sscanf(BSSIDstr.c_str(), "%x:%x:%x:%x:%x:%x%c", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5] ) ) { if ( 6 == sscanf(BSSIDstr.c_str(), "%x:%x:%x:%x:%x:%x%c", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5] ) ) {
for (int ii = 0; ii < 6; ++ii ) { for (int ii = 0; ii < 6; ++ii ) {
slave.peer_addr[ii] = (uint8_t) mac[ii]; board.peer_addr[ii] = (uint8_t) mac[ii];
} }
} }
slave.channel = CHANNEL; // pick a channel board.channel = CHANNEL; // pick a channel
slave.encrypt = 0; // no encryption board.encrypt = 0; // no encryption
slaveFound = 1; boardFound = 1;
// we are planning to have only one slave in this example; // we are planning to have only one board in this example;
// Hence, break after we find one, to be a bit efficient // Hence, break after we find one, to be a bit efficient
break; break;
} }
} }
} }
if (slaveFound) { if (boardFound) {
Serial.println("Slave Found, processing.."); Serial.println("board Found, processing..");
} else { } else {
Serial.println("Slave Not Found, trying again."); Serial.println("board Not Found, trying again.");
} }
// clean up ram // clean up ram
@ -122,10 +135,10 @@ void ScanForSlave() {
#endif #endif
void deletePeer() { void deletePeer() {
const esp_now_peer_info_t *peer = &slave; const esp_now_peer_info_t *peer = &board;
const uint8_t *peer_addr = slave.peer_addr; const uint8_t *peer_addr = board.peer_addr;
esp_err_t delStatus = esp_now_del_peer(peer_addr); esp_err_t delStatus = esp_now_del_peer(peer_addr);
Serial.print("Slave Delete Status: "); Serial.print("board Delete Status: ");
if (delStatus == ESP_OK) { if (delStatus == ESP_OK) {
// Delete success // Delete success
Serial.println("Success"); Serial.println("Success");
@ -141,25 +154,25 @@ void deletePeer() {
} }
} }
// Check if the slave is already paired with the master. // Check if the board is already paired with the master.
// If not, pair the slave with master // If not, pair the board with master
bool manageSlave() { bool manageBoard() {
if (slave.channel == CHANNEL) { if (board.channel == CHANNEL) {
if (DELETEBEFOREPAIR) { if (DELETEBEFOREPAIR) {
deletePeer(); deletePeer();
} }
Serial.print("Slave Status: "); Serial.print("board Status: ");
const esp_now_peer_info_t *peer = &slave; const esp_now_peer_info_t *peer = &board;
const uint8_t *peer_addr = slave.peer_addr; const uint8_t *peer_addr = board.peer_addr;
// check if the peer exists // check if the peer exists
bool exists = esp_now_is_peer_exist(peer_addr); bool exists = esp_now_is_peer_exist(peer_addr);
if ( exists) { if ( exists) {
// Slave already paired. // board already paired.
Serial.println("Already Paired"); Serial.println("Already Paired");
return true; return true;
} else { } else {
// Slave not paired, attempt pair // board not paired, attempt pair
esp_err_t addStatus = esp_now_add_peer(peer); esp_err_t addStatus = esp_now_add_peer(peer);
if (addStatus == ESP_OK) { if (addStatus == ESP_OK) {
// Pair success // Pair success
@ -187,8 +200,8 @@ bool manageSlave() {
} }
} }
} else { } else {
// No slave found to process // No board found to process
Serial.println("No Slave found to process"); Serial.println("No board found to process");
return false; return false;
} }
} }
@ -200,7 +213,7 @@ void sendData() {
const uint8_t data[] = { esc1, esc2 }; // no mixture for the normal mode const uint8_t data[] = { esc1, esc2 }; // no mixture for the normal mode
const uint8_t *peer_addr = slave.peer_addr; const uint8_t *peer_addr = board.peer_addr;
Serial.print("Sending: "); Serial.println(esc1); Serial.print("Sending: "); Serial.println(esc1);
esp_err_t result = esp_now_send(peer_addr, data, sizeof(data)); esp_err_t result = esp_now_send(peer_addr, data, sizeof(data));
Serial.print("Send Status: "); Serial.print("Send Status: ");
@ -222,7 +235,7 @@ void sendData() {
} }
} }
// callback when data is sent from Master to Slave // callback when data is sent from Master to board
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
char macStr[18]; char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
@ -230,10 +243,21 @@ void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("Last Packet Sent to: "); Serial.println(macStr); Serial.print("Last Packet Sent to: "); Serial.println(macStr);
Serial.print("Last Packet Send Status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); Serial.print("Last Packet Send Status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
} }
// callback when data is recv from board
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.print("#######################Last Response Recv from: "); Serial.println(macStr);
uint8_t recData[3];
memcpy(recData, data, data_len);
Serial.print("Last Response Recv Data: "); Serial.println(recData[0]); Serial.print(" "); Serial.print(recData[1]); Serial.print(" len:"); Serial.println(data_len);
}
//############ End ESP Now //############ End ESP Now
//############ Hardware Helpers //############ Hardware Helpers
//############
// Check if an integer is within a min and max value // Check if an integer is within a min and max value
bool inRange(int val, int minimum, int maximum) { bool inRange(int val, int minimum, int maximum) {
return ((minimum <= val) && (val <= maximum)); return ((minimum <= val) && (val <= maximum));
@ -342,14 +366,14 @@ void drawThrottle() {
u8g2.drawHLine(x, y + 10, 5); u8g2.drawHLine(x, y + 10, 5);
u8g2.drawHLine(x + 52 - 4, y + 10, 5); u8g2.drawHLine(x + 52 - 4, y + 10, 5);
if (sendThrottle >= 127) { if (throttle >= 127) {
int width = map(sendThrottle, 127, 255, 0, 49); int width = map(throttle, 127, 255, 0, 49);
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
u8g2.drawVLine(x + i + 2, y + 2, 7); u8g2.drawVLine(x + i + 2, y + 2, 7);
} }
} else { } else {
int width = map(sendThrottle, 0, 126, 49, 0); int width = map(throttle, 0, 126, 49, 0);
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
u8g2.drawVLine(x + 50 - i, y + 2, 7); u8g2.drawVLine(x + 50 - i, y + 2, 7);
} }
@ -523,6 +547,8 @@ void setup() {
// setup other pins // setup other pins
pinMode(triggerPin, INPUT_PULLUP); pinMode(triggerPin, INPUT_PULLUP);
initAccel();
Serial.println("ESPNowSkate Sender"); Serial.println("ESPNowSkate Sender");
u8g2.begin(); u8g2.begin();
drawStartScreen(); drawStartScreen();
@ -543,18 +569,24 @@ void setup() {
ESP.restart(); ESP.restart();
} }
//configDeviceAP(true);
// Once ESPNow is successfully Init, we will register for Send CB to // Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet // get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent); esp_now_register_send_cb(OnDataSent);
//ScanForSlave(); //ScanForboard();
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info.
esp_now_register_recv_cb(OnDataRecv);
// Retrieve Slave from config: // Retrieve board from config:
for (int i = 0; i < 6; ++i ) { for (int i = 0; i < 6; ++i ) {
slave.peer_addr[i] = (uint8_t) mac_receiver[i]; board.peer_addr[i] = (uint8_t) mac_receiver[i];
} }
slave.channel = CHANNEL; // pick a channel board.channel = CHANNEL; // pick a channel
slave.encrypt = 0; // no encryption board.encrypt = 0; // no encryption
} }
void loop() { void loop() {
@ -575,12 +607,12 @@ void loop() {
sendThrottle = 127; sendThrottle = 127;
} }
// If Slave is found, it would be populate in `slave` variable // If board is found, it would be populate in `board` variable
// We will check if `slave` is defined and then we proceed further // We will check if `board` is defined and then we proceed further
if (slave.channel == CHANNEL) { // check if slave channel is defined if (board.channel == CHANNEL) { // check if board channel is defined
// `slave` is defined // `board` is defined
// Add slave as peer if it has not been added already // Add board as peer if it has not been added already
bool isPaired = manageSlave(); bool isPaired = manageBoard();
if (isPaired) { if (isPaired) {
// pair success or already paired // pair success or already paired
// Send data to device // Send data to device
@ -596,15 +628,20 @@ void loop() {
} while ( u8g2.nextPage() ); } while ( u8g2.nextPage() );
*/ */
} else { } else {
// slave pair failed // board pair failed
Serial.println("Slave not found / paired!"); Serial.println("board not found / paired!");
} }
} }
else { else {
// No slave found to process // No board found to process
} }
delay(20); delay(20);
} }
readAccel();
Serial.print(AcX);
Serial.print(" ");
Serial.println(GyX);
} }