shield memoire snootlab ne fonctionne pas sans usb (Résolu)

Bonjour, a partir des exemples, mon steckbook mesure une température et l'édite sur un fichier de la carte SD avec la date courante ainsi que sur le port COM de la carte.

Tout cela fonctionne parfaitement tant que l'arduino est connectée par USB. Sinon, c'est bloqué et plus rien n'est écrit sur la SD. De même, lorsque la SD est absente, j'ai bien un message d'erreur, la température s'affiche bien mais l'horloge RTC renvoie "Date courante 2165 165 165 165 165 85" :disappointed_relieved:

Quel est votre avis ?

Merci

Configuration :

  • arduino uno r3
  • sd 2go
  • alim AC/DC 5V
  • ide 1.5.5

Bonjour, Pouvez-vous nous passer le code ? Merci.

Bonsoir,
concernant
lorsque la SD est absente, … la température s’affiche bien mais l’horloge RTC renvoie “Date courante 2165 165 165 165 165 85”
c’est du au return qui suit le messsage d’erreur
J’ai donc déplacé ce bout de code pour que la RTC s’initialise même en l’absence de carte SD. 8)

Voici le code :

// SD
/*
SD card datalogger

This example shows how to log data from three analog sensors
to an SD card using the SD library.

The circuit:

  • analog sensors on analog ins 0, 1, and 2
  • SD card attached to SPI bus as follows:
    ** MOSI - pin 11
    ** MISO - pin 12
    ** CLK - pin 13
    ** CS - pin 4

created 24 Nov 2010
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/
// SD
#include <SPI.h>
#include <SD.h>
// RTC
#include <Wire.h>
#include <RTClib.h> // a basic DS1307 library that returns time as a time_t
// DS
#include <OneWire.h> // Inclusion de la librairie OneWire

RTC_DS1307 rtc;

// DS
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire

// DS
OneWire ds(BROCHE_ONEWIRE); // Création de l’objet OneWire ds

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d’erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];

// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté

if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}

if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l’adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur

if (addr[0] != DS18B20) // Vérifie qu’il s’agit bien d’un DS18B20
return false; // Si ce n’est pas le cas on retourne une erreur

ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure

ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad

for (byte i = 0; i < 9; i++) // On lit le scratchpad
data = ds.read(); // Et on stock les octets reçus

  • // Calcul de la température en degré Celsius*
    _ *temp = ((data[1] << 8) | data[0]) * 0.0625;_

  • // Pas d’erreur*

  • return true;*
    }
    // On the Ethernet Shield, CS is pin 4. Note that even if it’s not
    // used as the CS pin, the hardware CS pin (10 on most Arduino boards,
    // 53 on the Mega) must be left as an output or the SD library
    // functions will not work.
    // SnootLab SD shield → Pin 10
    const int chipSelect = 10;
    //LED
    // constants won’t change. Used here to set a pin number :
    const int ledPin = 9; // the number of the LED pin
    // Variables will change :
    int ledState = LOW; // ledState used to set the LED
    // Generally, you shuould use “unsigned long” for variables that hold time
    // The value will quickly become too large for an int to store
    unsigned long previousMillis = 0; // will store last time LED was updated
    // constants won’t change :
    const long interval = 1000; // interval at which to blink (milliseconds)
    void setup()
    {

  • Serial.begin(9600); // Open serial communications*
    // RTC
    #ifdef AVR

  • Wire.begin();*
    #else

  • Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due*
    #endif

  • rtc.begin();*

  • if (! rtc.isrunning()) {*

  • Serial.println(“RTC is NOT running!”);*

  • // following line sets the RTC to the date & time this sketch was compiled*

  • rtc.adjust(DateTime(DATE, TIME));*

  • }*

//LED

  • // set the digital pin as output:*
  • pinMode(ledPin, OUTPUT);*
    // SD
  • Serial.print(“Initializing SD card…”);*
  • // make sure that the default chip select pin is set to*
  • // output, even if you don’t use it:*
  • pinMode(10, OUTPUT);*
  • // see if the card is present and can be initialized:*
  • if (!SD.begin(chipSelect)) {*
  • Serial.println(“Card failed, or not present”);*
  • // don’t do anything more:*
  • return;*
  • }*
  • Serial.println(“card initialized.”);*
    *} *
    void loop()
    {
    // déclaration variables
  • String dataString = “”; // make a string for assembling the data to log:*
  • float temp;*
  • String date = “”;*
  • String phrase = “”;*
  • int y = 0;*
  • int m = 0;*
  • int d = 0;*
  • int h = 0;*
  • int mi = 0;*
  • int s = 0;*

// delai de boucle 1 minute ?

  • delay(1000);*

  • DateTime now = rtc.now();*
    // DS + RTC

  • if(getTemperature(&temp)) { // Lit la température ambiante*

  • y = now.year();*

  • m = now.month();*

  • d = now.day();*

  • h = now.hour();*

  • mi = now.minute();*

  • s = now.second();*

  • date = "Date courante ";*

  • date += y;*

  • date += " ";*

  • date += m;*

  • date += " ";*

  • date += d;*

  • date += " ";*

  • date += h;*

  • date += " ";*

  • date += mi;*

  • date += " ";*

  • date += s;*

  • date += " ";*

  • Serial.print(date); // Affiche la date*

  • dataString = "Temperature ";*

  • dataString += temp;*

  • dataString += " Celsius";*

  • Serial.println (dataString); // Affiche la température*
    // Serial.write(176); // caractère °
    // Serial.write(‘C’);
    *// Serial.println(); // Affiche la température *

  • } *
    // SD

  • // open the file. note that only one file can be open at a time,*

  • // so you have to close this one before opening another.*

  • File dataFile = SD.open(“datalog.txt”, FILE_WRITE);*

  • // if the file is available, write to it:*

  • if (dataFile) {*

  • dataFile.print(date);*

  • dataFile.println(dataString);*

  • dataFile.close(); *

  • }*

  • // if the file isn’t open, pop up an error:*

  • else {*

  • Serial.println(“error opening datalog.txt”);*

  • } *

