[Risolto: basta ricordarsi di attivare il pull-up..] Tone() a volte non funziona

Ciao a tutti. Sapete per quale ragione Tone() possa non funzionare?

tone(7,1000,15); funziona.

if(suono==1) tone(7,1000,15); con suono=1 (int o byte) non funziona!
if(suono==1) tone(7,1000,15); delay(16); non funziona ugualmente.

Perché???

Inoltre, se scrivo
int suono=15;
tone(7,1000,suono);
il suono viene molto più lungo che scrivendo direttamente 15. Impiega tanto tempo per leggere la variabile???...

Inoltre, se metto la lettura della stringa in una funzione, non la legge... :frowning:

void leggePippo()
{
strcpy_P(Pippo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
}

Grazie
Gianluca

Datman:
int suono=15;
tone(7,1000,suono);
il suono viene molto più lungo che scrivendo direttamente 15. Impiega tanto tempo per leggere la variabile???...

Dal manuale: duration: the duration of the tone in milliseconds
cioè sei in grado di sentire un differenza rispetto a 15 millisecondi ? Quanto dura ?

Non fa la tone se c'e' if ? Mi pare strano. Forse meglio vedere tutto il codice.

Sì. La differenza è evidente: con 15mS fa un bip brevissimo, come un "tic". Inoltre sono in rapida successione, quindi rallentano tutto. E' una specie di roulette, che fa "tic-tic--tic----tic------tic". Avendo avuto problemi con l'if e con l'uso di una funzione, ho provato a mettere una variabile al posto del tempo, per disattivare i "tic" mettendo tempo zero.

Il "tic" lo chiamo Plip. Questa è una versione funzionante in cui ho eliminato la possibilità di ammutolire l'altoparlante, che mi serviva solo mentre modificavo il programma.
Sospetto che il PROGMEM provochi diverse criticità.

#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <avr/pgmspace.h>
LiquidCrystal lcd(8,9,10,11,12,13); // RS,EN,D4,D5,D6,D7
int x=0;
int z=0;
int zo=0;
int nSanti=0;
byte LD=0; // Numero del LED da accendere in SANTI.
// unsigned long t0=0; // Variabile per millis() per digitalRead(4).
// byte Suono=1; // Suono=1: Plip Sì.

const char Santo1[]  PROGMEM="Andrea";
const char Santo2[]  PROGMEM="Maria";
const char Santo3[]  PROGMEM="Carlo";
const char Santo4[]  PROGMEM="Antonella";
const char Santo5[]  PROGMEM="Antonio";
const char Santo6[]  PROGMEM="Giuseppe";
const char Santo7[]  PROGMEM="Alessandra";
const char Santo8[]  PROGMEM="Francesco";
const char Santo9[]  PROGMEM="Attilio";
const char Santo10[] PROGMEM="Chiara";
const char Santo11[] PROGMEM="Paola";
const char Santo12[] PROGMEM="Stefano";
const char Santo13[] PROGMEM="Filippo Neri";
const char Santo14[] PROGMEM="Matteo";
const char Santo15[] PROGMEM="Marco";
const char Santo16[] PROGMEM="Luca";
const char Santo17[] PROGMEM="Giovanni";
const char Santo18[] PROGMEM="Lucia";
const char Santo19[] PROGMEM="Cristina";
const char Santo20[] PROGMEM="Paolo";
const char Santo21[] PROGMEM="Antonello";
const char Santo22[] PROGMEM="Pio";
const char Santo23[] PROGMEM="Teresa";
const char Santo24[] PROGMEM="Giov. Paolo II";
const char Santo25[] PROGMEM="Fr.sca Cabrini";
const char Santo26[] PROGMEM="Federica";
const char Santo27[] PROGMEM="Sara";
const char Santo28[] PROGMEM="Simone";
const char Santo29[] PROGMEM="Francesca Rom.";
const char Santo30[] PROGMEM="Basilio";
const char Santo31[] PROGMEM="Bernardo";
const char Santo32[] PROGMEM="Agnese";
const char Santo33[] PROGMEM="Tommaso";
const char Santo34[] PROGMEM="Biagio";
const char Santo35[] PROGMEM="Girolamo";
const char Santo36[] PROGMEM="Gabriele";
const char Santo37[] PROGMEM="Costantino";
const char Santo38[] PROGMEM="Giorgio";
const char Santo39[] PROGMEM="Michele";
const char Santo40[] PROGMEM="Raffaele";
const char Santo41[] PROGMEM="LuigiM.Gr.deM.";
const char Santo42[] PROGMEM="Caterina";
const char Santo43[] PROGMEM="Atanasio";
const char Santo44[] PROGMEM="Giacomo";
const char Santo45[] PROGMEM="Ignazio";
const char Santo46[] PROGMEM="Pietro";
const char Santo47[] PROGMEM="Bernardo";
const char Santo48[] PROGMEM="Agostino";
const char Santo49[] PROGMEM="Giovannad'Arco";
const char Santo50[] PROGMEM="Maria Goretti";
const char Santo51[] PROGMEM="Camillo deLel.";
const char Santo52[] PROGMEM="Lorenzo";
const char Santo53[] PROGMEM="Gioacchino";
const char Santo54[] PROGMEM="Anna";
const char Santo55[] PROGMEM="Gaetano";
const char Santo56[] PROGMEM="Elena";
const char Santo57[] PROGMEM="Alfredo";
const char Santo58[] PROGMEM="Monica";
const char Santo59[] PROGMEM="Nicola da Tol.";
const char Santo60[] PROGMEM="Matteo";
const char Santo61[] PROGMEM="Maurizio";
const char Santo62[] PROGMEM="Cosma eDamiano";
const char Santo63[] PROGMEM="Tommaso";
const char Santo64[] PROGMEM="Cecilia";
const char Santo65[] PROGMEM="Crisogono";
const char Santo66[] PROGMEM="Francesco Sav.";
const char Santo67[] PROGMEM="Ambrogio";
const char Santo68[] PROGMEM="Rita da Cascia";
const char Santo69[] PROGMEM="Pietro e Paolo";
const char Santo70[] PROGMEM="";
const char Santo71[] PROGMEM="";
const char Santo72[] PROGMEM="";
const char Santo73[] PROGMEM="";
const char Santo74[] PROGMEM="";
const char Santo75[] PROGMEM="";
const char Santo76[] PROGMEM="";
const char Santo77[] PROGMEM="";
const char Santo78[] PROGMEM="";
const char Santo79[] PROGMEM="";
const char Santo80[] PROGMEM="";
const char Santo81[] PROGMEM="";
const char Santo82[] PROGMEM="";
const char Santo83[] PROGMEM="";
const char Santo84[] PROGMEM="";
const char Santo85[] PROGMEM="";
const char Santo86[] PROGMEM="";
const char Santo87[] PROGMEM="";
const char Santo88[] PROGMEM="";
const char Santo89[] PROGMEM="";
const char Santo90[] PROGMEM="";
const char Santo91[] PROGMEM="";
const char Santo92[] PROGMEM="";
const char Santo93[] PROGMEM="";
const char Santo94[] PROGMEM="";
const char Santo95[] PROGMEM="";
const char Santo96[] PROGMEM="";
const char Santo97[] PROGMEM="";
const char Santo98[] PROGMEM="";
const char Santo99[] PROGMEM="";
const char Santo100[] PROGMEM="";


PGM_P const Puntatore[] PROGMEM ={
Santo1, Santo2, Santo3, Santo4, Santo5, Santo6, Santo7, Santo8, Santo9,
Santo10, Santo11, Santo12, Santo13, Santo14, Santo15, Santo16, Santo17, Santo18, Santo19,
Santo20, Santo21, Santo22, Santo23, Santo24, Santo25, Santo26, Santo27, Santo28, Santo29,
Santo30, Santo31, Santo32, Santo33, Santo34, Santo35, Santo36, Santo37, Santo38, Santo39,
Santo40, Santo41, Santo42, Santo43, Santo44, Santo45, Santo46, Santo47, Santo48, Santo49,
Santo50, Santo51, Santo52, Santo53, Santo54, Santo55, Santo56, Santo57, Santo58, Santo59,
Santo60, Santo61, Santo62, Santo63, Santo64, Santo65, Santo66, Santo67, Santo68, Santo69,
Santo70, Santo71, Santo72, Santo73, Santo74, Santo75, Santo76, Santo77, Santo78, Santo79,
Santo80, Santo81, Santo82, Santo83, Santo84, Santo85, Santo86, Santo87, Santo88, Santo89,
Santo90, Santo91, Santo92, Santo93, Santo94, Santo95, Santo96, Santo97, Santo98, Santo99,
Santo100};
char Santo[25];  

void leggeSanto() {}

void setup()
{
pinMode(4,INPUT); // Interruttore suono Sì/No (1:Sì).
pinMode(5,INPUT); // Encoder - Pulsante.
pinMode(5,INPUT_PULLUP);
pinMode(7,OUTPUT);
pinMode(A0,OUTPUT);
digitalWrite(A0,0);
pinMode(A1,OUTPUT); // LED 1
pinMode(A2,OUTPUT); // LED 2
pinMode(A3,OUTPUT); // LED 3
pinMode(A4,OUTPUT); // LED 4
pinMode(A5,OUTPUT); // LED 5

lcd.begin(16,2);
lcd.clear(); lcd.print(F("   Estrattore"));
lcd.setCursor(0,1); lcd.print(F("    di Santi"));
tone(7,1000,15);
char Santo[]="Qualcosa";
z=1;
while(strlen(Santo)>0)
  {
  strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
  // lcd.setCursor(0,1); lcd.print(Santo);
  // delay(100);
  nSanti+=1; z+=1;
  }
  LD=1;
  SLED();
while(digitalRead(5)==0){delay(500);}
}

void loop()
{
// if(millis()-t0>499) // Due volte al secondo:
//   {t0=millis(); Suono=digitalRead(4);}
while(digitalRead(5)==1);
while(digitalRead(5)==0)
  {
  RND1:
  z=random(0,nSanti); // da 0 a nSanti-1, come gli elementi dell'array.
  if(z==zo) goto RND1;
  zo=z;
  strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
  tone(7,1000,15);
  lcd.clear(); lcd.print("S."); lcd.print(Santo);
  LD+=1; SLED();
  delay(60);
  }
  
LD=3;  
for(x=1; x<11; x++)
  {
  RND2:
  z=random(0,nSanti); // da 0 a nSanti-1, come gli elementi dell'array.
  if(z==zo) goto RND2;
  zo=z;
  strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
  tone(7,1000,15);
  lcd.clear(); lcd.print("S."); lcd.print(Santo);
  LD+=1; SLED();
  delay(60);
  }
  
randomSeed(millis());
for(x=0; x<6; x++)
  {
  RND3:
  z=random(0,nSanti); // da 0 a nSanti-1, come gli elementi dell'array.
  if(z==zo) goto RND3;
  zo=z;
  strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
  tone(7,1000,15);
  lcd.clear(); lcd.print("S."); lcd.print(Santo);
  LD+=1; SLED();
  delay(200+150*x);
  }

RND4:
z=random(0,nSanti); // da 0 a nSanti-1, come gli elementi dell'array.
if(z==zo) goto RND4;
zo=z;
strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
tone(7,1000,15);
lcd.clear(); lcd.print("S."); lcd.print(Santo);
LD+=1; SLED();
delay(1150);

RND5:
z=random(0,nSanti); // da 0 a nSanti-1, come gli elementi dell'array.
if(z==zo) goto RND5;
zo=z;
strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
tone(7,1000,15);
lcd.clear(); lcd.print("S."); lcd.print(Santo);
LD+=1; SLED();
delay(150);
lcd.clear();
delay(150);
lcd.print("S."); lcd.print(Santo);
delay(150);
lcd.clear();
delay(150);
lcd.print("S."); lcd.print(Santo);
delay(150);
lcd.clear();
delay(150);
lcd.print("S."); lcd.print(Santo);

LD=0;
while(digitalRead(5)==0) {delay(500);}
  
} // END loop



void SLED()
{
if(LD>5)LD%=5; if(LD==0)LD=5;
  //  LED 54321-              LED 54321-
PORTC&=B11000001|1<<LD; PORTC|=B00000000|1<<LD;
}

In quel codice dove c'e' una tone(7,1000,15);
se metti invece un if(suono==1) davanti e in globale suono a 1 non funziona ?

Sì.
N.B.: ho aggiunto qualcosa a quanto avevo scritto.
Sto usando IDE 1.8.5, ma ho fatto almeno una prova anche con l'1.8.2.

Per fare questo, dato che è un impiego temporaneo, sto usando il mio contatore Geiger: lo riprogrammo semplicemente. Purtroppo il Geiger occupa il 93% della memoria lasciando solo 2kB liberi, mentre questo occupa 5kB, altrimenti li avrei messi volentieri insieme selezionandoli all'accensione tramite pressione prolungata del pulsante.

Addirittura ho avuto problemi a usare l'interruttore di selezione della sonda Geiger su I/O 4 per attivare o disattivare il suono! Ho provato anche a scrivere:

if(millis()-t5>499) // Due volte al secondo controlla lo stato dell'interruttore:
{
t5=millis();
if ((PIND&0x10)>>4) suono=0;
}

ma funziona solo all'accensione

Avevo anche provato a scrivere una funzione:

void leggeSanto()
{
zo=z;
strcpy_P(Santo, (PGM_P)pgm_read_ptr(&(Puntatore[z])));
tone(7,1000,15);
lcd.clear(); lcd.print("S."); lcd.print(Santo);
LD+=1; SLED();
}

ma non funziona! Non gli piace quello strcopy ecc. in una funzione... :frowning:

Possibile che tutti quei caratteri scritti nell'area programma vadano a intralciare l'esecuzione di salti? Sembra proprio di sì... Probabilmente l'IDE quando calcola i salti non tiene conto dei caratteri non previsti.

Ho trovato il problema dell'impostazione del suono on/off: pensando di usare solo il pulsante dell'encoder, avevo impostato solo quell'ingresso e attivato solo quel pull-up; quando ho deciso di utilizzare anche l'interruttore, ho attivato anche quell'ingresso ma non ho pensato ad attivare anche il pull-up, perciò, con l'interruttore aperto, lo stato dell'ingresso non era definito!

Chiedo perdono...