Hi, I’m Noob and lost,
My target is to measure on 3 different places about 15m from each other, the Temperature, the Humidity and VOS (some gasValue) and put this 9 values on a display as a stand alone system.
To do this I use:
- 3 Arduino Uno’s rev3, with WIZnet5500 ethernet shield and the Adafruit BME680 connected via I²C
- 1 Arduino Mega 2560, with WIZnet5500 shield and 4D system Arduino shield
- 1 4D system display Diablo uLCD-70DT
- 1 Netgear GS105v5 unmanaged switch
- Arduino 1.8.7 IDE
The Mega as central unit connected with the display.
The 3 Uno’s on the 3 places all with their own BME680 sensor.
The switch which connect the 4 ethernet shields using the UDP protocol.
And it all communicate, except I can’t find the reason/solution why my received packets are shifted 1 step.
I clear myself:
The code on the Uno:
[code]
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include <Ethernet.h>
#include <EthernetUdp.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme; // create a bme object
float Temp_M1; // declare variable for temp °C
float Humi_M1; // declare variable for humidity %
float Gas_M1; // declare variable for gas Kohm
byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x01, 0x05 }; // MAC address Uno-M1
IPAddress ip(192, 168, 0, 100); // IP address Uno-M1
unsigned int localPort = 8888; // local port to listen on
EthernetUDP Udp; // An EthernetUDP instance to let us send and receive packets over UDP
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // a buffer to hold incoming packet,
String datreq; // a string for our data
int packetSize; // size of the packet
void setup() {
Serial.begin(9600); // inialize the serial port
Ethernet.begin(mac,ip); // inialize the ethernet
Udp.begin(localPort); // inialize the Udp port to communicate
bme.begin(); // inialize the bme680 sensor
delay(2000);
while (!Serial);
Serial.println(F("BME680 async test"));
if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}
// Check for Ethernet hardware
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet shield was not found. :(");
while (true) {
delay(1); // do nothing, no Ethernet hardware available
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("Ethernet cable disconnected.");
}
pinMode(4, OUTPUT); // disable SD SPI
digitalWrite(4, HIGH);
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
if (! bme.performReading()) {
Serial.println("Failed to perform reading :(");
return;
}
Temp_M1 = bme.readTemperature();
Humi_M1 = bme.readHumidity();
Gas_M1 = bme.readGas();
packetSize = Udp.parsePacket(); // read the packet size
if(packetSize>0) { // if packetSize is >0, means someone has sent something
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE); // read the packet into packetBufffer
String datreq(packetBuffer);
Serial.print("The datreq contains: ");
Serial.println (datreq);
if (datreq == "Temperature_M1") { // do following when Temperature_M1 is requested
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.print(Temp_M1);
Udp.endPacket();
Serial.print("Temp_M1= ");
Serial.println(Temp_M1);
Serial.println("");
memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}
if (datreq == "Humidity_M1") { // do following when Humidity_M1 is requested
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.print(Humi_M1);
Udp.endPacket();
Serial.print("Humi_M1= ");
Serial.println(Humi_M1);
Serial.println("");
memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}
if (datreq == "GasValue_M1") { // do following when Gas_M1 is requested
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.print(Gas_M1 / 1000);
Udp.endPacket();
Serial.print("Gas_M1= ");
Serial.println(Gas_M1 / 1000);
Serial.println("");
memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
}
}
}
[/code]
The code on the Mega, please see attachment, it only contains the code to communicate with one Uno.
(was a bit to big to add it as code)
The Mega send every 3s a ‘request’ to one of the three Uno’s for the Temperature or Humidity or GasValue, this always in the same order and start first with the Temperature.
The Mega receives these values but the value of the Temperature ends in the buffer of Humidity, the Humidity in the buffer of the GasValue and the GasValue in the buffer of the Temperature.
The Serial monitors in attachment makes it clear, the top line is the first line after opening the Serial monitor.
Now the Mega send every 3s a request, if we do this every 500ms it’s a complete mess at the Mega side, but an interval of 3s it fast enough and works fine.
As Noob it tokes me already a lot of time to reach this, but now I can’t make any progress.
Thanks for your help,
Uno1-030119.ino (4 KB)
Mega-030119.ino (4.31 KB)