Problema con modulo card sd

Ho un problema con un modulo micro card sd. Praticamente Avevo intenzione di riprodurre un file della scheda sd attraverso un comando che invio da un'altro arduino. Ho scritto il programma prendendo spunto da esempi e alla fine l'ho provato. Il programma è questo:

#include <SD.h>             // includi la libreria SD per la gestione della scheda
#define SD_ChipSelectPin 10  // utilizza il pin 10 per collegare il CS della SD, puoi usare il pin che vuoi
#include <TMRpcm.h>         // includi la libreria TMRpcm per la musica!
#include <SPI.h>            // includi la libreria SPI per la comunicazione con la SD

int PIN=7;

TMRpcm tmrpcm;   // crea l'oggetto tmrpcm

unsigned long time = 0;

void setup() {
  
  pinMode(PIN,INPUT);
  tmrpcm.speakerPin = 9; // pin utilizzabili 5,6,11 o 46 sulla Mega, 9 sulla Uno, Nano, etc

  // per abilitare un'uscita complementare togliere il commento alla riga sotto:
  // pinMode(10,OUTPUT); pin utilizzabili 9,10; Sulla Mega: 5-2,6-7,11-12,46-45

  Serial.begin(115200);     // inizializza la porta se
  
  if (!SD.begin(SD_ChipSelectPin)) {  // se la scheda non è rilevata printa "SD fail"
    Serial.println("SD fail");
    return;
  }
  else {
    Serial.println("SD ok");    // se la scheda viene rilevata stampa "SD ok"
  }
  
}

void loop() {
 
digitalRead(PIN);
int PIN = digitalRead(PIN);

  if (PIN == LOW) {
    tmrpcm.disable();
        } 
        else {
          tmrpcm.play("test2.wav"); 
    Serial.println("Riproduzione"); 
      }

}

Il problema sta nel fatto che mi ripete in loop le funzioni scritte su else avendo il risultato di un suono bloccato e il monitor seriale pieno di "Riproduzione" come se non tenga conto se l'ngresso è alto o basso.
Sono riuscito a farlo funzionare solo mettendo un delay di molti secondi sotto Serial.println("Riproduzione"); ma riproduce la musica appena acceso l'arduino e basta poi.

Dall'altro arduino sto mandando con il comando digitalwtrite(PIN, HIGH);

Grazie, spero di essere stato chiaro....

Occhio che stai facendo confusione con quello che chiami PIN ...

  1. prima lo dichiari cone un intero che vale 7 (immagino sia il pin da cui vuoi leggere e allora, meglio che lo definisci costante e di tipo byte)

  2. poi nel loop() crei una nuova variabile locale che nasconde la globale che avevi creato prima (e che quindi NON è inizializzata) e leggi da questa in se stessa :o :o :o

In questo modo NON leggerei mai il valore del pin 7 :wink:

Guglielmo

Il mio scopo era praticamente inviare un comando dalla'altro arduino che mi faccia partire la musica in questo.
Da come ho capito devo eliminare la variabile nel loop() e poi come lo definisco in modo coretto questo PIN in modo che mi legge lo stato HIGH o LOW che invio al piedino 7? (Inizialmente non avevo messo quella variabile in loop leggendola in se stessa, ma comunque non mi riusciva comunque a leggere lo stato del piedino 7)

Scusate ma sto imparando un pò a smanettare con la programmazione e faccio errori...

Ad inizio programma dichiara:

...
const byte PIN = 7; /* pin che vuoi interrogare */
byte valorePIN;     /* valore che leggi dal suddetto PIN */
...

... nel loop() leggi il valore con:

valorePIN = digitalRead(PIN);

... ed i confronti li fai con quello che trovi in valorePIN :wink:

Guglielmo

Continua nel seriale a fare un'infinità di Riproduzione in continuazione senza riuscirla a riprodurre anche con l'ingresso LOW:

 SD ok
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione
Riproduzione

... se non vedo come hai modificato il programma come pensi che io possa solo lontanamente aiutarti ? ? ? :o :o :o

Guglielmo

P.S.:Dai una letta a QUESTO thread ... è utile ...

Michele95:
Continua nel seriale a fare un'infinità di Riproduzione...

Oltre a controllare il pin, hai bisogno di qualcosa che ti dica se il play è già in corso.
Prima di utilizzare una variabile per mantenere lo stato del player, studia il reference della libreria (cosa che avresti già dovuto fare) e verifica se esiste una qualche funzione che indica lo stato (ad esempio isPlaying).

Federico

Questo è il programma dell'arduino che deve poi inviare il comando a quello con la scheda SD: (usa un modulo hc sr04, la funzione è quella di far accendere un led e il buzzer appena mi avvicino a una distanza minore a 30 cm. All'accensione del Buzzer e del led volevo aggiungere l'invio di un comando all'altro arduino con SD che faccia partire il comando):

