Salve a tutti, scusate ma questa cosa non la capisco tramite un sensore adafruit AS7341 eseguo la lettura di un campione di colore, ottengo senza problemi le variabili.
A un certo punto ho la necessità di sommare tutti i valori.
Creo una variabile e con una semplice addizione sommo le variabili lette.
Dato che il risulato a occhio non mi convinceva ho spezzato in più variabili le operazioni e poi le ho sommate tra loro.
Ecco che ottengo il risultato giusto ma perchè?
il programma gira su un arduino mega2560.
questo è quello che esce dal monitor seriale:
Lettura da As7341
Violet 0-415nm : 2939
Blue 1-445nm : 5666
Cyan 2-480nm : 4414
Green 3-515nm : 24763
Yellow 6-555nm : 46877
Orange 7-590nm : 45255
Red 8-630nm : 34877
Darkred 9-680nm : 17162
sumAS7341: 50881
yota: 116417
come vedete sumAS7341 e yota non hanno gli stessi risultati ma nel codice....
unsigned long sumAS7341;
unsigned long alfa;
unsigned long beta;
unsigned long gamma;
unsigned long yota;
// nel loop/////
uint16_t readings[12];
if (!as7341.readAllChannels(readings)) {
Serial.println("Error reading all channels!");
return;
}
loadViolet = readings[0];
loadBlue = readings[1];
loadCyan = readings[2];
loadGreen = readings[3];
loadYellow = readings[6];
loadOrange = readings[7];
loadRed = readings[8];
loadDarkred = readings[9];
sumAS7341 = loadViolet + loadBlue + loadCyan + loadGreen + loadYellow + loadOrange + loadRed + loadDarkred;
alfa = loadViolet + loadBlue + loadCyan ;
beta = loadGreen + loadYellow + loadOrange;
gamma = loadRed + loadDarkred;
yota = alfa + beta + gamma;
Serial.print("sumAS7341: ");
Serial.println(sumAS7341);
Serial.println("yota: ");
Serial.println(yota);
Datman
July 23, 2023, 12:50am
2
Dove sono dichiarate le variabili loadXxxxx???...
Guarda caso, la somma è 181953; togliendo 65536 viene 116417 e togliendo ancora 65536 viene 50881...
alfa = (uint32_t) loadViolet+loadBlue+loadCyan;
...
le ho dichiarate all'inizio:
unsigned long sumAS7341;
unsigned long alfa;
unsigned long beta;
unsigned long gamma;
unsigned long yota;
uint16_t loadViolet, loadBlue, loadCyan, loadGreen, loadYellow, loadOrange, loadRed, loadDarkred, loadClear, loadNir;
ho provato anche nel loop:
uint16_t loadViolet = readings[0];
uint16_t loadBlue = readings[1];
uint16_t loadCyan = readings[2];
uint32_t sumAS7341=///la somma
//uguale non cambia
ho controllato il problema c'è quando sumAS7341 supera il valore di 65535, ma è dichiarata long e poi lo stesso problema dovrebbe averlo yota...
ditemi voi dove sbaglio...
questo è il monito seriale:
Lettura da As7341
Violet 0-415nm : 2864
Blue 1-445nm : 5584
Cyan 2-480nm : 4430
Green 3-515nm : 23792
Yellow 6-555nm : 45016
Orange 7-590nm : 43499
Red 8-630nm : 33786
Darkred 9-680nm : 16904
Clear : 65535
Nir : 5964
sumAS7341: 27899
alfa: 12878
beta: 46771
gamma: 50690
yota: 110339
questo il codice:
#include <SPI.h>
#include <Adafruit_AS7341.h>
const int enSW = 39; // Pin per il pulsante
const int LEDWHITE = 31; // Pin per il LED
Adafruit_AS7341 as7341;
unsigned long sumAS7341; // Dichiarata come variabile globale
unsigned long alfa;
unsigned long beta;
unsigned long gamma;
unsigned long yota;
unsigned int loadViolet ;
unsigned int loadBlue ;
unsigned int loadCyan ;
unsigned int loadGreen;
unsigned int loadYellow ;
unsigned int loadOrange;
unsigned int loadRed;
unsigned int loadDarkred;
unsigned int loadClear;
unsigned int loadNir;
void setup() {
Serial.begin(115200);
pinMode(enSW, INPUT_PULLUP);
pinMode(LEDWHITE, OUTPUT);
while (!Serial) {
delay(1);
}
// Inizializza il modulo AS7341
if (!as7341.begin()) {
Serial.println("Could not find AS7341");
while (1) {
delay(10);
}
}
as7341.setATIME(100);
as7341.setASTEP(999);
as7341.setGain(AS7341_GAIN_256X);
}
void loop() {
digitalWrite(LEDWHITE, HIGH);
delay(3000);
uint16_t readings[12];
if (!as7341.readAllChannels(readings)) {
Serial.println("Error reading all channels!");
return;
}
loadViolet = readings[0];
loadBlue = readings[1];
loadCyan = readings[2];
loadGreen = readings[3];
loadYellow = readings[6];
loadOrange = readings[7];
loadRed = readings[8];
loadDarkred = readings[9];
loadClear = readings[10];
loadNir = readings[11];
Serial.println(" ");
Serial.println(" ");
Serial.println("Lettura da As7341");
Serial.print("Violet 0-415nm : ");
Serial.println(loadViolet);
Serial.print("Blue 1-445nm : ");
Serial.println(loadBlue);
Serial.print("Cyan 2-480nm : ");
Serial.println(loadCyan);
Serial.print("Green 3-515nm : ");
Serial.println(loadGreen);
Serial.print("Yellow 6-555nm : ");
Serial.println(loadYellow);
Serial.print("Orange 7-590nm : ");
Serial.println(loadOrange);
Serial.print("Red 8-630nm : ");
Serial.println(loadRed);
Serial.print("Darkred 9-680nm : ");
Serial.println(loadDarkred);
Serial.print("Clear : ");
Serial.println(loadClear);
Serial.print("Nir : ");
Serial.println(loadNir);
Serial.println();
delay(1000);
digitalWrite(LEDWHITE, LOW);
delay(500);
// Calcoliamo la somma totale dei valori dei colori per la retta del sensore AS7341
sumAS7341 = loadViolet + loadBlue + loadCyan + loadGreen + loadYellow + loadOrange + loadRed;// + loadDarkred;
alfa = loadViolet + loadBlue + loadCyan ;
beta = loadGreen + loadYellow + loadOrange;
gamma = loadRed + loadDarkred;
yota = alfa + beta + gamma;
Serial.print("sumAS7341: ");
Serial.println(sumAS7341);
Serial.print("alfa: ");
Serial.println(alfa);
Serial.print("beta: ");
Serial.println(beta);
Serial.print("gamma: ");
Serial.println(gamma);
Serial.print("yota: ");
Serial.println(yota);
delay(10000);
}
La somma viene effettuata con variabili uint16_t, solo il risultato (sempre a 16 bit) viene messo nella variabile finale a 32 bit, quindi si perdono i 16 bit più significativi.
Bisogna forzare il compilatore ad eseguire la somma a 32 bit, castando almeno una delle variabili a 32 bit:
sumAS7341 = (uint32_t)loadViolet + loadBlue + ecc...
accidenti me lo aveva scritto anche datman, ma mi ero concentrato solo sulla parte dove mi chiedeva dove erano dichiarate le variabili....
ho provato funziona, chiedo venia ma credetemi ho passato ore e ore...
docdoc
July 24, 2023, 8:31am
7
Tranquillo, il cast implicito e quindi le operazioni intermedie sono una delle cose più insidiose
system
Closed
January 20, 2024, 8:31am
8
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.