Salve a tutti,
Sono alle primissime armi con la programmazione di arduino e durante i ritagli di tempo nelle ultime settimane ho tentato di creare un system monitor per il pc utilizzando un display monocromatico ST7565 con un pro micro attraverso l'uso delle librerie U8g2 e un software che fornisce i dati dal pc.
Con una certa difficoltà sono arrivato ad avere un codice funzionante, ma vorrei aggiungere una funzione che mi disegni un logo (che al momento è lo stesso della splashscreen settata nel setup) quando la scheda non riceve più dati dal pc dopo un tot di tempo.
Al momento il mio codice è questo
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_ST7565_64128N_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 8, /* data=*/ 9, /* cs=*/ 4, /* dc=*/ 7, /* reset=*/ 6);
#define nvidia_logo_width 128
#define nvidia_logo_height 64
static const unsigned char nvidia_logo[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0xE0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFF, 0x3F, 0xF0, 0xFF, 0xF0,
0x01, 0xCF, 0xE7, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x00, 0x07, 0x1F, 0xFE,
0x3F, 0xF0, 0xFF, 0xF1, 0x81, 0xCF, 0xE7, 0xFF, 0xC3, 0x07, 0xFC, 0x01,
0xC0, 0x03, 0x7F, 0xF8, 0x3F, 0xF0, 0xFF, 0xE3, 0x81, 0xCF, 0xE7, 0xFF,
0xC7, 0x07, 0xFE, 0x01, 0xE0, 0xF0, 0xF0, 0xF0, 0x3F, 0xF0, 0xFF, 0xE7,
0x83, 0xC7, 0xE7, 0xF3, 0xC7, 0x07, 0xFE, 0x03, 0x78, 0x78, 0xC0, 0xE1,
0x3F, 0xF0, 0xC0, 0xE7, 0x83, 0xC7, 0xE7, 0x81, 0xCF, 0x07, 0xDE, 0x03,
0x38, 0x0E, 0xC3, 0xE3, 0x3F, 0xF0, 0x80, 0xC7, 0xC3, 0xC7, 0xE7, 0x81,
0xCF, 0x07, 0xCF, 0x07, 0x38, 0x0E, 0xE7, 0xE1, 0x3F, 0xF0, 0x80, 0xC7,
0xC7, 0xC3, 0xE7, 0x01, 0xCF, 0x07, 0x8F, 0x07, 0x78, 0x0E, 0xFF, 0xF0,
0x3F, 0xF0, 0x80, 0xC7, 0xC7, 0xC3, 0xE7, 0x01, 0xCF, 0x87, 0x8F, 0x07,
0x70, 0x1C, 0x7F, 0x7C, 0x3E, 0xF0, 0x80, 0x87, 0xE7, 0xC3, 0xE7, 0x01,
0xCF, 0x87, 0x87, 0x0F, 0xE0, 0x38, 0x3F, 0x3E, 0x3C, 0xF0, 0x80, 0x87,
0xE7, 0xC1, 0xE7, 0x01, 0xCF, 0x87, 0x07, 0x0F, 0xE0, 0x79, 0x0F, 0x0F,
0x38, 0xF0, 0x80, 0x87, 0xEF, 0xC1, 0xE7, 0x81, 0xCF, 0xC7, 0xFF, 0x0F,
0xC0, 0xE3, 0xC0, 0x03, 0x3C, 0xF0, 0x80, 0x07, 0xFF, 0xC1, 0xE7, 0xC1,
0xCF, 0xC7, 0xFF, 0x1F, 0x80, 0x87, 0xF8, 0x01, 0x3F, 0xF0, 0x80, 0x07,
0xFF, 0xC0, 0xE7, 0xFF, 0xC7, 0xC7, 0xFF, 0x1F, 0x00, 0x0F, 0x7F, 0xC0,
0x3F, 0xF0, 0x80, 0x07, 0xFF, 0xC0, 0xE7, 0xFF, 0xC7, 0xE7, 0x01, 0x3E,
0x00, 0x7C, 0x07, 0xF8, 0x3F, 0xF0, 0x80, 0x07, 0xFE, 0xC0, 0xE7, 0xFF,
0xC1, 0xE7, 0x01, 0x3E, 0x00, 0xF0, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, };
char c;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
//u8g2.setBusClock(5000000);
u8g2.begin();
u8g2.clearBuffer();
u8g2.setDrawColor(0);
u8g2.setContrast(230);
u8g2.firstPage();
do {
u8g2.drawXBMP( 0, 0, nvidia_logo_width, nvidia_logo_height, nvidia_logo);
} while( u8g2.nextPage() );
// show splash screen for 2 seconds
delay(2000);
}
void loop()
{
// put your main code here, to run repeatedly:
String message0;
String cputemp;
String cpuload;
String gputemp;
String gpuload;
String ramused;
String ramavail;
String ramload;
String gpumemtot;
String gpumemused;
String gpumemload;
String gpufanload;
String gpufanrpm;
String gpupwr;
String cpuname;
String gpuname;
String gpucc;
String gpumc;
String gpusc;
String cpucc;
if (Serial.available() <= 0){
delay(400);
u8g2.firstPage();
u8g2.setFont(u8g2_font_5x7_tf);
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
u8g2.drawXBMP( 0, 0, nvidia_logo_width, nvidia_logo_height, nvidia_logo);
}
else if (Serial.available() > 0)
{
message0 = Serial.readString();; //total string
cputemp = message0.substring (2, 4); //cputemp without °c
// cputemp = message0.substring (2, 6); //cputemp with °c
cpuload = message0.substring (7, 10); //cpuload
gputemp = message0.substring (13, 16); //gputemp without °c
// gputemp = message0.substring (13, 18); //gputemp with °c
gpuload = message0.substring (19, 22); //gpuload
ramused = message0.substring (24, 28); //ram used without GB
// ramused = message0.substring (24, 30); //ram used with GB
ramavail = message0.substring (33, 37); //ram available without GB
// ramavail = message0.substring (33, 39); //ram available with GB
ramload = message0.substring (43, 46); //ramload
// gpumemtot = message0.substring (52, 55); //gpumem total without GB
gpumemtot = message0.substring (52, 57); //gpumem total with GB
gpumemused = message0.substring (61, 66); //gpumem used without GB
// gpumemused = message0.substring (61, 68); //gpumem used with GB
gpumemload = message0.substring (74, 77); //gpumem load
gpufanload = message0.substring (83, 87); //gpufan load
gpufanrpm = message0.substring (93, 97); //gpufan rpm
gpupwr = message0.substring (103, 108); //gpupower
// cpuname = message0.substring (118, 138); //cpu name with brand
// cpuname = message0.substring (124, 138); //cpu name without brand
cpuname = message0.substring (129, 138); //cpu name without brand and family
// gpuname = message0.substring (148, 172); //gpu name with brand
// gpuname = message0.substring (156, 172); //gpu name without brand
gpuname = message0.substring (164, 172); //gpu name without brand and family
gpucc = message0.substring (176, 181); //gpucore clock
gpumc = message0.substring (186, 190); //gpumem clock
gpusc = message0.substring (194, 202); //gpushader clock
cpucc = message0.substring (207, 211); //cpucore clock
// data loop
u8g2.firstPage();
do {
//---------------------------------background---------------------------//
u8g2.setDrawColor(1);
u8g2.drawBox(0, 0, 128, 64);
u8g2.setDrawColor(0);
u8g2.drawLine(64, 4, 64, 59);
u8g2.drawLine(60, 0, 64, 4);
u8g2.drawLine(64, 59, 69, 64);
u8g2.drawLine(0, 9, 128, 9);
u8g2.drawTriangle(128,0, 124,0, 128,4);
u8g2.drawTriangle(0,59, 0,64, 5,64);
/*
u8g2.drawLine(0, 32, 128, 32);
u8g2.drawLine(64, 0, 64, 64);
u8g2.drawLine(0, 16, 128, 16);
u8g2.drawLine(0, 48, 128, 48);
u8g2.drawLine(32, 0, 32, 64);
u8g2.drawLine(96, 0, 96, 64);
*/
//------------------------------------------------------------------//
// u8g2.setFont(u8g2_font_trixel_square_tr);
u8g2.setFont(u8g2_font_5x7_tf);
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
u8g2.setCursor(10,7);
u8g2.println(cpuname);
u8g2.setCursor(28,47);
u8g2.println(cpucc + "MHz");
u8g2.setCursor(1,47);
u8g2.println(cpuload);
u8g2.setCursor(76,7);
u8g2.println(gpuname);
u8g2.setCursor(87,47);
u8g2.println(gpucc + "MHz");
u8g2.setCursor(68,47);
u8g2.println(gpuload);
u8g2.setCursor(1,57);
u8g2.println(ramload);
u8g2.setCursor(68,57);
u8g2.println(gpumemload);
u8g2.setCursor(18,57);
u8g2.println(ramused + "/32GB");
u8g2.setCursor(82,57);
u8g2.println(gpumemused + "/4GB");
u8g2.setFont(u8g2_font_pixeloid20_tf);
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
u8g2.setCursor(13,36);
u8g2.println(cputemp);
u8g2.setCursor(65,36);
u8g2.println(gputemp);
u8g2.setFont(u8g2_font_pixeloid10_centig);
u8g2.setFontMode(0);
u8g2.setDrawColor(0);
u8g2.setCursor(54,25);
u8g2.println("°");
u8g2.setCursor(118,25);
u8g2.println("°");
} while ( u8g2.nextPage() );
}
}
Il codice si compila senza problemi, ma se non si ricevono più dati dal pc, il logo non viene disegnato.
Ho tentato diversi approcci come visto su alcuni esempi online, ma nonostante tutto l'ultima schermata che rimane sul display dopo la chiusura del software dal pc (e quindi il conseguente stop di dati sulla seriale), sono gli ultimi dati ricevuti.
Qualcuno saprebbe indicarmi dove sbaglio?