Projet Arduino Ethernet + SD card et modules RF 433Mhz

Bonjour et d’avance merci pour les personnes qui voudront prendre de leur temps pour m’aider.
Je me suis passionné pour Arduino depuis 2 mois. J’ai pour projet de contrôler des équipements électriques chez moi depuis Internet.
La première chose à y passer sera ma chaudière.

J’utilise pour cela :
Ce qui me sert de centrale

  • Arduino UNO + Shield Ethernet avec SD card tout 2 officiels
  • un module temps réel à base de DS1307
  • un capteur de température I2C TMP102
  • un émetteur et un récepteur RF 433 Mhz acheté chez Sparkfun
  • d’autres elts devraient venir se greffer par la suite.

Un module relais sans fil (pour commander ma chaudière)

  • arduino pro mini 5v
  • récepteur RF 433 Mhz
  • 1 module relais acheté sur ebay

Un module de température sans fil sur pile 9v pour recevoir la température extérieure toutes les 30", le but est d’anticiper l’allumage de la chaudière en fonction de la différence entre la consigne demandée et la température externe :

  • arduino pro mini 3.3v
  • emetteur RF 433 Mhz
  • module I2C de température TMP102

Mon projet avance bien puisque mon module de température sans fil est opérationnel et même installé à l’extérieur de chez moi
Le module relais sans fil fonctionne aussi de façon autonome.
Coté centrale (arduino UNO) j’avançais aussi plutôt bien. la partie thermostat programmable en fonction des jours et heures de la journée pilotent bien à vide (pas encore raccordé à la chaudière) le module relais. Avant de m’attaquer à la partie Internet pour laquelle j’ai déjà fait pas mal de tests, je voulais profiter de la présence d’une interface SD card pour enregistrer des logs.

ET DONC VOICI MON PROBLEME
Ce n’est pas indispensable pour mon projet mais cela m’embête de ne pas savoir d’où vient le problème et en plus cela fait plusieurs jours que je tourne en rond.
Je n’arrive pas à écrire sur la SD CARD j’ai fini par trouvé quel était l’élément qui empêchait d’écrire c’est mon émetteur RF. Mon programme utilise la librairie VirtualWire.h

Je vous propose ci-dessous le morceau de code qui pose problème :

#include <VirtualWire.h>
#include <SD.h> // librairie SD Card
#include <SPI.h>

byte relais[4]; // tableau contenant les infos relais transmises par RF
// SD Card
char fileName[]=("log.txt"); // nom du fichier de stockage sur la SD Card
File myFile; //init class File accès aux fichiers de la carte SD
const byte chipSelect = 4;
String dataString = "";

void setup(){
  Serial.begin(57600);
  vw_set_tx_pin(7);
  vw_setup(2000);
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  relais[0]=1; //N° de l'arduino émeteur
  relais[3]=2; //N° de l'arduino récepteur
}

void loop(){
  relais[1]=0;
  relais[2]=0x55;
  vw_send((uint8_t *)relais, sizeof(relais));
  vw_wait_tx();  // Wait for message to finish
  delay(2000);
  dataString="hello";
  myFile = SD.open(fileName, FILE_WRITE);
  if (myFile) {
    myFile.println(dataString);
    myFile.close();
    Serial.println(dataString);
  }  
  else {
    Serial.println("error opening file");
  }
   delay(2000);
}

J’obtiens “error opening file”
Si je commente les lignes :

//   vw_send((uint8_t *)relais, sizeof(relais));
//   vw_wait_tx();  // Wait for message to finish

Cela fonctionne.
Pouvez-vous m’aider, merci d’avance ?

Bonjour La fonction vw_wait_tx() bloquante. La documentation de VirtualWire dit en gros : vW_wait_tx() : "bloque et attend que l'émetteur ait fini son travail"

comment l'emetteur utilisé signale-t-il qu'il a émis le message ? En est-il capable ?

Bonjour

La fonction vw_wait_tx() bloquante. La documentation de VirtualWire dit en gros : vW_wait_tx() : "bloque et attend que l'émetteur ait fini son travail"

Je pensais que cela permettait au process d'être certain que la transmission soit terminée avant de passer à la suite mais de toute façon qu'on l'ajoute ou non ne change rien à mon problème

comment l'emetteur utilisé signale-t-il qu'il a émis le message ? En est-il capable ?

Tout simplement j'ai un autre montage (relais) à 2 mètres qui s'active de ce coté là je n'ai pas de PB. Je viens d'essayer la librairie sdFat et c'est toujours le même problème, la ligne

vw_send((uint8_t *)relais, sizeof(relais));

bloque l'accès à la SDCard

peut etre un conflit entre VirtualWire et les librairies de gestion de carte SD en raison de l'utilsation intensive (?) des interruptions par VirtualWire. (Timer1) Il faudrait peut etre tenter une désactivation de VirtualWire le temps d'écrire sur la carte SD , ou du moins masquer temporairement l'autorisation de l'interruption par débordement du timer1 qui semble etre au coeur du fonctionnement de VirtualWire

Bonjour,

Je suis interessé par une partie de votre montage ! Fournissez-vous des plans? :-) D'avance merci

Bonjour,

Pour éviter tout probléme de timer :

cli(); // Désactive tout les interruptions
// ... code SD
sei(); // Réactive le interruptions

(Pas sûr que VirtualWire apprécie le subterfuge mais bon, à tester)