Sujet : Bouton poussoir et carte sd

Bonjour,

Hier, tout à la fois, je me suis présenté sur le site et j’ai posé une question.

Ce matin, je reformule ma demande, peut-être, au bon endroit.

Je souhaite réaliser un ensemble simple et autonome capable, dans un premier temps, d’enregistrer et horodater les ouvertures et les fermetures d’une porte. (Horodater, dans le sens où je sais à quel moment je mets le système en marche. Dans ce premier temps une indication de durée de l’ouverture ou de la fermeture est suffisante).

Plus exactement, j'ambitionne de recueillir les « interruptions » qui proviennent d'un ILS - Interrupteur à Lame Souple - situé sur une porte dans le but de recueillir ces informations d'ouverture et de fermeture sur la carte SD pour, ultérieurement, pouvoir lire sur un PC les données enregistrées.

Mon apprentissage a commencé par la copie de quelques réalisations « clés en mains » et ainsi, sans trop de difficulté, je suis parvenu à un premier stade avec un programme pour mon projet et qui fonctionne. (Je ne sais  pas encore envoyer mon logiciel !).

- À chaque ouverture et à chaque fermeture de la porte, j'obtiens bien une information de l'ILS que je matérialise par l’illumination d’une LED verte lorsque la porte est OUVERTE et une LED rouge pour indiquer que la porte est FERMÉE.

Toujours dans le but de comprendre au mieux l'utilisation du microcontrôleur, j'ai essayé d'inscrire les données d'ouverture et de fermeture sur la carte sd, notamment, en m'inspirant des nombreuses bibliographies.  Mais comme cela était prévisible, rien ne marche, c’est pourquoi je fais appel à la communauté pour m’éclairer en exposant plus distinctement mon attente. En effet, mes mauvaises interrogations sur votre site et d’autres n’ont rien donné !! (Je reconnais que je n'ai pas dû exprimer assez clairement et dans les formes ma demande sur les moteurs de recherche).

D’où cette question : que dois-je faire exactement pour trouver un exemple, clé en mains, qui m’aide dans mon projet d’apprentissage ? Plus explicitement, un programme simple et complet comme celui-ci me conviendrait : En appuyant sur un BP, j'enregistre sur la carte Sd l'information que j'ai bien appuyée sur BP. Lorsque je relâche BP, pareillement, j’enregistre l’information ! J’ai lu qu’avec l’instruction « millis » on pouvait enregistrer la durée séparant les informations.

Cordialement,

Merci et, évidemment, je répondrais à toutes les demandes de précisions.

Guy.

Re : Bouton poussoir et carte sd

Bonjour et bienvenu à toi.
Ton projet est intéressant pour apprendre. Malheureusement, ta démarche de trouver du "clé en main" me semble moins intéressante pour toi. En plus, tu aura du mal à trouver pile-poil ce que tu cherche.
Je te propose de faire le code toi-même, en utilisant les morceaux specifiques a chaque partie que tu trouve sur le site arduino et autre. On peut bien sur te guider. Première étape, écrire une à une, ligne par ligne, les actions à effectuer, en bon français, sans code. À toi !

Re : Bouton poussoir et carte sd

Bonjour et merci de votre votre réponse.



 Voici mon premier programme qui fonctionne

/* Ouverture ou fermeture d'une porte Dans le sens le plus large, c’est la détection de la rupture de conduction électrique dans un fil « témoin »*/ 

// Le 26 juillet 2013 à 11 h 57
// I - Que fait ce programme. (Détection de l’ouverture ou de la fermeture d’une porte).
// La porte fermée allume la LEDVERT 
// La porte ouverte allume LEDROUGE. C'est anormal!

// Circuit réalisé

/* - Connecter un fil de [b]l’ILS [/b](Interrupteur à Lame Souple) à la masse, l’autre sur la broche 2. (configurée en entrée)*/
// - Connecter la LEDVERTet sa résistance en série sur la broche 3. (configurée en sortie)
// - Connecter la LEDROUGE et sa résistance en série sur la broche 4. (configurée en sortie)

// III - Déclaration des constantes

const int FERMETURE=1; // constante état du BP - appui sur niveau haut APPUI
const int OUVERT=0; // constante état du BP - relâché sur niveau bas NONAPPUI

// Constantes des broches

const int ILS=2; //declaration constante de la broche ILS 
const int LEDVERT=3; //declaration constante de broche FERMETURE
const int LEDROUGE=4; //declaration constante de broche OUVERT

// Déclaration des variables globales

int ETAT_ILS; // variable d'état de la porte surveillée (ouverte ou fermée)

// Initialisation des fonctionnalités utilisées

// VI - FONCTION SETUP

// C’est le code d'initialisation. La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// Ce sont les instructions à exécuter au démarrage 

pinMode(LEDROUGE, OUTPUT); //met la broche 4 en sortie 
pinMode(LEDVERT, OUTPUT); //met la broche 3 en sortie 