//Definizione dei pin
static int trigger = 12;
static int echo = 13;
int Buzzer = 8;
int LED = 9;
int Comandoaudio = 7;


//variabili utilizzate per calcolare la distanza
long durata; //tempo che impieghera' il suono a percorrere una certa distanza
long distanza;  //la distanza che ha percorso il suono
 
void setup() {
  //abilito la comunicaizone seriale per rendermi conto di cio' che accade
  Serial.begin(9600);
 
  //settiamo il funzionamento dei pin
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(Buzzer, OUTPUT);
  pinMode(LED, OUTPUT);
  pinMode(Comandoaudio, OUTPUT);

 
  //metto a LOW l'ingresso del PIN echo e del PIN trigger
  digitalWrite(echo, LOW);
  digitalWrite(trigger, LOW);
   Serial.println("Inizializzazione sistema");
   tone(Buzzer, 500, 500);
   
   
 
  //inizializzo le variabili
  durata = 0;
  distanza = 0;
}
 
void loop() {
 
  //Invio un impulso HIGH sul pin del trigger
  digitalWrite(trigger, HIGH);
  //lo lascio al valore HIGH per 10 microsecondi
  delayMicroseconds(1000);
  //lo riporto allo stato LOW
  digitalWrite(trigger, LOW);
 
  //ottengo il numero di microsecondi per i quali il PIN echo e' rimasto allo stato HIGH
  //per fare questo utilizzo la funzione pulseIn()
  durata = pulseIn(echo, HIGH);
 
  // La velocita' del suono e' di 340 metri al secondo, o 29 microsecondi al centimetro.
  // il nostro impulso viaggia in andata e ritorno, quindi per calcoalre la distanza
  // tra il sensore e il nostro ostacolo occorre fare:
  distanza = durata / 29 / 2;
 
  //invio i dati alla porta seriale cosi' da poterli vedere con il Monitor Seriale
  Serial.print("Durata : ");
  Serial.print(durata);
  Serial.print("     Distanza : ");
  Serial.println(distanza);
  delay (500);

if (distanza < 30) {
  Serial.println("Accensione sistema ");
  tone(Buzzer, 1000, 2000);
  digitalWrite(LED, HIGH);
  delay (5000);
  digitalWrite(Comandoaudio, HIGH);
  delay(10);
} 
else {
Serial.println("Spegnimento sistema");
 digitalWrite(LED, LOW);
 digitalWrite(Comandoaudio, LOW);
 delay (100);
}
}

Invece questo è l'arduino con la scheda SD con le modifiche che ho aggiunto:

#include <SD.h>             // includi la libreria SD per la gestione della scheda
#define SD_ChipSelectPin 10  // utilizza il pin 10 per collegare il CS della SD, puoi usare il pin che vuoi
#include <TMRpcm.h>         // includi la libreria TMRpcm per la musica!
#include <SPI.h>            // includi la libreria SPI per la comunicazione con la SD

const byte PIN = 7; /* pin che vuoi interrogare */
byte valorePIN;     /* valore che leggi dal suddetto PIN */

TMRpcm tmrpcm;   // crea l'oggetto tmrpcm

unsigned long time = 0;

void setup() {
  
  pinMode(PIN,INPUT);
  tmrpcm.speakerPin = 9; // pin utilizzabili 5,6,11 o 46 sulla Mega, 9 sulla Uno, Nano, etc

  // per abilitare un'uscita complementare togliere il commento alla riga sotto:
  // pinMode(10,OUTPUT); pin utilizzabili 9,10; Sulla Mega: 5-2,6-7,11-12,46-45

  Serial.begin(115200);     // inizializza la porta se
  
  if (!SD.begin(SD_ChipSelectPin)) {  // se la scheda non è rilevata printa "SD fail"
    Serial.println("SD fail");
    return;
  }
  else {
    Serial.println("SD ok");    // se la scheda viene rilevata stampa "SD ok"
  }
  
}

void loop() {
 
valorePIN = digitalRead(PIN);

  if (PIN == LOW) {
    tmrpcm.disable();
        } 
        else {
          tmrpcm.play("test2.wav"); 
    Serial.println("Riproduzione"); 
      }

}

... ancora lo stesso errore ... mmm ... direi che ti mancano proprio le basi e, prima di buttarti a scrivere programmi, probabilmente senza ben capire ciò che stai facendo, forse sarebbe il caso che dedicassi un po' di tempo allo studio ::slight_smile:

Comunque:

valorePIN = digitalRead(PIN);

  if (PIN == LOW) {

... se leggi il valore del pin nella variabile "valorePIN", perché fai il test sul NUMERO del pin (PIN) ? :o

Guglielmo

P..S: potresti cominciare con studiare QUESTO proseguire con QUESTO ed acquistare un buon libro (es. QUESTO) ... vedrai che dopo molte cose ti saranno più chiare :wink: