Bonjour a toutes et tous,
Je cherche a connecter un NodeMCU a base d'ESP8266 pour "vigiboter" un train lego.
J'ai utilisé l'exemple de @Mike118 modifié par @Firened sans succès car j'obtiens l'erreur :
void writePiSerial()':
sketch_apr06a:237:34: error: 'struct TrameRx' has no member named 'choixCameras'
trameTx.choixCameras = trameRx.choixCameras;
^
exit status 1
'struct TrameRx' has no member named 'choixCameras'
le code est :
#include <WiFi.h>
#include <ESP8266WiFi.h>
//ici c'est simplement en tant que serveur :P
const char* ssid = "your_ssid";
const char* pass = "your_pass";
// Set your Static IP address
IPAddress local_IP(192, 168, 1, 61);
// Set your Gateway IP address
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
// Meta Type :
typedef struct {
union {
struct {
int16_t x;
int16_t y;
};
int16_t coordonnees[2];
uint8_t bytes[4];
};
} Point;
typedef struct {
union {
struct {
int8_t x;
int8_t y;
int8_t z;
};
uint8_t bytes[3];
};
} Vitesses;
// CONFIG
//#define PISERIAL Serial
#define NBPOSITIONS 2
#define FAILSAFE 250 // ms
// TTS
#define TTSBUFFERSIZE 255
uint8_t ttsBuffer[TTSBUFFERSIZE];
uint8_t ttsCurseur = 0;
// TX
#define TXFRAMESIZE (NBPOSITIONS * 4 + 17)
typedef struct {
union {
struct {
uint8_t sync[4]; // 4
Point positions[NBPOSITIONS]; // NBPOSITIONS * 4
uint16_t val16[2]; // 2 * 2
uint8_t choixCameras; // 1
Vitesses vitesses; // 3
uint8_t interrupteurs; // 1
uint8_t val8[4]; // 4
};
uint8_t bytes[TXFRAMESIZE];
};
} TrameTx;
// RX
#define RXFRAMESIZE (NBPOSITIONS * 4 + 9)
typedef struct {
union {
struct { // Sizes
uint8_t sync[4]; // 4
Point positions[NBPOSITIONS]; // NBPOSITIONS * 4 uint8_t choixCameras; // 1
Vitesses vitesses; // 3
uint8_t interrupteurs; // 1
};
uint8_t bytes[RXFRAMESIZE];
};
} TrameRx;
TrameTx trameTx;
TrameRx trameRx;
uint32_t lastTrameTimestamp = millis();
uint32_t lastSleepBeacon;
WiFiServer server(7070); //ESP server port
WiFiClient client;
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.begin("SSID", "PASS");
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
if (readPiSerial()) {
// each time we receive a full trame run repeatedly:
// use values inside trameRx to tell your robot how to move ...
// trameRx.vitesses.x , trameRx.vitesses.y, trameRx.vitesses.z
// trameRx.positions[i].x trameRx.positions[i].y etc....
writePiSerial();
lastTrameTimestamp = millis();
}
if ( millis() - lastTrameTimestamp > FAILSAFE ) {
if ((millis() - lastSleepBeacon > 10000) ) { // every 10 seconds
writePiSerial(); // Beacon to say that the robot is alive
lastSleepBeacon = millis();
}
// Stop the robot in case the robot lost connection with the Pi
} else {
// put your main code here, to run repeatedly:
// avoid abstacle, run speed ...
}
}
bool readPiSerial() {
uint8_t current;
static uint8_t lastType = 0;
static uint8_t n = 0;
static uint8_t frame[RXFRAMESIZE];
static byte lastClientState = 0;
if (client.connected()) {
if (!lastClientState) {
lastClientState = 1;
Serial.println("New Client.");
}
while (client.available()) {
current = client.read();
//Serial.write(current); //debug
switch (n) {
case 0:
if (current == '$')
n = 1;
break;
case 1:
if (current != 'T' && lastType == 'T')
writeTtsBuffer('\n');
if (current == 'S' || current == 'T') {
lastType = current;
n = 2;
} else
n = 0;
break;
default:
frame[n++] = current;
if (n == RXFRAMESIZE) {
if (lastType == 'T') {
for (uint8_t i = 4; i < RXFRAMESIZE; i++) // Do not send the 4 sync data in tts
writeTtsBuffer(frame[i]);
} else if (lastType == 'S') {
for (uint8_t p = 0; p < RXFRAMESIZE; p++)
trameRx.bytes[p] = frame[p];
}
n = 0;
return true;
}
//break;
}
}
} else { //if current client is not actively connected anymore, disconnect and wait for new client
if (lastClientState) {
lastClientState = 0;
// close the connection:
client.stop();
Serial.println("Client Disconnected.");
}
client = server.available(); // listen for incoming clients
}
return false;
}
void writePiSerial() {
// Header, do not modify
trameTx.sync[0] = '$';
trameTx.sync[1] = 'R';
trameTx.sync[2] = ' ';
trameTx.sync[3] = ' ';
// modify the feedback according your need. By default we copy the trameRx content ...
for (uint8_t i = 0; i < NBPOSITIONS; i++) {
trameTx.positions[i].x = trameRx.positions[i].x;
trameTx.positions[i].y = trameRx.positions[i].y;
}
trameTx.val16[0] = 0; // Voltage (will be updated by Raspberry pi)
trameTx.val16[1] = 0; // Percent (will be updated by Raspberry pi)
trameTx.choixCameras = trameRx.choixCameras;
trameTx.vitesses.x = trameRx.vitesses.x;
trameTx.vitesses.y = trameRx.vitesses.y;
trameTx.vitesses.z = trameRx.vitesses.z;
trameTx.interrupteurs = trameRx.interrupteurs;
trameTx.val8[0] = 0; // CPU load (will be updated by Raspberry pi)
trameTx.val8[1] = 0; // Soc temp (will be updated by Raspberry pi)
trameTx.val8[2] = 0; // link (will be updated by Raspberry pi)
trameTx.val8[3] = 0; // RSSI (will be updated by Raspberry pi)
for ( uint8_t i = 0; i < TXFRAMESIZE; i++)
client.write(trameTx.bytes[i]);
}
void displayTtsBuffer (uint8_t * ttsBuffer, uint8_t bufferSize) {
// you can modify this function to display text on a screen depending on your hardware...
for ( uint8_t i = 0; i < bufferSize; i++) {
Serial.write(ttsBuffer[i]);
}
Serial.println("");
}
void writeTtsBuffer( uint8_t ttsChar) {
static uint8_t ttsCurseur = 0;
if ( ttsCurseur < TTSBUFFERSIZE && ttsChar != '\n') {
ttsBuffer[ttsCurseur] = ttsChar;
ttsCurseur ++;
}
if ( ttsCurseur == TTSBUFFERSIZE || ttsChar == '\n') {
displayTtsBuffer (ttsBuffer, ttsCurseur);
ttsCurseur = 0;
}
}
Merci de votre aide !
Pierre


Mon contenu
Homme