pinMode(ILS, INPUT); //met la broche en entrée 

digitalWrite(ILS, HIGH) ; // activation du pullup de la broche en entrée

} // fin de la fonction setup()

// VII - FONCTION LOOP

// la fonction loop coeur du programme () s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// Instructions à exécuter par le programme principal

ETAT_ILS=digitalRead(ILS); // lit l'état du BP et met la valeur 0/1 dans la variable

if (ETAT_ILS==FERMETURE){ // si la porte est fermée (c’est-à-dire si la variable état ILS = 0 
// Attention à bien utiliser == et non =

  digitalWrite(LEDROUGE,1); // allume la LED ROUGE
  digitalWrite(LEDVERT,0); // éteint la LED VERT

}

else { // sinon (c’est-à-dire si variable état ILS=1)

digitalWrite(LEDROUGE,0); // éteint la LED ROUGE
delay(100);
digitalWrite(LEDVERT,1); // allume la LED VERT
delay(100);
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

//                 Fin programme
 

La manoeuvre est-elle correcte ?

Guy

Dernière modification par Guy-Roland-Pierre (28-07-2013 18:36:38)

Re : Bouton poussoir et carte sd

Je n'ai pas encore lu, mais juste pour plus de lisibilité, il y a sur le forum une fonction "code" qui permet de mettre tout ton code de façon plus présentable. Tu devrais éditer ton message (bouton modifier, en bas de ton post) et sélectionner ton code, puis cliquer sur l'icône au dessus représentant une fenêtre avec <...> à l'interieur. Merci

Re : Bouton poussoir et carte sd

Bon, ton code est sur-commenté. Pour commencer c'est parfait. Effectivement, il doit fonctionner. Maintenant, ajoute des commentaire la ou tu veux que ça enregistre quelque chose. On s'occupera de coder après. On va faire étape par étape.

Re : Bouton poussoir et carte sd

Bonjour,

J'ai essayé de suivre les directives.

Ci-après, voici ce que cela donne.

J'attends les commentaires et principalement les critiques qui vont me permettre d'avancer.

Cordialement et encore merci de l'aide.

Guy.

// Ouverture ou fermeture d'une porte.

// Le 31 juillet 2013 à 05 h 18

// QUE FAIT CE PROGRAMME.

/* J'AI AJOUTé :(Ce programme inscrit sur une carte mémoire SD amovible des données pour une utilisation différée et directe de celle-ci dans un tableaur EXCEL OU OpenOffice). Cet un programme, d'apprentissage, il s'interomp après dix itérations d'O/F.*/

// La porte fermée allume une LEDVERT. 
// La porte ouverte allume une LEDROUGE. (Ce qui est anormal pour avertir d'une possible INTRUSION).

// FONCTIONNALITES UTILISEES.

// La connexion série vers le PC pour contrôler le bon fonctionnement.
// Utilise une platine carte mémoire (Card Shield V4.0).

// CIRCUIT à REALISER

// - Connecter l'un des deux fils de l’ILS à la masse, l’autre, sur la broche 2. (configurée en entrée).
// - Connecter une LEDVERT et sa résistance de 1 k en série sur la broche 3. (configurée en sortie).
// - Connecter une LEDROUGE et sa résistance de 1 k en série sur la broche 6. (configurée en sortie).

/* J'ai AJOUTé : Connecter la broche sélect card SD du module V4.0 sur la broche 4. Le module V4.0 est à enficher broche à broche sur la carte Arduino uno*/

// ENTETE DECLARATIVE.

//         Déclaration des constantes

const int FERMETURE=0; // constante de l'état de l'ILS pour porte fermée.
const int OUVERT=1; // constante état de l'ILS pour porte ouverte.

//         Inclusion des librairies.

// J'ai AJOUTé :

#include <SD.h> // Qui cré automatiquement un objet racine SD représentant la carte mémoire SD. 

//         Déclaration Constantes des broches E/S numériques.

// J'ai AJOUTé : la broche utilisée pour sélectionner la carte SD.

const int brocheSDCardSelect=4;

// Déclaration des constantes analogiques.

const int ILS=2; //declaration constante de la broche ILS. 
const int LEDVERT=3; //declaration constante de broche FERMETURE. 
const int LEDROUGE=6; //declaration constante de broche OUVERT

// J'ai AJOUTé :

const int analog0=A0; // qui est la constante pour la broche analogique 0

//         Déclaration des variables globales

int ETAT_ILS; // variable d'état de la porte surveillée et acquisition du résulta. (Elle est ouverte ou elle est fermée).

// J'ai AJOUTé : la variable qui sera utilisée pour tester la valeur renvoyée par la fonction SD Card.

int test;

//         Déclaration des objets utiles pour les fonctionnalités utilisées.

/*
Sd2Card card; // création d'un objet Sd2Card
SdVolume volume; //création d'un objet SdVolume
SdFile root; //Création d'un objet SdFile pour le répertoire racine
SdFile file;// création d'un objet SsFile pour le fichier utilisé
/*

File file;//objet file
File root;// objet root pour le répertoire racine

// VI - FONCTION SETUP

/* C’est le code d'initialisation. La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du programme*/

void setup() { // debut de la fonction setup()

// Ce sont les instructions à exécuter au démarrage

// INITIALISATION DES FONCTIONNALITEES UTILISEES

pinMode(LEDROUGE, OUTPUT); //met la broche 4 en sortie 
pinMode(LEDVERT, OUTPUT); //met la broche 3 en sortie 

pinMode(ILS, INPUT); //met la broche en entrée 

digitalWrite(ILS, HIGH) ; // activation du pullup de la broche en entrée

// J'ai AJOUTé pour la carte SD :

// initialisation de la carte SD en en mode SPI
Serial.begin(115200); // qui initialise la connection série à 115200 bauds

pinMode(10,output);/* qui initialise l'utilisation de la carte Sd en mode SPI en mettant la broche 10 (SS) en sortie et qui nécessaire d'après la documention du module V4.0*/

digitalWrite(10,HIGH); //pour désactiver le CI W5100 du module SV4.0

//        initialisation de la carte SD

Serial.printin("initilisation de la carte SD ...");
pinMode(10,OUTPUT);//obligation de laisser la brochhe SS en sortie
test=SD.begin(brocheSDCardSelect); //renvoi vrai/faux avec la broche 4 en tant que CS

if(test!=true){//si l'initialisation n'est pas réussie
Serial.printin("Echec de l'initialisation!";
}
else{// si initialisation réussie
Serial.printin("Initialisation russie !";

//        Affiche le contenu du répertoire

root=SD.open("/");

Serial.printin(Répertoire racine ouvert!";

}// fin si initialisation réussie

} // fin de la fonction setup()

// FONCTION LOOP

/* la fonction loop coeur du programme () s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension*/

void loop(){ // debut de la fonction loop()

// Instructions à exécuter par le programme principal

ETAT_ILS=digitalRead(ILS); // lit l'état de l'ILS et met la valeur 0/1 dans la variable

if (ETAT_ILS==FERMETURE){ // si la porte est fermée (c’est-à-dire si la variable état ILS = 0

  digitalWrite(LEDVERT,1); // allume la LED VERT

  digitalWrite(LEDROUGE,0); // éteind la LED ROUGE
  
}

else { // sinon (c’est-à-dire si variable état ILS=1)

digitalWrite(LEDROUGE,1); // allume la LED ROUGE
digitalWrite(LEDVERT,0); // éteind la LED VERT

// CONTROLE DE l'Accés à la CARTE SD
// Ouverture d'un fichier et écriture des données.
// Contrôle que les données sont bien inscrites sur sd !.
// fermeture du fichier.
// fermeture de la carte.

}

//        Efface fichier au préalable

test=SD.open("data.txt"; // efface le fichier et mémorise le résultat
if(test)Serial.printin("Fichier efface"); // affiche message si fichier bien effacé

//         crée fichier en écriture

file=SD.open(data.txt",FILE_WRITE); /* ouvre le fichier en écriture ou crée le fichier s'il n'xiste pas*/

// test si fichier disponible en écriture

if(!file){ // si fichier pas disponible

Serial.printin("Erreur a l'ouverture du fichier!");

}// fin if 

else{// si le fichier existe et est ouvert

Serial.printin("Fichier pret en écriture!");

    // Ecriture dans le fichier au format CSV
    // Première ligne avec la liste des champs
    // Première ligne
    
file.printin("Numéro   "; O / F   ;Millis")

Serial.printin("Enregistrement en cours:")

    //acquisition état de l'ILS
    // valeur du premier champ. (Le numéro).
    
file.printin,file.print(';');

//valeur du deuxième champ. (O/F - true/False).
file.print(ETAT_ILS), file.print(';);

// valeur du troisième champ
file.print(millis());(Ecoulement du temps depuis précédente opération).

// un saut de ligne est obligatoire

file.printin();

delay 1000

else

//fermeture du fichier

file.close

Serial.printin("

while(

for(int i=0;i<10;i++); { // incrémente la boucle

} /* fin de la fonction loop() - le programme s'arrête*/

//                 Fin programme

Re : Bouton poussoir et carte sd

Je ne sais pas si ton programme fonctionne, mais je ne saisi pas la boucle for a la fin, ni le serial print qui n'est pas fermé. Je regarderais ce soir, la je suis sur mon téléphone.

8

Re : Bouton poussoir et carte sd

Le while à la fin n'est pas fermé non plus...

Re : Bouton poussoir et carte sd

Ok donc, reprenons dans l'ordre.
Ton code commence à être long, il va falloir que tu le rende plus lisible, pour toi. La première chose à faire est de l'indenter ; c'est à dire mettre des tabulations à chaque fois que tu entre dans une boucle/fonction.
Exemple :

void loop()
{
     if(niania==truc)
     {
          truc=0;
     }
     else
     {
          truc=1;
     }
}

On s'y retrouve déjà mieux !
Ensuite je pense que tu va un peu vite, d'où beaucoups d'oublis comme le while qui ne sert à rien ou le for pas fermé et surtout qui ne sert à rien non plus. Je pense que ce for, pour toi, sert à numéroter l'événement. Pas besoin d'un for pour ça, un simple i++; suffit, à condition que la variable i soit declarée en entete, et que tu l'utilise dans la colonne "numéro", ce qui n'est pas le cas.
Petite correction aussi, printin ne veux rien dire, je pense qu'il s'agit de println que tu veux utiliser, avec un L minuscule. Relis bien ton code, il y a plein de petites erreurs de ce genre. Si tu bloque, hésite pas, on te filera un coup de main pour coder, c'est pas bien compliqué.
Une question, peux-tu nous dire quelle broche est reliée avec quoi, en dehors du code ?

Re : Bouton poussoir et carte sd

Bonjour,

Oui, c’est… ben vrai !

J’ai eu de très grandes difficultés pour terminer ce deuxième programme. Il m'est évident, comme à vous, que je n'ai pas encore compris grand-chose à la programmation de l'Arduino et que les deux livres en ma possession : Démarrez avec Arduino de Massimo Banzi et celui de C. TAVERNIER, Maîtriser sa programmation et ses cartes d'interface ne sont pas suffisantes pour moi. Donc, je suis ouvert à vos propositions, car je suis pugnace. Mais, existe-t-il un livre qui reprenne les instructions principales avec des exemples suffisants ?

Je m’explique : un autodidacte constitutif n’a pas  nécessairement le même système d’apprentissage qu’un ensemble constitué par un Professeur et un élève qui reçoit un enseignement. C'est bien pour cela que je sollicite des exemples « clés en mains » qui permettent à des gens comme moi de progresser à leur rythme, l'âge ralentissant nécessairement l'entendement.

C’est pourquoi, dès cet instant, j’efface tout pour repartir sur des bases plus saines.

Le programme ci-après fonctionne correctement sur la plaque d'essai et ce premier apprentissage a été relativement facile.

Là où les choses se compliquent, c’est en voulant, peut-être trop rapidement, programmer l’ensemble de mon  intention par « des petits bouts de programme ». J'ai honteusement copié l'exemple Datalogger qui se rapproche de mon intention.

Ce que je veux obtenir, si cela est possible, c’est commencer à enregistrer, le plus simplement possible, les ouvertures / fermetures de la porte sur la carte SD.

En fin de programme, après un certain nombre d'itérations - modifiable dans le programme, dix dans le cas présent - le programme s'arrête afin de pouvoir retirer la carte SD et la lire sur le PC.

En espérant ne pas trop vous importuner, je vous représente mon programme avec cette question : comment le poursuivre en déclenchant l’écriture sur la carte SD ?

Encore merci et cordialement.

Guy.

// REPRISE AU 01 08 2013 à 19 h 17

// I - Que fait ce programme.
// Par l'intermédiare d'un ILS il détecte,
// l’ouverture ou de la fermeture d’une porte).

// Si la porte est fermée, la LEDVERT est allumée est la LEDROUGE éteinte. 
// Si la porte est ouverte la LEDROUGE s'allume et la LEDVERT s'éteind.

// II - Les connexions réalisées.

/* - J'ai onnecté: un fil de l’ILS (Interrupteur à Lame Souple) à la masse, l’autre sur la broche 2.*/
// - une LEDVERT et sa résistance en série sur la broche 3.
// - une LEDROUGE et sa résistance en série sur la broche 6.

// III - Entête déclarative. Déclaration des constantes

const int FERMETURE=0; // constante état de l'ILS
const int OUVERT=1; // constante état DE L4ils

// Constantes des broches

const int ILS=2; //declaration constante de la broche ILS 
const int LEDVERT=3; //declaration constante de broche FERMETURE
const int LEDROUGE=6; //declaration constante de broche OUVERT

// Déclaration des variables globales

int ETAT_ILS; // variable d'état de la porte surveillée

// Initialisation des fonctionnalités utilisées

// VI - FONCTION SETUP

// C’est le code d'initialisation. La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// Ce sont les instructions à exécuter au démarrage 

pinMode(ILS, INPUT); //met la broche en entrée
pinMode(LEDVERT, OUTPUT); //met la broche 3 en sortie
pinMode(LEDROUGE, OUTPUT); //met la broche 6 en sortie 

digitalWrite(ILS, HIGH) ; // activation du pullup de la broche en entrée

} // fin de la fonction setup()

// VII - FONCTION LOOP

// la fonction loop coeur du programme () s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// Instructions à exécuter par le programme principal

ETAT_ILS=digitalRead(ILS); // lit l'état du BP et met la valeur 0/1 dans la variable

if (ETAT_ILS==FERMETURE){ // si la porte est fermée (c’est-à-dire si la variable état ILS = 0 
// Attention à bien utiliser == et non =

  digitalWrite(LEDROUGE,1); // allume la LED ROUGE
  digitalWrite(LEDVERT,0); // éteint la LED VERT

}

else { // sinon (c’est-à-dire si variable état ILS=1)

digitalWrite(LEDROUGE,0); // éteint la LED ROUGE
delay(100);
digitalWrite(LEDVERT,1); // allume la LED VERT
delay(100);
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

//                 Fin programme

11

Re : Bouton poussoir et carte sd

Tu peux commencer avec le site du zéro. Pour ta carte sd, je vais regarder ça de plus près.

Re : Bouton poussoir et carte sd

Bonjour,

Je  suis le conseil et, immédiatemment , je viens de commander la deuxième édition du livre, qui n'est en stock chez Cultura Bordeaux.

J'attends votre suite et une nouvelle fois merci pour ce conseil.

Guy.

Re : Bouton poussoir et carte sd

Bonjour à Grand Manitou et à Petit Scarabée*.

J’ai donc commencé mon apprentissage sur le site du zéro où, pour l’instant, je n’ai aucune difficulté.

À tous les deux, merci de m'avoir mis sur la bonne voie en m'évitant de poursuivre dans mes bévues. Celles-ci, en s’accumulant, auraient pu avoir comme résultat final, de me dissuader de poursuivre l'apprentissage de ce langage de programmation.

Dans l'attente de la réception du livre qui accompagne le cours, je continuerai de suivre les conseils que vous pourrez me donner.

Cordialement,

Guy.

* Pourquoi, « Scarabé » à la place de scarabée ! Où est le stratagème?

14

Re : Bouton poussoir et carte sd

/*
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4     
 */

#include <SD.h>

const int chipSelect = 4;

const int FERMETURE=0; // constante état de l'ILS
const int OUVERT=1; // constante état DE L4ils

const int ILS=2; //declaration constante de la broche ILS 
const int LEDVERT=3; //declaration constante de broche FERMETURE
const int LEDROUGE=6; //declaration constante de broche OUVERT

// Déclaration des variables globales

int ETAT_ILS=0; // variable d'état de la porte surveillée
int last-ils; // variable d'etat au passé
int i=1;
// Initialisation des fonctionnalités utilisées

// VI - FONCTION SETUP

// C’est le code d'initialisation. La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// Ce sont les instructions à exécuter au démarrage 

pinMode(ILS, INPUT); //met la broche en entrée
pinMode(LEDVERT, OUTPUT); //met la broche 3 en sortie
pinMode(LEDROUGE, OUTPUT); //met la broche 6 en sortie 

digitalWrite(ILS, HIGH) ; // activation du pullup de la broche en entrée
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  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.");

last-ils=ETAT_ILS;
} // fin de la fonction setup()

// VII - FONCTION LOOP

// la fonction loop coeur du programme () s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// Instructions à exécuter par le programme principal

ETAT_ILS=digitalRead(ILS); // lit l'état du BP et met la valeur 0/1 dans la variable

if (last-ils!=ETAT_ILS)
{
enregistrer(ETAT_ILS);
}

last-ils=ETAT_ILS;

if (ETAT_ILS==FERMETURE){ // si la porte est fermée (c’est-à-dire si la variable état ILS = 0 
// Attention à bien utiliser == et non =

  digitalWrite(LEDROUGE,1); // allume la LED ROUGE
  digitalWrite(LEDVERT,0); // éteint la LED VERT

}

else { // sinon (c’est-à-dire si variable état ILS=1)

digitalWrite(LEDROUGE,0); // éteint la LED ROUGE
delay(100);
digitalWrite(LEDVERT,1); // allume la LED VERT
delay(100);
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
void enregistrer(String etat)
{

  // 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(i);
    dataFile.print(";");
    dataFile.print(millis());
    dataFile.print(";");
    dataFile.print(etat);
    dataFile.println(";");
    dataFile.close();
    i++;
    // print to the serial port too:
    Serial.println(etat);
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}

Pas testé, et un peu brouillon, mais ça devrait fonctionner.

Re : Bouton poussoir et carte sd

Bonsoir, Grand Manitou et merci pour ces premières corrections que j’ai immédiatement commencé à étudier pour mieux comprendre.

Avant de tester le programme sur ma maquette, je l’ai vérifié avec l’Arduino. C’est ainsi que j’ai pu corriger ce lapsus de frappe,

int last-ils; // variable d'etat au passé, en la réécrivant : int last_ils;

Dans la sécance Loop la fonction suivante est signalé comme incorrecte, je l’ai donc modifié comme suit :

enregistrer(ETAT_ILS); est devenu :Serial.println(ETAT_ILS) Qu'en pensez-vous ?

En vérifiant à nouveau,  aucune erreur ne mettant signaler, je suis passé à la fonction moniteur où, à chaque O/F de la porte les deux leds fonctionnent correctement et une succession de un et de 0 s'inscrivaient, mais rien d’autre. Pareillement, rien ne s’inscrit sur la carte SD et aucun fichier ne s’ouvre.

Ci-après, copie de l’écran :

Initializing SD card...card initialized.
1
0
1
0
1
0
1

Merci pour votre diligence et votre précieuse aide.

Très cordialement,

Guy.

16

Re : Bouton poussoir et carte sd

/*
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4     
 */

#include <SD.h>

const int chipSelect = 4;

const int FERMETURE=0; // constante état de l'ILS
const int OUVERT=1; // constante état DE L4ils

const int ILS=2; //declaration constante de la broche ILS 
const int LEDVERT=3; //declaration constante de broche FERMETURE
const int LEDROUGE=6; //declaration constante de broche OUVERT

// Déclaration des variables globales

int ETAT_ILS=0; // variable d'état de la porte surveillée
int last_ils; // variable d'etat au passé
int i=1;
// Initialisation des fonctionnalités utilisées

void enregistrer(String etat)
{

  // 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(i);
    dataFile.print(";");
    dataFile.print(millis());
    dataFile.print(";");
    if (etat=1)
        {
        dataFile.print("fermeture");
        }
    else
        {
        dataFile.print("ouverture");
        }
    dataFile.println(";");
    dataFile.close();
    i++;
    // print to the serial port too:
    Serial.println(etat);
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}
// VI - FONCTION SETUP

// C’est le code d'initialisation. La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// Ce sont les instructions à exécuter au démarrage 

pinMode(ILS, INPUT); //met la broche en entrée
pinMode(LEDVERT, OUTPUT); //met la broche 3 en sortie
pinMode(LEDROUGE, OUTPUT); //met la broche 6 en sortie 

digitalWrite(ILS, HIGH) ; // activation du pullup de la broche en entrée
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  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);
  
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");

  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.print("Id");
    dataFile.print(";");
    dataFile.print("Heure"); // temps depuis que l'arduino est allumé. Remplacer plus tard avec l'implantation d'une vrai horloge
    dataFile.print(";");
        dataFile.print("Action");
    dataFile.println(";");
    dataFile.close();
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 

last-ils=ETAT_ILS;
} // fin de la fonction setup()

// VII - FONCTION LOOP

// la fonction loop coeur du programme () s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// Instructions à exécuter par le programme principal

ETAT_ILS=digitalRead(ILS); // lit l'état du BP et met la valeur 0/1 dans la variable

if (last_ils!=ETAT_ILS)
{
enregistrer(ETAT_ILS);
}

last_ils=ETAT_ILS;

if (ETAT_ILS==FERMETURE){ // si la porte est fermée (c’est-à-dire si la variable état ILS = 0 
// Attention à bien utiliser == et non =

  digitalWrite(LEDROUGE,1); // allume la LED ROUGE
  digitalWrite(LEDVERT,0); // éteint la LED VERT

}

else { // sinon (c’est-à-dire si variable état ILS=1)

digitalWrite(LEDROUGE,0); // éteint la LED ROUGE
delay(100);
digitalWrite(LEDVERT,1); // allume la LED VERT
delay(100);
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

Essais ça pour voir ?

Dernière modification par Rovhell (07-08-2013 07:23:28)

17

Re : Bouton poussoir et carte sd

Guy-Roland-Pierre a écrit:

Avant de tester le programme sur ma maquette, je l’ai vérifié avec l’Arduino. C’est ainsi que j’ai pu corriger ce lapsus de frappe,

int last-ils; // variable d'etat au passé, en la réécrivant : int last_ils;

Oui, désolé, erreur d'inattention.

Guy-Roland-Pierre a écrit:

Dans la sécance Loop la fonction suivante est signalé comme incorrecte, je l’ai donc modifié comme suit :

enregistrer(ETAT_ILS); est devenu :Serial.println(ETAT_ILS) Qu'en pensez-vous ?

La fonction enregistrer que j'ai créé n'avait pas été déclarée. C'est corrigé dans mon dernier post.

Guy-Roland-Pierre a écrit:

En vérifiant à nouveau,  aucune erreur ne mettant signaler, je suis passé à la fonction moniteur où, à chaque O/F de la porte les deux leds fonctionnent correctement et une succession de un et de 0 s'inscrivaient, mais rien d’autre. Pareillement, rien ne s’inscrit sur la carte SD et aucun fichier ne s’ouvre.

Ci-après, copie de l’écran :

Initializing SD card...card initialized.
1
0
1
0
1
0
1

Merci pour votre diligence et votre précieuse aide.

Très cordialement,

Guy.

Effectivement, rien n'était enregistré parce que ma fonction enregistrer n'était pas déclarée. Je l'ai positionnée un peu plus haut pour qu'elle soit déclarée avant le loop.

Re : Bouton poussoir et carte sd

Bonjour à tous et à Grand Manitou qui est toujours très agissant et efficace.

Depuis environ une heure je galère et bute à la première « vérification » de :

void enregistrer(String etat)

sur :  if (etat=1) {

Voici les indications du bas de page que je ne sais pas encore décrypter, puisque je n’ai pas fait d’Anglais ! (Mais cela va venir à force de répétition et de faire des minis programme).

sketch_aug07a.ino: In function 'void enregistrer(String)':
sketch_aug07a:41: error: invalid conversion from 'int' to 'const char*'
sketch_aug07a:41: error: initializing argument 1 of 'String& String::operator=(const char*)'
sketch_aug07a:55: error: expected `}' before 'else'
sketch_aug07a:55: error: expected `}' before 'else'
sketch_aug07a.ino: In function 'void setup()':
sketch_aug07a:100: error: 'last' was not declared in this scope
sketch_aug07a:100: error: 'ils' was not declared in this scope
sketch_aug07a.ino: In function 'void loop()':
sketch_aug07a:115: error: invalid conversion from 'int' to 'const char*'
sketch_aug07a:115: error: initializing argument 1 of 'String::String(const char*)'

Cela peut-il vous aider ?

Ci-joint le sketch le plus récent et modifié.

À bras ouverts,

Guy.

/*
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4     
 */

#include <SD.h>

const int chipSelect = 4;

const int FERMETURE=0; // constante état de l'ILS
const int OUVERT=1; // constante état de l'ILS

const int ILS=2; //declaration constante de la broche ILS 
const int LEDVERT=3; //declaration constante de la broche FERMETURE
const int LEDROUGE=6; //declaration constante de la broche OUVERT

// Déclaration des variables globales

int ETAT_ILS=0; // variable d'état de la porte surveillée
int last_ils; // variable d'etat au passé
int i=1;
int etat;// j'ai ajouté
// Initialisation des fonctionnalités utilisées

void enregistrer(String etat)
{

  // 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(i);
    dataFile.print(";");
    dataFile.print(millis());
    dataFile.print(";");
    
  if (etat=1) {
    dataFile.print("fermeture");
        }
    else
        {
        dataFile.print("ouverture");
        }
    dataFile.println(";");
    dataFile.close();
    i++;
    // print to the serial port too:
    Serial.println(etat);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}
// VI - FONCTION SETUP

// C’est le code d'initialisation. La fonction setup () est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// Ce sont les instructions à exécuter au démarrage 

pinMode(ILS, INPUT); //met la broche en entrée
pinMode(LEDVERT, OUTPUT); //met la broche 3 en sortie
pinMode(LEDROUGE, OUTPUT); //met la broche 6 en sortie 

digitalWrite(ILS, HIGH) ; // activation du pullup de la broche en entrée
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  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);
  
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");

  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.print("Id");
    dataFile.print(";");
    dataFile.print("Heure"); // temps depuis que l'arduino est allumé. Remplacer plus tard avec l'implantation d'une vrai horloge
    dataFile.print(";");
        dataFile.print("Action");
    dataFile.println(";");
    dataFile.close();
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 

last-ils=ETAT_ILS;
} // fin de la fonction setup()

// VII - FONCTION LOOP

// la fonction loop coeur du programme () s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// Instructions à exécuter par le programme principal

ETAT_ILS=digitalRead(ILS); // lit l'état du BP et met la valeur 0/1 dans la variable

if (last_ils!=ETAT_ILS)
{
enregistrer(ETAT_ILS);
}

last_ils=ETAT_ILS;

if (ETAT_ILS==FERMETURE){ // si la porte est fermée (c’est-à-dire si la variable état ILS = 0 
// Attention à bien utiliser == et non =

  digitalWrite(LEDROUGE,1); // allume la LED ROUGE
  digitalWrite(LEDVERT,0); // éteint la LED VERT

}

else { // sinon (c’est-à-dire si variable état ILS=1)

digitalWrite(LEDROUGE,0); // éteint la LED ROUGE
delay(100);
digitalWrite(LEDVERT,1); // allume la LED VERT
delay(100);
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

19

Re : Bouton poussoir et carte sd

Desolé, je suis sur iPad et ne peux pas compiler pour tester. C'est une erreur d'inattention de ma part. Retire la ligne int etat; que tu as ajouté. C'est plutôt dans void enregistrer(string etat) ou il faut remplacer string par int.

20

Re : Bouton poussoir et carte sd

Attention, erreur dans le code... Il faut écrire if (etat==1) et non if (etat=1)

Re : Bouton poussoir et carte sd

Re, à Grand Manitou et bonjour à tous les autres.

Rapidement une bonne nouvelle, la compilation s’effectue normalement.

Essais, avec le moniteur :

- Lors des manips de l'ILS, il n'y a que des 1 « un » qui s'inscrivent sur l'écran.

- Quant à la carte SD, autre bonne nouvelle, elle inscrit correctement ce qui est prévu.

- Le Numéro de l’opération.
- L’heure, que je reprendrai lorsque j’aurai acquis davantage de connaissance, en ajoutant une horloge RTC.
- La fermeture…, mais pas l’ouverture ! C’est le seul problème qui reste pour l’objectif  que je m’étais fixé pour « travailler » mon premier apprentissage…, grâce à vous.
- Les affichages se font bien à la suite. (Avec une carte de 2 Gb cela laisse une large autonomie.

Ce soir, dès la fin de ma journée de travail, je vais tenter de trouver l'erreur et de faire quelques modifications de présentations. (Par exemple insérer des sauts de lignes. J’ai appris à le faire avec le site du Zéro, mais en langage « C » et, peut-être, ce n’est pas le même script avec le langage Arduino.

Copie de ce qui s’inscrit sur la carte SD.

Id;Heure;Action;
1;268;fermeture;
Id;Heure;Action;
1;252;fermeture;
2;5268;fermeture;
3;6063;fermeture;
4;6899;fermeture;
5;6944;fermeture;
6;7560;fermeture;
7;7657;fermeture;
8;9473;fermeture;
9;9915;fermeture;
10;10930;fermeture;
11;11052;fermeture;
12;11667;fermeture;
13;11682;fermeture;
14;12098;fermeture;
15;12220;fermeture;

A+,

Guy.

Re : Bouton poussoir et carte sd

Bonjour, fking

Je viens de voir trop tard, votre message.

Ce soir, au retour du chantier en cours, je vais faire la modif du programme et vous répondrai.

Merci, fkiing.

Cordialement,

Guy.

Re : Bouton poussoir et carte sd

Bonsoir à tous,

Je viens de faire la correction proposée par fking, maintenant, cela marche correctement.

Une nouvelle fois, merci à tous.

Je vais, conjointement, poursuivre mon apprentissage sur le site du zéro et continuer l’application du « C » à l’Arduino et à ce programme pour avoir l’heure en temps réel.

Toutefois deux questions me turlupinent :

1 - En fonctionnement autonome, une alimentation de 5 v 2 A stabilisée que je possède, est-elle suffisante pour le uno + la platine SD +  l’horloge RTC que j’ai en projet d’ajouter, ou, dois-je appliquer à la lettre la fiche technique de Lextronic qui indique d’utiliser une alimentation extérieure stabilisée de 7 v à 20 v ! (Plus raisonnablement, j'envisage de faire une alimentation de 8 v stabilisés par un 7808. Qu’en pense la communauté ?)

2 - J’aurai besoin de conseil pour l’approvisionnement de la RTC. Lextronic,  propose une platine horloge temps réel à base de DS1307 (interface I2C™) Référence : BOB-0009. Il y a-t-il mieux ou un module spécifique qui s’enfiche sur le module de la SD.

Cordialement merci et bonne soirée.

Guy.

24

Re : Bouton poussoir et carte sd

Oui avec un double == c'est mieux, autant pour moi.
Donc,  j'ai mis des points virgules comme séparateur pour que tu puisse renommer ton fichier en .csv et l'importer directement dans exel. D'ailleurs tu peux le renommer directement dans le code, en remplaçant le .txt par .csv ça devrait pas poser de soucis.
Pour le module rtc, Semageek en vend.

Et pour l'alim, attention, si tu la branche dans la prise ronde, il faut minimum du 7v, jusqu'à 12v au max. Le 5 volt va pas marcher par la, seulement sur Vin.

Re : Bouton poussoir et carte sd

Bonjour à tous.

Tout d’abord, je reconnais ma bévue de ne pas avoir eu l’automatisme « boutique Semageek ». À ce sujet, ce premier survol de la boutique par un béotien - par rapport à d'autres - est sans conteste merveilleux, principalement, parce qu'il est en français avec des exemples qui vont me permettre d'assimiler plus rapidement les bases de la programmation de l'Arduino par la pratique.

- Message bien reçut pour l'alimentation. Je vais continuer mes essais en faisant deux alimentations, l’une à partir du secteur 230 v et délivrant du 8 volts stabilisé, une autre, par un pack de pile rechargeable 6 x 1,2 v soit une tension d’environ 7, 2 v.

- Après ma journée de travail, je vais faire des manips en csv avec Exel et Libre Office.

Je tiens la communauté au courant de ma progression et erreurs.

Cordialement à tous,

Guy.