venerdì 20 giugno 2025

NanoProtoBuf Esp32 IDF

Su Esp32 (e piu' in generale sui microcontrollori) la libreria Protobuf non puo' funzionare e quindi si deve usare nanopb (nano proto buffer)  https://github.com/nanopb/nanopb

Il seguente progetto e' stato creato usando il plugin Esp-Idf di VSCode

Per utilizzarla si deve prima installare il compilare protoc e poi scaricare e compilare il pacchetto nanopb da GitHub ...questo servira' come plugin per protoc

Si procede  quindi con il seguente comando che genera i file sensor.pb.c e sensor.pb.h dove sono inserite le classi per la lettura scrittura del file sensor.proto. questi due file sono da inserire nella main del progetto mentre i file pb_common.c pb_common.h pb_decode.c pb_decode.h pc_encode.c e pb_encode.h si inseriscono nel folder nanopb all'interno del folder main  

protoc --plugin=protoc-gen-nanopb=/home/luca/nanopb/generator/protoc-gen-nanopb --nanopb_out=./ --proto_path=/home/luca/nanopb/generator/proto sensor.proto

sensor.proto

syntax = "proto3";

message SensorData {
int32 id = 1;
float temperature = 2;
float humidity = 3;
}

Si modifica quindi il file CMakeLists.txt per puntare i nuovi file

idf_component_register(
SRCS
"main.c"
"sensor.pb.c"
"nanopb/pb_encode.c"
"nanopb/pb_decode.c"
"nanopb/pb_common.c"
INCLUDE_DIRS
"."
"nanopb"
)

e si puo' compilare questo semplice programma di esempio sull'utilizzo di nanopb 

#include <stdio.h>

#include "sensor.pb.h"
#include "pb_encode.h"
#include "pb_decode.h"

#include "driver/uart.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main(void)
{
const uart_config_t uart_config = {
.baud_rate = 115200,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
};



uart_driver_install(UART_NUM_0, 1024, 0, 0, NULL, 0);
uart_param_config(UART_NUM_0, &uart_config);

const char *msg = "Hello from UART0 via USB!\n";
uart_write_bytes(UART_NUM_0, msg, strlen(msg));


vTaskDelay(pdMS_TO_TICKS(3000));
printf("USB CDC active\n");

vTaskDelay(pdMS_TO_TICKS(500)); // Delay to let USB CDC connect


uint8_t buffer[128];
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));

SensorData da = SensorData_init_zero;
da.id = 42;
da.temperature = 23.5;
da.humidity = 55.2;

if (pb_encode(&stream, SensorData_fields, &da)) {
size_t message_length = stream.bytes_written;
// Send buffer over serial, BLE, etc.
} else {
//Serial.println("Encoding failed!");
}

size_t message_length = stream.bytes_written;

SensorData da_r = SensorData_init_zero;
//int received_length = 0;
pb_istream_t str = pb_istream_from_buffer(buffer, message_length);

while(1){
if (pb_decode(&str, SensorData_fields, &da_r)) {
char str_out[32];
snprintf(str_out, sizeof(str_out), "%.2f\n", da_r.humidity);
uart_write_bytes(UART_NUM_0, str_out, strlen(str_out));
printf("Temp: %.2f, Humidity: %.2f\n",da_r.temperature, da_r.humidity);
} else {
uart_write_bytes(UART_NUM_0, "Decoding error\n", strlen("Decoding error\n"));
printf("Error decoding\n");
}

vTaskDelay(pdMS_TO_TICKS(1000));}

}

 

 

 

mercoledì 11 giugno 2025

CrowdLed

Ad un torneo di pallavolo a mia figlia hanno regalato un braccialetto...ad occhio visto la presenza della batteria e di un pulsante, sembrava  qualcosa di luminoso...tranne per il fatto che non si notava nessun segno di vita (le batterie sono cariche)

 

 

 
 
 

Frugando su internet ho trovato che il braccialetto viene di solito distribuito agli spettatori di concerti ed e' radio controllato

Sono stati fatti alcuni reverse engineering..peccato che il mio sia gruppo 4

https://github.com/gabry99018/Flipper-Zero-CrowdLED-Wristbands/tree/main

https://forum.flipper.net/t/new-device-protocol-crowd-led-and-dmx/6571/12



 

 

 

 

 

 

 

ESP32-4848S040CIY1

Dopo CYW ho preso il modello superiore (che per costo, visto il case gia' presente e' decisamente da preferire) ESP32-4848S040CIY1 che monta un ESP32-S3

Interessante la presenza dei relay per usare il display come interruttore ma non ho ancora chiaro se siano a 130V (americani) o 220V(europei) 

https://github.com/rzeldent/esp32-smartdisplay-demo 

https://github.com/sand1812/ESP32-4848S040
 

Entrambe gli esempi usano LVGL 9.x quindi non e' possibile usare SquareLine

L'unica difficolta' e' settare il path di lv_conf.h 

ho modificato il file lv_conf_internal.h per puntare al file lv_conf.h

 

/* If lv_conf.h is not skipped, include it. */
#if !defined(LV_CONF_SKIP) || defined(LV_CONF_PATH)
#ifdef LV_CONF_PATH /* If there is a path defined for lv_conf.h, use it */
//#include LV_CONF_PATH
#include "../lv_conf.h" /* Note: Make sure to define custom CONF_PATH as a string */
#elif defined(LV_CONF_INCLUDE_SIMPLE) /* Or simply include lv_conf.h is enabled. */
#include "lv_conf.h"
#else
#include "../../lv_conf.h" /* Else assume lv_conf.h is next to the lvgl folder. */
#endif
#if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK)
/* #include will sometimes silently fail when __has_include is used */
/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */
#pragma messag

 

lunedì 9 giugno 2025

M5 Dial LVGL e Platformio

Per compilare i progetti M5Dial con Platformio si scaricano gli esempi da https://github.com/mzyy94/M5Dial-LVGL

 


 

Da dentro Platformio si apre il folder del progetto in examples/dial_number e si effettua la build

Un dettaglio .. il pulsante di reset e' nascosto dietro l'adesivo

 



 

T-Dongle S3 ed IDF 5

Ho ripreso in mano il T-Dongle S3 di Lilygo ed i progetti IDF che sono presenti sul github ufficiale non funzionano piu' perche' la libreria LovyanGFX non risulta compatibile con IDF 5.x (il codice e' stato scritto per una versione precedente di IDF)


 

Ho provato a correggere ma alla fine ho preso un docker IDF 4.4 ed ho usato questo per compilare il progetto 

Importante: per mettere in modalita' programmazione la scheda si deve premere il pulsante e poi inserire la scheda nella porta USB.  Per avviare lo sketch la scheda deve essere rimossa e poi inserita

sudo apt update
sudo apt install docker.io
sudo systemctl enable docker --now
sudo usermod -aG docker $USER
newgrp docker

 

docker pull espressif/idf:release-v4.4

docker run --rm -it   --device=/dev/ttyACM0   -v ~/T-Dongle-S3:/project   -w /project   espressif/idf:release-v4.4 

 

 idf.py set-target esp32s3

 idf.py build

 

 

 

Analisi MNF su spettri di riflettanza di plastica

Devo cerca di lavorare su spettri di riflettanza di plastica e la prima domanda e': quale sono le bande significative? Sono partito dal ...