I have been given a University assignment where I need to be able to send data via UART between an ESP32 (specifically LilyGo T-Display) and an Arduino Uno.
I connect both boards using a level shifter, and the ESP RX is using pin 21, and TX 22.
When I use the below code for each board, there are no compilation issues. If I disconnect the ESP32 from power supply, the Arduino sends it's serial output to my serial monitor correctly, and when I connect the ESP to power, it stops (I assume it's trying to send it to the ESP now). The ESP then outputs to my serial monitor the output messages with the initial 0 values constantly.
I don't have much experience with Arduino programming, and I am confused as to why this isn't working. Any help is appreciated.
packet_data.h:
#ifndef PACKET_DATA_H
#define PACKET_DATA_H
typedef struct Data{
String ph;
String temp;
String rpm;
} Data;
#endif
ESP32 code:
#include "packet_data.h"
#define MONITOR_BAUD_RATE 115200
#define UART_BAUD_RATE 9600
#define RX 21
#define TX 22
Data current_bioreactor_data;
Data current_target_data;
void start_serial()
{
Serial.end();
Serial.begin(MONITOR_BAUD_RATE);
// Waits for the serial connection to be secured.
while (!Serial);
// Adds initial delay so the serial monitor will receive any messages (change as needed).
delay(1000);
}
void uart_setup()
{
Serial1.begin(UART_BAUD_RATE, SERIAL_8N1, TX, RX);
current_target_data.ph = String(0);
current_target_data.temp = String(0);
current_target_data.rpm = String(0);
current_bioreactor_data.ph = String(0);
current_bioreactor_data.temp = String(0);
current_bioreactor_data.rpm = String(0);
Serial.println("UART serial setup successful.");
}
void send_uart_data()
{
String message = current_target_data.ph + "," + current_target_data.temp + "," + current_target_data.rpm;
Serial1.println(message);
}
void read_uart_data()
{
if (Serial1.available() > 0)
{
current_bioreactor_data.ph = Serial1.readStringUntil(',');
current_bioreactor_data.temp = Serial1.readStringUntil(',');
current_bioreactor_data.rpm = Serial1.readStringUntil('\n');
}
}
void setup()
{
start_serial();
uart_setup();
Serial.println("Setup successful.");
delay(3000);
}
void loop()
{
read_uart_data();
send_uart_data();
// Testing.
Serial.println("pH: " + current_bioreactor_data.ph);
Serial.println("Temp: " + current_bioreactor_data.temp);
Serial.println("RPM: " + current_bioreactor_data.rpm);
delay(10);
}
Arduino Uno code:
#include "packet_data.h"
#define UART_BAUD_RATE 9600
#define RX 0
#define TX 1
Data current_bioreactor_data;
Data current_target_data;
void uart_setup()
{
Serial.begin(UART_BAUD_RATE, SERIAL_8N1);
current_target_data.ph = String(0);
current_target_data.temp = String(0);
current_target_data.rpm = String(0);
current_bioreactor_data.ph = String(0);
current_bioreactor_data.temp = String(0);
current_bioreactor_data.rpm = String(0);
}
void send_uart_data()
{
String message = current_bioreactor_data.ph + "," + current_bioreactor_data.temp + "," + current_bioreactor_data.rpm;
message = "5.5,23.5,690"; // Testing.
Serial.println(message);
}
void read_uart_data()
{
if (Serial.available() > 0)
{
current_target_data.ph = Serial.readStringUntil(',');
current_target_data.temp = Serial.readStringUntil(',');
current_target_data.rpm = Serial.readStringUntil('\n');
}
}
float get_target_ph()
{
return current_target_data.ph.toFloat();
}
float get_target_temp()
{
return current_target_data.temp.toFloat();
}
int get_target_rpm()
{
return current_target_data.rpm.toInt();
}
void setup()
{
uart_setup();
}
void loop()
{
read_uart_data();
send_uart_data();
}