Nfr24L01 + modulo micro sd Risolto leggete bene la soluzione

Sto creando una stazione meteo con una scheda esterna ed una interna con dht 11 in entrambe le schede. Una è un arduino uno l'altra un esp 32 D1R32, la scheda Tx invia i dati alla scheda Rx ma la scheda Rx non legge i dati e non scrive sulla scheda sd. La comunicazione tra le due schede funziona. Ho fatto svariati prove e studi ma non sono giunto alla conclusione credo che ci sia un impossibbilità Hardware a questo punto. Quanlcuno mi può dare una mano a capire il problema grazie ...

#include <SPI.h>
#include <RF24.h>
#include <DHT.h>
#include <SD.h>

const int ssPinDevice1 = 5;  // Pin SS per il dispositivo 1
const int ssPinDevice2 = 10; // Pin SS per il dispositivo 2
#define DHTPIN 9
#define DHTTYPE DHT11

RF24 radio(4, 5); // CE, CSN
DHT dht(DHTPIN, DHTTYPE);

struct SensorData {
  float temperatura;
  float umidita;
};

SensorData receivedDataBuffer; // Temporary buffer to store received data
bool newDataAvailable = false;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1, 0xF0F0F0F0E1LL); // Indirizzo di origine
  radio.startListening();
  dht.begin();

  if (!SD.begin(10)) {
    Serial.println("Initialization of SD card failed!");
    while (1);
  }

  pinMode(ssPinDevice1, OUTPUT);
  digitalWrite(ssPinDevice1, HIGH);

  pinMode(ssPinDevice2, OUTPUT);
  digitalWrite(ssPinDevice2, HIGH);
}

void loop() {
  if (radio.available()) {
    digitalWrite(ssPinDevice1, LOW);
    radio.read(&receivedDataBuffer, sizeof(SensorData));
    newDataAvailable = true;
    digitalWrite(ssPinDevice1, HIGH);
  }

  if (newDataAvailable) {
    Serial.print("Temperatura Esterna (Buffer): ");
    Serial.print(receivedDataBuffer.temperatura);
    Serial.print(" °C, Umidità Esterna (Buffer): ");
    Serial.print(receivedDataBuffer.umidita);
    Serial.println(" %");

    // Reset the flag
    newDataAvailable = false;
    
    // Now write the data to SD card
    writeDataToSD(receivedDataBuffer);
  }
}

void writeDataToSD(SensorData &data) {
  // Scrivi i dati su SD
  File dataFile = SD.open("sensor_data.txt", FILE_WRITE | O_APPEND);
  if (dataFile) {
    dataFile.print("Temperatura Esterna: ");
    dataFile.print(data.temperatura);
    dataFile.print(" °C, Umidità Esterna: ");
    dataFile.print(data.umidita);
    dataFile.println(" %");
    dataFile.close();
  } else {
    Serial.println("Error opening file on SD card.");
  }
}

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere solo in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.

Grazie.

... aggiungo ... evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ... :roll_eyes:

Guglielmo

Mi scuso, grazie per la comprensione

Forse se ci dici anche quale problema qualcuno ti può aiutare, o dobbiamo giocare agli indovinelli? :roll_eyes:

Ciao, Ale.

Non riesco far salvare i dati arrivati dal modulo tx sulla scheda sd

Sul serial monitor che tipo di messaggi hai?

Non mi scrive niente il monitor seriale. Ho provato adesso con un altro modulo a 3,3 v tutto collegato a 3,3 v la parte nfr24l01 e la scheda sd in modo tale che non ci siano problemi sui livelli, ma niente la stessa problematica

Qualcuno può provare lo sketch avendo a disposizione entrambe le schede in modo da vedere se è solo un mio problema grazie ?

Grazie il post si può chiudere ho trovato la soluzione da solo. Ecco la soluzione ho inserito un modulo sd da 3,3 v nfr24l01 collegato a 5v ma con l'apposito modulo per nfr24l01 e un condensatore elettrolitico da 47 uF a 3,3 non legge i dati. Ma utilizzando nfr24l01 a 5 v funziona tutto. posto lo sketch Tx e Rx in modo tale che aiuti la community

1 Like
Tx 
#include <DHT.h>
#include <RF24.h>

#define DHTPIN 13
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
RF24 radio(16, 17);  // CE, CSN

struct SensorData {
  float temperatura;
  float umidita;
};

void setup() {
  radio.begin();
  dht.begin();
}

void loop() {
  delay(2000);
  SensorData data;
  data.temperatura = dht.readTemperature();
  data.umidita = dht.readHumidity();

  radio.openWritingPipe(0xF0F0F0F0E1LL);  // Indirizzo di destinazione
  radio.write(&data, sizeof(SensorData));
}
Rx
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>
#include <RF24.h>
#include <SimpleDHT.h>

#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

SimpleDHT11 dhtInternal(9); // Pin 8 for the internal DHT11 sensor
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin, BACKLIGHT_PIN, POSITIVE);
RF24 radio(4, 5); // CE, CSN

struct SensorData {
  float temperatura;
  float umidita;
};

File logfile;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  lcd.begin(16, 2);

  if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  if (!SD.begin(10)) {
    Serial.println("Initialization failed!");
    while (1);
  }

  radio.begin();
  radio.openReadingPipe(1, 0xF0F0F0F0E1LL); // Set the address to match the transmitter
  radio.startListening();

  pinMode(6, OUTPUT);
  lcd.clear();
  lcd.print("Card Logger");
  delay(2000);
  lcd.clear();
}

void loop() {
  if (radio.available()) {
    SensorData data;
    radio.read(&data, sizeof(SensorData));

    DateTime now = rtc.now();
    float internalTemp, internalHum;

    // Read data from internal DHT11 sensor
    dhtInternal.read2(&internalTemp, &internalHum, NULL);

    logdata(now, internalTemp, data.temperatura, internalHum, data.umidita);
  }

  delay(5000); // Wait before checking for new data
}

void logdata(DateTime now, float internalTemp, float externalTemp, float internalHum, float externalHum) {
  String dateTime = String(pad2(now.day())) + "/" +
                    String(pad2(now.month())) + "/" +
                    String(now.year()).substring(2) + " " +
                    String(pad2(now.hour())) + ":" +
                    String(pad2(now.minute())) + ":" +
                    String(pad2(now.second()));

  String tempHumInternal = "Int T: " + String(internalTemp) + "C H: " + String(internalHum) + "%";
  String tempHumExternal = "Ext T: " + String(externalTemp) + "C H: " + String(externalHum) + "%";

  Serial.println(dateTime + " " + tempHumInternal + " | " + tempHumExternal);

  // Concatenate date, time, internal temperature, and humidity on the top line,
  // and external temperature and humidity on the bottom line
  String displayText = tempHumInternal + "\n" + tempHumExternal;

  // Show scrolling text on the LCD
  lcd.clear();
  lcd.print(displayText);

  int len = displayText.length();
  for (int i = 0; i < len + 16; i++) {
    delay(500); // Increased scrolling speed
    lcd.scrollDisplayLeft();
  }

  // Write data to the log file on the SD card
  logfile = SD.open("templog.txt", FILE_WRITE | O_APPEND);
  digitalWrite(6, HIGH);
  if (logfile) {
    logfile.println(dateTime + " " + tempHumInternal + " | " + tempHumExternal);
    logfile.close();
  }
}

String pad2(int n) {
  return (n < 10) ? "0" + String(n) : String(n);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.