*//LED *

  • // here is where you’d put code that needs to be running all the time.*

  • // check to see if it’s time to blink the LED; that is, if the*

  • // difference between the current time and last time you blinked*

  • // the LED is bigger than the interval at which you want to*

  • // blink the LED.*

  • unsigned long currentMillis = millis();*

  • if(currentMillis - previousMillis >= interval) {*

  • // save the last time you blinked the LED*

  • previousMillis = currentMillis; *

  • // if the LED is off turn it on and vice-versa:*

  • if (ledState == LOW)*

  • ledState = HIGH;*

  • else*

  • ledState = LOW;*

  • // set the LED with the ledState of the variable:*

  • digitalWrite(ledPin, ledState);*

  • } *
    }

En continuant de chercher, j'ai constaté que le problème est presente avec la carte UNO seule : - en prenant le code exemple du clignotement d'une led sur la pin 12 et avec la carte alimentée par USB, tout est OK - lorsque la carte est alimentée par l'adaptateur secteur seul (sans USB), le led ne clignote pas ! (la led ON est bien allumée mais elle semble scintiller

Bonsoir, Le port des lunettes est interdit en C et C++ (erreur de compilation) :stuck_out_tongue_closed_eyes: Il faut penser a mettre ton code entre les balises # (entre la télétype et la citation) @+

bassia: - alim AC/DC 5V

Si ce n'est pas une erreur de frappe et si cette alim est branchée sur la prise "alimentation externe" de la Uno c'est presque à coup sûr la cause du "ça fonctionne avec alim USB mais pas alim externe".

En effet à cause du (ou grâce au) régulateur de tension placé sur cette ligne d'alimentation, la tension minimale en entrée pour un fonctionnement correct de la carte est de 7V (pour faire simple).

J'ai eu le même problème.

La solution est très simple: Tu découpe ton câble USB tu branche le fil rouge de l'USB au + d'une batterie 5V (l'USB fonctionne en 5V) et le fil noir au - de cette même batterie. Les autres fils de l'USB tu t'en fous

Bonjour,

EBanou: J'ai eu le même problème. La solution est très simple: Tu découpe ton câble USB tu branche le fil rouge de l'USB au + d'une batterie 5V (l'USB fonctionne en 5V) et le fil noir au - de cette même batterie. Les autres fils de l'USB tu t'en fous

Il existe, en supermarché rayon téléphonie, des câbles type USB qui ne servent qu'au chargement les fils data ne sont même pas présents (triste expérience en voulant utiliser ce type de câble comme un câble USB normal, enfin des heures à chercher pourquoi ça ne marche pas) @+

Bonjour, Merci à tous pour vos contributions. L'insuffisance de l'alimentation est probable en effet, sur Spec Arduino Uno R3, il est bien spécifié : Summary Microcontroller : ATmega328 Operating Voltage : 5V Input Voltage (recommended) : 7-12V Input Voltage (limits) : 6-20V

Préférez également une alimentation fournissant un ampérage suffisant genre 1 A (pour mémoire, l'USB c'est 500 mA). On testera votre code dans le journée.

EBanou: J'ai eu le même problème.

La solution est très simple: Tu découpe ton câble USB tu branche le fil rouge de l'USB au + d'une batterie 5V (l'USB fonctionne en 5V) et le fil noir au - de cette même batterie. Les autres fils de l'USB tu t'en fous

Juste, si tu fais ce que je t'ai di, regarde bien les caractéristiques de ta batterie, ça serait con de griller ton Arduino

Merci à tous pour votre aide et bonne année :)

Effectivement, avec un autre adaptateur secteur qui délivre une tension de 10V à vide, tout fonctionne bien XD

La carte et le shield SD sont solides : La tension en sortie du régulateur devait sacrément onduler mais cela n'empechait pas certaines parties du montage de fonctionner (je vais mettre le multimètre sur le DS1307 pour voir ...) Par exple, la SD fonctionne en 3V3 à l'aide d'un second régulateur.