E' da qualche giorno che sto diventando matto per far funzionare assieme il modulo NRF24 e il modulo SD e poi guardando nelle caratteristiche del modulo SD leggo: "Si prega di fare attenzione durante l'uso contemporaneo di più apparecchi SPI, ne può essere attivo solo uno alla volta." :o
Ora vi chiedo non si può in alcun modo farli funzionare assieme con un arduino mega? neanche collegando il modulo SD con arduino nano e a sua volta collegarlo all arduino mega?
Sarebbe bene che ti studiassi come funziona il BUS SPI ...
... comincia da QUI e prosegui QUI e ... capirai sia cosa significa la frase "attivo solo uno alla volta", sia come far funzionare i vari devices.
grazie per la risposta, da quello che ho capito l unico pin da settare è il SS perchè gli altri rimangono gli stessi ... ho letto in qualche post vecchio che basta settare il pin SS come HIGH o LOW per abilitare o disabilitare il modulo, è corretto?
MrToldo:
grazie per la risposta, da quello che ho capito l unico pin da settare è il SS perchè gli altri rimangono gli stessi ...
Esatto, tutti i devices sono sempre collegati al BUS, ma solo quello che selezioni con il pin SS ne ha l'uso.
La libreria SD gestisce lei il suo pin di SS (normalmente il 10, ma puoi cambiarlo al momento dell'inizializzazione), per altri devices dipende da chi ha scritto la libreria se lo ha gestito o meno (... di solito si). Se NON usi una libreria, allora dovrai farlo tu a mano.
utilizzo una libreria SD della Adafruit/Sparkfun, se non erro nel file della libreria non vedo da nessuna parte l'assegnazione del pin CS (infatti lo si assegna poi nello sketch).
Premetto una cosa però, utilizzando questa libreria e con i suoi esempi funziona tutto regolarmente (assegnando anche pin diversi per il CS) il problema sorge quando utilizzo in un Arduino mega sia il modulo SD che quello NRF24 (con pin CS sul 53 ed integrando il codice con quello del modulo NRF24), anche se cambio il CS o mantengo il 10 il modulo non viene inizializzato, mentre funziona il modulo NRF24
La libreria SD non la devi scaricare, fa parte di quelle di base, basta che fai:
// include the SD library:
#include <SPI.h>
#include <SD.h>
e la puoi usare.
Se usi il 53 con il nRF24 prova a cambiare pin per la SD ed a NON usare il pin 10, ma dichiaralo comunque come pin di OUTPUT "pinMode(10, OUTPUT);" anche se poi NON lo usi.
Ok provo appena ho un po’ di tempo.... quindi dichiaro sia il pin 10 che il pin 4 (che userò come CS)come output, ma il discorso dell pin HIGH e LOW serve poi specificarlo nel void loop?
gpb01:
Normalmente dovrebbero gestire il tutto le librerie, quindi no :
Guglielmo
ho provato a dichiarare sia il pin 10 che il pin 4 come OUTPUT e a collegare nel 4 il pin CS del modulo SD, con lo sketch getting started riesco ad utilizzare normalmente il modulo ma quando integro il codice con quello del NRF24 il modulo SD non funziona
Mi pare strano sia il codice errato perchè sono poche righe di codice per creare e scrivere su un file .txt, per me c'è qualcosa di errato nei collegamenti
MrToldo:
Mi pare strano sia il codice errato perchè sono poche righe di codice per creare e scrivere su un file .txt, per me c'è qualcosa di errato nei collegamenti
Beh ... proviamo ad esaminare lo schema dei collegamenti (anche un disegno fatto a mano purché leggibile) ed il codice che usi per fare il test (... un codice minimo ridotto all'osso e, mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).
gpb01:
Beh ... proviamo ad esaminare lo schema dei collegamenti ...
Guglielmo
Qui l' immagine con lo schema del circuito (spero si capisca)
Qui invece il codice getting started funzionante
#include <SD.h>
#include <SPI.h>
File myFile;
int pinCS = 4;
void setup() {
Serial.begin(9600);
pinMode(pinCS, OUTPUT);
if (SD.begin()){
Serial.println("SD card is ready to use.");
} else{
Serial.println("SD card initialization failed");
return;
}
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
Serial.println("Writing to file...");
myFile.println("prova 26/10/2017");
myFile.close();
Serial.println("Done.");
}
else {
Serial.println("error opening test.txt");
}
}
void loop() {
// empty
}
E qui il codice che ho scritto per la stazione meteo con modulo NRF24 e modulo SD (più LED, DHT11, BMP085, RTC)
#include <DHT.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
#include <Wire.h>
#include "Adafruit_BMP085.h"
#include "RTClib.h"
#include <SD.h>
#define DHTPIN 7
#define DHTTYPE DHT11
Adafruit_BMP085 bmp;
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(53,48);
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
File myFile;
//variabili massimi e minimi
float tempmax = 0;
float tempmin = 100;
float humimax = 0;
float humimin = 120;
float presmax = 0;
float presmin = 120000;
int anno = 0;
int mese = 0;
int giorno = 0;
int ora = 0;
int minuti = 0;
void setup()
{
Serial.begin(115200);
SPI.begin();
SD.begin();
dht.begin();
bmp.begin();
radio.begin();
rtc.begin();
myFile = SD.open("Stazione_Meteo.txt", FILE_WRITE); //Crea il file Stazione meteo sulla SD
radio.openWritingPipe(pipe);
pinMode(4, OUTPUT); //PIN CS modulo microSD
pinMode(10, OUTPUT);
pinMode(23, OUTPUT); //LED rosso per l'OFFLINE
pinMode(25, OUTPUT); //LED verde per l'ONLINE
pinMode(27, OUTPUT); //LED arancio per bip trasferimento dati
delay(1000);
//CODICE RTC
if (rtc.lostPower()) {
Serial.println("Reinserire data e ora");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
void loop()
{
delay(100);
//CODICE SETTAGGIO VARIABILI
float tempdht = dht.readTemperature(); //variabile temperatura sensore dht
float tempbmp = bmp.readTemperature(); //variabile temperatura sensore bmp
float temp = (tempdht + tempbmp) / 2.0; //media fra le due temperature calcolate dai sensori
int humi = dht.readHumidity(); //variabile umidità
float pres = bmp.readPressure(); //variabile pressione
//CODICE DATA E ORA
DateTime now = rtc.now();
anno = (now.year());
mese = (now.month());
giorno = (now.day());
ora = (now.hour());
minuti = (now.minute());
delay(100);
//CODICE PER CONTROLLO MASSIMI E MINIMI
if (temp >= tempmax){
tempmax = temp;
}
else if (temp <= tempmin){
tempmin = temp;
}
if (humi >= humimax){
humimax = humi;
}
else if (humi <= humimin){
humimin = humi;
}
if (pres >= presmax){
presmax = pres;
}
else if (pres <= presmin){
presmin = pres;
}
delay(100);
//CODICE INVIO DATI AD ALTRO ARDUINO IN ASCOLTO
float data[14];
bool ok;
data[0]= temp;
data[1]= humi;
data[2]= pres;
data[3] = anno;
data[4] = mese;
data[5] = giorno;
data[6] = ora;
data[7] = minuti;
data[8] = tempmax;
data[9] = tempmin;
data[10] = humimax;
data[11] = humimin;
data[12] = presmax;
data[13] = presmin;
ok = radio.write(&data, sizeof(data));
digitalWrite(27, HIGH); //accende LED arancio per invio dato
delay(100);
digitalWrite(27, LOW); //spegne LED arancio per invio dato
delay(100);
if (ok){
Serial.println("---ONLINE---");
digitalWrite(25, HIGH); //accende LED verde
digitalWrite(23, LOW);// spegne led rosso
} else {
Serial.println("---OFFLINE---");
digitalWrite(23, HIGH);//accende LED rosso
digitalWrite(25, LOW); //spegne led verde
}
delay(100);
//CODICE PRINT SU SERIAL MONITOR PER VERIFICA CORRETTEZZA
Serial.println ("Sto inviando: ");
Serial.print ("T: ");
Serial.print (temp);
Serial.print (" / TMAX: ");
Serial.print (tempmax);
Serial.print (" / TMIN: ");
Serial.print (tempmin);
Serial.println (" C°");
Serial.print ("H: ");
Serial.print (humi);
Serial.print (" / HMAX: ");
Serial.print (humimax);
Serial.print (" / HMIN: ");
Serial.print (humimin);
Serial.println (" %");
Serial.print ("P: ");
Serial.print (pres);
Serial.print (" / PMAX: ");
Serial.print (presmax);
Serial.print (" / PMIN: ");
Serial.print (presmin);
Serial.println (" Pa");
//CODICE DATA E ORA RTC
Serial.print(anno);
Serial.print('/');
Serial.print(mese);
Serial.print('/');
Serial.print(giorno);
Serial.print(" - ");
Serial.print(ora);
Serial.print(':');
Serial.println(minuti);
//CODICE PER LOG su SD
if(myFile){
myFile.println(String(temp));
myFile.close();
Serial.println("SD Datalogger Eseguita");
}else{
Serial.println("errore SD");
}
//Ultima parte di codice
Serial.println("");
Serial.println("-------------");
delay(2000);
}
Lo sketch ultimo è quello della stazione meteo che fà da "trasmettitore" ed invia poi i dati ad un altro arduino mega "ricevitore" tramite connessione WiFi, il modulo SD lo uso come datalogger collegato al primo arduino.
Praticamente il led ONLINE e OFFLINE viene attivato se il secondo Arduino Mega è collegato e riescono a comunicare fra loro
Facendo un po' di ricerche ho scoperto che non sei il solo ad aver avuto problemi con schede SD e nRF24 ... se fai una ricerca con Google trovi alcuni thread, QUESTO, ad esempio, è il primo che mi è capitato, ma ce ne sono altri, come QUESTO, ecc. ecc.