Go Down

Topic: Errore di array (??) (Read 1 time) previous topic - next topic

maubarzi

Metti il selettore in posizione n, lascialo fermo li, non toccarlo più, verifica con il multimetro tutte le tensioni, che siano corrette, poi verifica che i tuoi pin leggano correttamente, bastano delle Serial.print() per stamparti  i vari valori.
Verifica esattamente il valore di i quando fa la break per uscire.
In questo modo, a bocce ferme, puoi verificare sul software ogni singolo punto per vedere se arriva il valore atteso e puoi provare e riprovare finchè non ne esci, aggiungendo Serial.print() per visualizzare i valori delle variabili per avvicinarti al problema.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

enrico24

Utilizzato nuovo multimetro arrivato ieri, non funziona! pila scaduta?

Preso il vecchio!!

x maubarzi --> selettore in 'n'/ 0 sul pin, 4.90 sugli altri/ i sulla seriale // selettore in 'k'/ 0 sul pin, 4.90 sugli altri/ k sulla seriale; e così per le altre po,
x standardoil --> LED volante si accende.

Sulla seriale, dopo in for ottengo


1, 2, 3, 4, 5, 6, 7, 8, 9, i su n

e

1, 2, 3, 4, 5, 6, 7, 8, k su k

e via dicendo.

Perso sia proprio un problema legato al ciclo for ma non ho alcuna idea di come risolverlo.

Silente

Quindi quello che vuoi ottenere cosa sarebbe? Scusa, ma non lo ho capito
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

enrico24

Che selezionando la decima posizione compaia la lettera 'n' come sulla nona compare la 'k', sulla ottava la 'h' e via di seguito, e solo sulla dodicesima (non utilizzata) e sulla prima la 'i'.

In una prima fase avevo utilizzato dei numeri, che ho sostituito con le lettere per comodità.

Ciao
Enrico

maubarzi

#19
Jul 09, 2019, 11:58 pm Last Edit: Jul 09, 2019, 11:59 pm by maubarzi
posta il codice con le Serial.print e l'output esatto, perchè mi sa che ci stiamo continuando a perdere quel piccolo dettaglio che può farci arrivare alla soluzione.

Il selettore fisso sulla posizione incriminata, mi raccomando!
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

enrico24

Il codice (sia quello parziale, sia il completo) sono in prima pagina.

Il  problema, evidenziato da Guglielmo, è nel ciclo for e nelle definizione degli array (penso), ma proprio non riesco a venirne a capo.

Leggo tutte le posizioni del selettore ma NON la decima.

Mi sa che modificherò il programma con una serie di if e if else eliminando gli array, soluzione poco elegante ma che spero possa evidenziare l'errore.

Grazie comunque della disponibilità, domani vi farò sapere.

Enrico

Standardoil

#21
Jul 10, 2019, 07:09 am Last Edit: Jul 10, 2019, 07:13 am by Standardoil
No, dissento
il programma è pessimo, evidenzia alcuni problemi di teoria, l'uso di due array di differente dimensione è un'idea balzana, tutto vero,
MA
va, funziona, zoppica ma funziona
quindi?
quindi hai problemi HW, che non è difficile da ipotizzare
vuoi un esempio?
ti ho chiesto se hai dei led, ne hai messo 1 (UNO) apposta, adesso sappiamo che si 'accende'
ma siccome non hai messo lo schema (che ti avevo chiesto) e NON sai la differenza di tra input ed input pull-up, e NON hai messo dei led anche sugli altri pulsanti, NON sappiamo se 'accendere' è giusto o sbagliato, o magari ninfluente, perchè magari di nuovo hai collegato "male" gli input
ci sono altre maniere per fare quello che vuoi fare, mantenendo il selettore, intendo
ma te la puoi cavare facilmente, ad esempio sostituendo il programma con quello usato nell'altro caso, nella discussione di settimana scorsa, con quell'Hardware e quel Software andava, cambia solo uno dei due e vedi....
oppure fai così: usa l'indice del selettore per "generare ma non selezionare" (generato ma non creato, mi raccomando) la lettera da stampare:
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare:
// selettore a 10 posizioni ma con 11 uscite.........

// Sequenziale
const byte sequenziale [] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40}; //I pin a cui sono collegati
#define SIZESEQ sizeof(sequenziale)/sizeof(sequenziale[0]) //Il numero di posizioni presenti, fai BEN caso a cole lo ho fatto io


char nr6 = 'k';
// sembra che tu abbia qualche difficoltà nell'ordine alafabetico, la undicesima lettera è k, non i
// che poi non serve nemmeno inizializzarla, ma tantè...

void setup()
{
    for (byte i = 0; i < SIZESEQ ; i++)
    {
        pinMode(sequenziale[i], INPUT);
    }

    Serial.begin(9600);
}

void loop()
{
    nr6 = 'a' + SIZESEQ + 1;
    // qui va re-settata, non all'inizio
    // cerca di capire perchè la calcolo così

    // controlla la posizione dell'interruttore sequenziale
    for (byte i = 0; i < SIZESEQ; i++)
    {
        if (!digitalRead(sequenziale[i]))
        {
            nr6 = 'a' + i; // solo se sente il pulsante aggiorna la variabile
            break; // e ti devi ben "grattare" la rogna di input, input pull_up, alto, basso comune al + o a gnd
            // quelle cose si definiscono prima, mentre fai lo schema, e non te lo dico più
        }
    }

    Serial.println(nr6);
    delay(1000);
}




che NON passa per array inutili, e quindi li non ci possono essere errori di array........
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

maubarzi

#22
Jul 10, 2019, 07:50 am Last Edit: Jul 10, 2019, 07:50 am by maubarzi
Il codice (sia quello parziale, sia il completo) sono in prima pagina.
Capisco... quindi non è possibile verificare i tuoi test per scoprire le 8 piccole differenze che magari causano il problema... pecà!
Mi arrendo pure io...
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

enrico24

#23
Jul 10, 2019, 10:49 am Last Edit: Jul 10, 2019, 10:52 am by enrico24
Ora funziona tutto, grazie ai vari suggerimenti, prove da fare, ecc. di tutti voi che siete stati molto pazienti e disponibili.

Dovevo accorgermene prima!!! quando maubarzi mi ha detto di controllare le tensioni e quando standardoil mi ha chiesto di inserire un LED.

Come? semplicemente spostando l'attacco del PIN 40 tra il selettore (al GND) ed il resistore (collegato al positivo).

Allego il frammento del programma(l'alfabeto l'ho utilizzato a caso ed ho "saltato" la 'i' -messa dopo- ma ho sostituito la n con la j) che funziona, voglio poi comunque provare i suggerimenti di standardoil appena sarò meno pressato dall'urgenza (domenica dovremmo utilizzare il programma) ed allego lo schema.

Code: [Select]


// Sequenziale
#define SIZESEQ 10 //Il numero di posizioni presenti
const byte sequenziale [SIZESEQ] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40}; //I pin a cui sono collegati
const char significato [SIZESEQ +1] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'j', 'i'}; //L'insieme dei valori da trasmettere

char nr6 = 'i'; // recupero da 1 a 10

void setup() {

  for (byte i = 0; i <= SIZESEQ ; i++)
  {
    pinMode (sequenziale[i], INPUT_PULLUP);
  }

  Serial.begin(9600);
}

void loop() {
  // controlla la posizione dell'interruttore sequenziale
  byte i;
  for (i = 0; i < SIZESEQ; i++)//I va da 0 a 10
  {
    Serial.println(i);
  
    if (digitalRead (sequenziale[i]) == 0) //
      break;//Ma si ferma se sento pulsante
  }
  
  nr6 = significato[i];

  Serial.println (significato[i]);
  Serial.println(nr6);
  delay(1000);
}




Ancora grazie a tutti che mi permettete d'imparare cose nuove (per me!)

Saluti

Enrico

Standardoil

#24
Jul 10, 2019, 10:58 am Last Edit: Jul 10, 2019, 10:59 am by Standardoil
.
.
.

Come? semplicemente spostando l'attacco del PIN 40 tra il selettore (al GND) ed il resistore (collegato al positivo).
.
.
.


Code: [Select]

.
.

  for (i = 0; i < SIZESEQ; i++)//I va da 0 a 10


.
.




cioè: tu hai collegato 'differente' solo il pin 40 e "non" ti è venuto in mente che la causa "poteva" essere quella?
Te lo abbiamo dovuto dire in 2 di fare le misure (e tre volte, perché io avevo anche chiesto lo schema) perché ti sfiorasse l'idea?
E in tutto questo "non" hai nemmeno messo a posto i commenti sbagliati?
Sono basito
Mi aspetto almeno tanti karma quante volte ti ho detto cosa fare..

Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

enrico24

D'accordo, d'accordo… mi sto cospargendo il capo di cenere….

Il commento l'ho corretto solo sul file completo, dove ho anche tolto i serial print che mi servivano di controllo.

Sempre per comodità non ho ancora variato gli "attacchi" degli altri PIN come da tua indicazione precedente, è mia intenzione rifare il modulino dei resistori con i collegamenti corretti, devo ancora implementare la posizione 11, devo fare lo schema dei riceventi, ecc. tutte cose che mi sono promesso fi fare nei prossimi mesi.

Devo inoltre studiami i vari pullup (esiste anche il pulldown?) per il quale non ho ancora trovato spiegazioni comprensibili (in italiano possibilmente spiegato agli ignoranti), ecc.

Saluti

Enrico

docdoc

Come? semplicemente spostando l'attacco del PIN 40 tra il selettore (al GND) ed il resistore (collegato al positivo).
...ed allego lo schema.
Scusa se lo dico, ma quello che scrivi è sempre tutto abbastanza confuso e poco coerente, devi essere più rigoroso sia quando programmi sia quando "spieghi" le cose...

