Ik heb een probleempje met de communicatie tussen een Arduino Mega 2560 en een ESP8266. Wellicht dat de gurus hier het zo zien. De gebruikte hardware is de
MEGA+WiFi R3 ATmega2560+ESP8266, flash 32MB, USB-TTL CH340G, Micro-USB. Oftewel een Mega 2560 en ESP8266 op hetzelfde bord. Onder de tab "documents" zijn
pinout en
schematic te vinden.
Door middel van 8 dipswitches zijn de twee chips en CH340 USB op verschillende manieren aan elkaar te koppelen.
Ik kan beide chips afzonderlijk programmeren maar als ik ze met elkaar wil laten praten, krijg ik niet het gewenste resultaat. Waarschijnlijk ga ik iets te kort door de bocht met serial lezen en schrijven...
Mijn verwachtingspatroon is dat als ik met de Mega iets verzend met serial3.println("test") ik die met de ESP8266 moet kunnen lezen met serial.readString() en visa versa.
Eén van de modes met de dipswitches is "
CH340 connect to Mega2560 COM3 connect to ESP8266". Hierbij hangt de Serial3 van de Mega aan de Serial van de ESP8266. De Serial van de Mega hangt aan de USB controller. Er zou dus geen softwareSerial nodig zijn zoals met veel van de voorbeelden met losse ESP8266 boards.
Het doel wat ik heb:
- Mega 10x analog input laten lezen (werkt)
- De 10 metingen in een enkele string naar de ESP8266 sturen (werkt wel/niet?)
- De ESP8266 leest de 10 metingen van de Mega (werkt niet)
- Bij ontvangst van een commando over MQTT, antwoordt de ESP8266 over MQTT (werkt)
C: Mega 2560 Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| // the setup routine runs once when you press reset:
void setup() {
Serial.begin(9600); //Serial monitor
Serial1.begin(9600);
Serial2.begin(9600);
Serial3.begin(9600); //ESP8266
}
void loop() {
// read the inputs on analog pins:
int sensorVals[10];
sensorVals[0] = analogRead(A0);
sensorVals[1] = analogRead(A1);
sensorVals[2] = analogRead(A2);
sensorVals[3] = analogRead(A3);
sensorVals[4] = analogRead(A4);
sensorVals[5] = analogRead(A5);
sensorVals[6] = analogRead(A6);
sensorVals[7] = analogRead(A7);
sensorVals[8] = analogRead(A8);
sensorVals[9] = analogRead(A9);
// Conversion to Volts
float voltages[10];
for (int i=0; i<10; i++)
voltages[i] = (sensorVals[i] * 5.0) / 1023.0;
// Create a string with the reading, semicolon seperated:
String voltagesStr = "V;";
for (int i=0; i<10; i++)
{
voltagesStr.concat(voltages[i]);
voltagesStr.concat(";");
}
Serial.println(Serial.readString()); //This one shows any manual input by the serial monitor
Serial.println(Serial1.readString()); //Shows blank, just in case
Serial.println(Serial2.readString()); //Shows blank, just in case
Serial.println(Serial3.readString()); //Shows blank, expected this to show the ESP8266 string
Serial.println(voltagesStr); //Serial monitor
Serial1.println(voltagesStr); //Just in case
Serial2.println(voltagesStr); //Just in case
Serial3.println(voltagesStr); //To ESP8266
delay(1000);
} |
C: Mega 2560 Serial Monitor Output
1
2
3
4
5
| -> V;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;
->
->
->
-> V;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00; etcetera |
En dan vervolgens de code voor de ESP8266 (standaard out-of-the-box firmware)
C: ESP8266 Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| #include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char *ssid = "####";
const char *password = "####";
const char *mqtt_server = "m24.cloudmqtt.com";
const char *device_id = "esp8266";
WiFiClient espClient;
PubSubClient client(espClient);
char message_buff[100];
//Callback which is called when an MQTT message is received
void callback(char *led_control, byte *payload, unsigned int length)
{
int i;
for (i = 0; i < length; i++)
{
message_buff[i] = payload[i];
}
message_buff[i] = '\0';
String msgString = String(message_buff);
Serial.println(msgString);
if (strcmp(led_control, "esp8266/led_control") == 0) //led_control is copy-paste from example script
{
if (msgString == "2")
{
//Shows in Serial Monitor when dipswitches connect the ESP8266 to USB
//Expect this to be sent to Mega 2560 when dipswitches are set to 1-1-1-1-0-0-0-0
Serial.println("2 received, sent from ESP8266 to Serial");
String recv = Serial.readString();
String recv1 = Serial1.readString();
//Line below publishes any string entered with the Serial Monitor when in ESP8266 only mode
//Expect line below to show the Mega 2560 serial3 output in CH340 <-> Mega 2560 <-> ESP8266 mode
client.publish("serialReceived",recv.c_str());
client.publish("serial1Received",recv1.c_str());
client.publish("topic","message"); //For testing purposes, always the same response
}
}
}
void reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect(device_id, "#######", "#######"))
{
Serial.println("connected");
client.subscribe("esp8266/led_control"); //led_control is copy-paste from example script
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
client.setServer(mqtt_server, 10644); // change port number as mentioned in your cloudmqtt console
client.setCallback(callback);
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
} |
C: MQTT reactie na versturen van "2" naar de ESP8266
1
2
3
| "topic" "message"
"serial1Received" ""
"serialReceived" "" |
Enerzijds verwacht ik dat regel 44 van de Mega data verstuurt naar de ESP 8266 regel 34.
Mega: Serial3.println(voltagesStr);
verstuurt naar
ESP 8266: String recv = Serial.readString();
wat ik vervolgens zou moeten zien via MQTT
Anderzijds verwacht ik dat regel 32 van de ESP 8266 data verstuurt naar de Mega regel 39.
ESP 8266: Serial.println("2 received, sent from ESP8266 to Serial");
verstuurt naar
Mega: Serial.println(Serial3.readString());
wat ik zou moeten zien via de serial monitor.
Waar zit die stomme (denk)fout waar ik al heel de dag overheen kijkt en waarbij ook de rubber ducky niet helpt?
“A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away.” —Antoine De Saint-Exupery