Boîte à histoires

Bonjour,

Je travaille en médiathèque et je réalise une boîte à histoires : lorsque l'on appuie sur un bouton un texte s'imprime grâce à une imprimante reliée à l'arduino. Je le sers du code suivant cependant dès que je branche l'imprimante le texte s'imprime sans s'arrêter, je n'ai même pas besoin d'appuyer sur le bouton ce qui est très problématique... J'ai bougé le bouton, changé le numéro de la broche mais ça ne change rien... Auriez vous une idée ? Merci à vous :relaxed: !

/*
Ce programme s'appuie sur le travail mené par Giles Booth (http://www.suppertime.co.uk/blogmywiki/2012/10/howtopoems/) 
et la dadaist poetry box réalisée par robottini (http://robottini.altervista.org/dadaist-poetry-box)
Ce programme est placé sous licence Creative Commons NC-BY-SA : https://creativecommons.org/licenses/by-nc-sa/2.0/fr/
julanimtic : http://blog.animtic.fr
 
 Boîte à histoires V1.1 05-03-2016
*/

#include <avr/pgmspace.h> // appel de la bibliothèque pour stocker les données sur la mémoire flash de la carte

//placez ici le titre de l'oeuvre
const char string_0[] PROGMEM = "Viens  \n";   
const char string_1[] PROGMEM = "La langue du Youshlaouna \n";
const char string_2[] PROGMEM = "Il est tres chouette votre theatre \n";
const char string_3[] PROGMEM = "Quelle chance \n";

// placez le texte de votre histoire/poème ici
// le texte doit être sur une seule ligne, voir le wiki du projet pour le formatage du texte et des caractères spéciaux
const char string_4[] PROGMEM = "Ma main paume vers le sol,\n tombe de bas en haut.\n Ma main paume vers le ciel, \n se replie vers moi. \n Mes doigts se replient \n sur ma main.\n Ma main se replie \n sur elle-meme. \n Mon index se replie sur \n mon poing ferme.\n Mon coude se replie. \n Ma tete dodeline. \n Mes yeux roulent. \n";   
const char string_5[] PROGMEM = "La langue du Youshlaouna. \n La langue du Chiang-ien.  \n La langue du Choubouloutone.  \n La langue du Touroukoukoulou. \n La langue du : Kana:Kana. \n La langue du Tchigatchigatchiga \n La langue du rororo, \n du Bleubleubleu, \n du Fleufleufleu. \n La langue du C est bon \n c est bon \n c est bon. \n";
const char string_6[] PROGMEM = "Bonjour tout le monde.\n Je suis tres content pour vous \n vous rencontrer jourdhui. \n Bon… Je tsui je vous remercie. \n Et tres bonne je suis tres chouette \n votrou… votrou… voutrou… theatre. \n Je vous remercie et bonn journée en r voir. \n";
const char string_7[] PROGMEM = "Quelle chance d etre \n au pays vertueux \n des droits de l’homme, \n  baigne dans la lumiere \n de l esprit des hauts nivellateurs \n tel mon bon docteur  \n Joseph Ignace Guillotin. \n Chacun est libre \n de s exprimer comme il peut \n pourvu qu il ne blesse \n physiquement \n quand la propriete chaque jour \n offense la pauvrete \n des sous-pauvres \n dans un air sature d azote.\n";

//fin du mode histoire


// Tableau des textes

const char* const string_table[] PROGMEM = {string_0, string_1,string_2,string_3,}; // si besoin compléter les valeurs string manquantes 
const char* const string_table1[] PROGMEM = {string_4, string_5,string_6, string_7,}; // si mode cadavre exquis commentez pour désactiver

char buffer[1040];    // assurez-vous que la valeur indiquée soit supérieure au nombre maximum de caractères d'un string

int chiffreal = 0; // définit le nom de la valeur aléatoire pour déterminer le texte à utiliser

//appel de la bibiothèque de l'imprimante, voir le tutoriel d'utilisation de l'imprimante sur adafruit : https://learn.adafruit.com/mini-thermal-receipt-printer
#include "Adafruit_Thermal.h"
#include "SoftwareSerial.h"
#define TX_PIN 6 
#define RX_PIN 5

SoftwareSerial mySerial(RX_PIN, TX_PIN); 
Adafruit_Thermal printer(&mySerial);    

 //une led est utilisée pour vérifier le bon fonctionnement du bouton. Ce n'est pas obligatoire. 
const int buttonPin = 2;     // le numéro de la broche utilisée par le bouton
const int ledPin =  13;      // le numéro de la broche utilisée par la led
int buttonState = 0;         // variable pour vérifier l'état du bouton 

//fonction intégrant les différents textes à imprimer appelés ici vers 1, vers 2, ...
void vers1 () {

chiffreal = random(0,4); // sélectionne un string entre 0 et 4 

  {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[chiffreal]))); // copie le string sélectionné aléatoirement de la table string_table
    printer.println(buffer); //imprime le string situé dans le buffer de la carte
    delay( 1000 ); // patiente une seconde
   }
  }

  void vers2 () {
  {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table1[chiffreal]))); // copie le string sélectionné aléatoirement de la table string_table1
    printer.println(buffer);
    delay( 1000 );
   }
  }

void setup() {
  // défini la broche de la led comme une sortie
  pinMode(ledPin, OUTPUT);
  // défini la broche du bouton comme une entrée
  pinMode(buttonPin, INPUT);
  // initialise l'imprimante
  mySerial.begin(19200);
  printer.begin();
}

void loop() {
  // vérifier l'état du bouton
  buttonState = digitalRead(buttonPin);

  // Si le bouton est pressé
  if (buttonState == HIGH) {
    // Allume la led
    digitalWrite(ledPin, HIGH);
    printer.wake(); //réveille l'imprimante
    printer.feed(1); // déroule le papier sans imprimer
    printer.boldOn(); // met le texte en gras
    vers1(); // imprime le premier texte
    vers2(); // imprime le second texte ...
//    vers3(); // en fonction du nombre d'éléments à afficher décommentez cette ligne. Si vous souhaitez afficher plus d'éléments pensez à créer la fonction correspondante plus haut (ex ici void vers4)
    printer.feed(1);
    printer.println("Laurent Colomb \n Vocabul\x82s"); // placez ici votre signature
    printer.boldOff(); // fin du texte en gras
    printer.feed(2);
  printer.sleep(); //met en sommeil l'imprimante
    
  } 
  else {
    // éteins la led et ne fais rien 
    digitalWrite(ledPin, LOW);


 }
  
 }

hello
comment est câblé ton Bouton Poussoir

Voici le schéma de montage. J'ai testé le bouton seul et ça fonctionne...

testes en rajoutant cette ligne

void loop() {
  // vérifier l'état du bouton
  buttonState = LOW;
  buttonState = digitalRead(buttonPin);

Merci ! je viens de tester c'est pareil... Dès que je branche, l'imprimante se lance...

j'ai changé ma breadboard et ça fonctionne ! Merci à ceux qui ont réfléchi à mon souci :slight_smile:
bonne journée !

Ce n'est peut-être pas la breadboard la coupable mais le bouton poussoir qui était probablement tourné d'un quart de tour.