Guardando bene quest'ultimo circuito, ma ti sei accorto che hai 10 pin e SOLO NOVE LED?

Il pin 40 non avendo il LED resta SEMPRE AL POSITIVO quindi sarà sempre HIGH!! Per questo ti "funziona" se lo metti sopra alla resistenza (che a questo punto è inutile perché fa da "pull-up)!!!

O metti un decimo LED anche a quel pin, configurandolo ESATTAMENTE come gli altri, oppure se su quel pin non ti interessa il LED puoi tranquillamente togliere quell'inutile resistenza.

Quote
Allego il frammento del programma(l'alfabeto l'ho utilizzato a caso ed ho "saltato" la 'i' -messa dopo- ma ho sostituito la n con la j) che funziona
No, quando fai delle prove devi sempre postare il codice ESATTO che hai usato per ottenere gli esiti che descrivi! Se cambi qualcosa, ci impedisci anche di verificare il tuo codice se a noi funziona!

Quote
Devo inoltre studiami i vari pullup (esiste anche il pulldown?)
Certo che esiste, si realizza con una resistenza tra pin e GND (scusa ma i miei messaggi li leggi? Fin dall'inizio ti scrissi come configurare il singolo pin con la sua resistenza di pulldown ed il suo led, anche con tanto di schema...).
Non c'è pulldown interno però, solo pullup (che si realizza con pinMode impsotato INPUT_PULLUP).
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Standardoil

eeeehhhh....
di stranezze non c'è solo quella
ogni cosa che lo OP ha detto è come minimo dubbia
a partire dal fatto che ha detto (vedasi post 14) che i LED NON c'erano.....
anche le misure che ha fatto al multimetro sono un po' dubbie
dato che misurava 5 Volt, ma nel progamma fa un test ==0.........
questo è un ottimo esempio di "confusione", che fa sempre male
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

enrico24

Accetto tutte le critiche, ma ..

Quote
a partire dal fatto che ha detto (vedasi post 14) che i LED NON c'erano..
nel post in oggetto intendevo che solo sulla specifica posizione (corrispondente alla pos. 10 / PIN 40) non vi era alcun LED.

Sempre relativamente alla posizione incriminata la lettura del multimetro era ca. 5 V a valle del resistore (parte verso il positivo) ed 0 a monte (parte verso il GND) quando la posizione non era selezionata.

Il decimo LED non era previsto ed, al momento non ho ancora deciso se e dove metterlo: il programma funziona anche senza LED.

Quote
No, quando fai delle prove devi sempre postare il codice ESATTO che hai usato per ottenere gli esiti che descrivi! Se cambi qualcosa, ci impedisci anche di verificare il tuo codice se a noi funziona!
Scusa non pensavo che la definizione di una variabile che deve venir solamente stampata e non ha, in questo caso, alcun effetto sullo svolgimento del programma, facesse differenza, recepito e spero di non ripetermi.

Quote
Certo che esiste, si realizza con una resistenza tra pin e GND (scusa ma i miei messaggi li leggi? Fin dall'inizio ti scrissi come configurare il singolo pin con la sua resistenza di pulldown ed il suo led, anche con tanto di schema...).
Ho apprezzato lo schema, ma l'ho ritenuto troppo complicato per inserirlo in questo momento per questioni di tempo e visto che come l'avevo fatto funzionava. E' comunque mia intnzione modificare, prossimamente, tutto il progetto approfittando dei vostri consigli.

Un'ultima cosa, quanto sono riuscito a fare l'ho fatto tentando e ritentando andando più sul pratico che sul teorico (dove le mie lacune sono infinite) con la logica il LED si accende bene proviamo a spegnerlo.

Saluti ed ancora grazie della comprensione.

Enrico

Standardoil

#29
Jul 10, 2019, 09:38 pm Last Edit: Jul 10, 2019, 09:48 pm by Standardoil
Ho apprezzato lo schema, ma l'ho ritenuto troppo complicato per inserirlo in questo momento per questioni di tempo e visto che come l'avevo fatto funzionava.
come vedi per risparmiare tempo ne hai perso, e ne hai fatto perdere
succede sempre così.....


a proposito: cosa non era chiaro qui?
Il led e la sua resistenza già fanno da pull-down. Avete mai visto led scollegati che lampeggiano da soli causa disturbi?
e qui?
Dove trovi lo spazio?
A parte che secondo me non ti servono, quelle resistenze, ma le puoi collegare dritte in parallelo al led, dopo la resistenza di limitazione del led
dicevo: cosa non era chiaro nel fatto che "almeno" il LED è necessario?
poi docdoc dice che serve anche una resistenza, ma non entro più nel merito di quello che dice lui
ma se ti prendi la briga di NON fare quello che ti consigliamo, almeno avvisaci
o meglio:
se ti prendi la briga di NON fare quello che ti consigliaNo. almeno avvisaLi


e buon viaggio..........
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Go Up