I am using the following code to display characters on P10 LED but what is happening is sometimes the code hangs or sometimes it shows random characters. I have with serial monitor that the socket is being received perfectly.
include
include
include
include
include "SystemFont5x7.h"
include "Arial_black_16.h"
include
// Fire up the DMD library as dmd
define BELT_ID "TLM-1"
IPAddress ip(192, 168, 69, 170); // Static IP address
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAA}; // MAC address of your Arduino
int serverPort = 1234; // Port number of the server
int index_of_delimiter;
int resultantCharSize = 0;
int vehicleDesctiptionCharSize = 0;
unsigned long previousPingTime = 0;
const unsigned long pingInterval = 5000; // 5 seconds in milliseconds
unsigned long currentMillis;
int bytesRead = 0;
IPAddress serverIP(192, 168, 69, 150); // IP address of the server
IPAddress gateway(192, 168, 69, 1); // Gateway IP address
IPAddress subnet(255, 255, 255, 0); // Subnet mask
EthernetClient client;
/--------------------------------------------------------------------------------------
Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets
called at the period set in Timer1.initialize();
--------------------------------------------------------------------------------------/
void ScanDMD()
{
dmd.scanDisplayBySPI();
}
int getFreeMemory() {
extern int heap_start, *brkval;
int v;
return (int)&v - (brkval == 0 ? (int)&__heap_start : (int)brkval);
}
Serial.println("Connecting to server...");
// Connect to the server
connectToServer();
// initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
Timer1.initialize(5000); // period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
Timer1.attachInterrupt(ScanDMD); // attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
// clear/init the DMD pixels held in RAM
dmd.clearScreen(false);
delay(5000);
dmd.clearScreen(true); // true is normal (all pixels off), false is negative (all pixels on)
}
currentMillis = millis();
if (client.connected())
{
// Client is connected
if (client.available())
{
previousPingTime = currentMillis; // Update the last ping time
// Read the data from the server until a . character is encountered
receivedData = client.readStringUntil('.');
receivedData.toCharArray(receivedDataChar, receivedData.length() + 1);
// Split the string
char *token = strtok(receivedDataChar, &delimiter);
while (token != NULL)
{
if (token[0] == 'b')
{
belt_ids = String(token).substring(2);
belt_ids.toUpperCase();
index_of_delimiter = belt_ids.indexOf(',');
belt_id_1=belt_ids.substring(0, index_of_delimiter);
belt_id_2=belt_ids.substring(index_of_delimiter+1);
if(belt_id_1!=BELT_ID && belt_id_2!=BELT_ID){
break;
}
}
if (token[0] == 'c' && strncmp(token, "clear", sizeof("clear") - 1) == 0){
is_screen_cleared = true;
}
if (token[0] == 'c')
{
is_screen_value_updated = true;
count = String(token).substring(2);
}
else if (token[0] == 'l')
{
is_screen_value_updated = true;
bag_limit = String(token).substring(2);
}
else
{
is_screen_value_updated = true;
vehicle_desctiption = String(token).substring(2);
vehicle_desctiption.toUpperCase();
}
// Get the next token
token = strtok(NULL, &delimiter);
}
}
// Check for server responsiveness every pingInterval milliseconds
if (currentMillis - previousPingTime >= pingInterval) {
previousPingTime = currentMillis; // Update the last ping time
if (!pingServer()) {
// Server not responsive, handle disconnection
client.stop(); // Disconnect the client
}
}
}
else
{
// Client is disconnected
Serial.println("Server disconnected!");
// Attempt to reconnect to the server
connectToServer();
}
delay(100);
}
void connectToServer()
{
Serial.println("Connecting to server...");
// Connect to the server
if (client.connect(serverIP, serverPort))
{
Serial.println("Connected!");
}
else
{
Serial.println("Connection failed!");
// Retry connection after a delay
delay(1000);
}
}
bool pingServer() {
client.print("PING\n"); // Send a ping request
delay(100); // Wait for a response
bytesRead = 0;
while (client.available() && bytesRead < sizeof(response)) {
response[bytesRead++] = client.read();
}
response[bytesRead] = '\0'; // Null-terminate the response array
return strcmp(response, "PONG") == 0; // Check if response is as expected
}
I am using the following code to display characters on P10 LED but what is happening is sometimes the code hangs or sometimes it shows random characters. I have with serial monitor that the socket is being received perfectly.
include
include
include
include
include "SystemFont5x7.h"
include "Arial_black_16.h"
include
// Fire up the DMD library as dmd
define BELT_ID "TLM-1"
IPAddress ip(192, 168, 69, 170); // Static IP address byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAA}; // MAC address of your Arduino
define DISPLAYS_ACROSS 2
define DISPLAYS_DOWN 2
define MAX_CHAR_ARRAY_SIZE 100
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
String belt_ids; String belt_id_1; String belt_id_2; String count; String bag_limit; String vehicle_desctiption; String receivedData; String resultant;
char delimiter = '/'; char response[5]; char resultantChar[MAX_CHAR_ARRAY_SIZE]; char vehicleDesctiptionChar[MAX_CHAR_ARRAY_SIZE]; char receivedDataChar[MAX_CHAR_ARRAY_SIZE];
bool is_screen_value_updated = false; bool is_screen_cleared = false;
int serverPort = 1234; // Port number of the server int index_of_delimiter; int resultantCharSize = 0; int vehicleDesctiptionCharSize = 0; unsigned long previousPingTime = 0; const unsigned long pingInterval = 5000; // 5 seconds in milliseconds unsigned long currentMillis;
int bytesRead = 0;
IPAddress serverIP(192, 168, 69, 150); // IP address of the server IPAddress gateway(192, 168, 69, 1); // Gateway IP address IPAddress subnet(255, 255, 255, 0); // Subnet mask
EthernetClient client;
/-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------/ void ScanDMD() { dmd.scanDisplayBySPI(); }
int getFreeMemory() { extern int heap_start, *brkval; int v; return (int)&v - (brkval == 0 ? (int)&__heap_start : (int)brkval); }
void setup() { Serial.begin(9600);
// Initialize Ethernet library // Ethernet.begin(mac); Ethernet.begin(mac, ip, gateway, gateway, subnet);
// Wait for Ethernet to be initialized delay(1000);
Serial.print("IP Address: "); Serial.println(Ethernet.localIP());
Serial.println("Connecting to server..."); // Connect to the server connectToServer();
// initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize(5000); // period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt(ScanDMD); // attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
// clear/init the DMD pixels held in RAM dmd.clearScreen(false); delay(5000); dmd.clearScreen(true); // true is normal (all pixels off), false is negative (all pixels on)
dmd.drawBox(0, 0, (32 DISPLAYS_ACROSS) - 1, (16 DISPLAYS_DOWN) - 1, GRAPHICS_NORMAL); dmd.selectFont(SystemFont5x7); }
void loop() { int freeMem = getFreeMemory();
Serial.print("Free Memory: "); Serial.print(freeMem); Serial.println(" bytes");
if (is_screen_value_updated) { dmd.selectFont(SystemFont5x7); resultant = count + "/" + bag_limit; resultantCharSize = resultant.length() + 1; resultant.toCharArray(resultantChar, resultantCharSize); dmd.drawString(5, 2, resultantChar, resultantCharSize, GRAPHICS_NORMAL);
} if(is_screen_cleared){ dmd.clearScreen(true); // true is normal (all pixels off), false is negative (all pixels on)
} currentMillis = millis(); if (client.connected()) { // Client is connected if (client.available()) { previousPingTime = currentMillis; // Update the last ping time // Read the data from the server until a . character is encountered receivedData = client.readStringUntil('.'); receivedData.toCharArray(receivedDataChar, receivedData.length() + 1);
} else { // Client is disconnected Serial.println("Server disconnected!");
} delay(100); }
void connectToServer() { Serial.println("Connecting to server..."); // Connect to the server if (client.connect(serverIP, serverPort)) { Serial.println("Connected!"); } else { Serial.println("Connection failed!"); // Retry connection after a delay delay(1000); } }
bool pingServer() { client.print("PING\n"); // Send a ping request delay(100); // Wait for a response
bytesRead = 0;
while (client.available() && bytesRead < sizeof(response)) { response[bytesRead++] = client.read(); } response[bytesRead] = '\0'; // Null-terminate the response array return strcmp(response, "PONG") == 0; // Check if response is as expected }
Can you please enlighten me on the issue