Projet Secret'box : inter à Clé + écran LCD

Bonjour à tous,

J'ai un grand besoin de l'aide de la communauté arduino.

En effet j'ai un projet qui me tiens à coeur et j'ai besoin de vos lumière pour le rendre réalité.
Je suis un débutant et n'ai personne dans mon entourage qui connaissent la programmation Et je me retrouve bien vite dépassé.

Je vous présente mon projet : La secret'box.

Le matériel dont je dispose (je n'ai pas encore acheté le servomoteur...)

C'est pour l'anniversaire d'un ami (prévu pour mars !!). Il s'agirait d'une boite fermé à clé
En gros pour ouvrir la boite, il faut qu'il trouve 4 clés, les insèrent pour actionner
un servomoteur qui rends accessible le cadeau qu'il y a à l'intérieur.

Je voudrais qu'a chaque clé insérée, un message s'affiche sur l'écran LCD
disant : il vous reste "tant" de clé à trouver

et qu'ensuite le programme vérifie que les 4 clés sont bien insérer pour pouvoir
actionner un servomoteur (serrure).

Serait-il possible de m'aider à écrire le code pour un tel projet.
au moins pour une clé ?

J'ai réussi à faire fonctionner mon écran LCD branché en I2C.
(à faire fonctionner un hello world etc...).
Mais je buche vraiment sur le code. et la manière de faire interagir tout ça.

J'ai vu qu'il ne fallait pas forcement de résistance pour faire fonctionner un interrupteur (à clé dans mon cas) avec le code suivant :

void setup () {
pinMode (cleA, INPUT);
digitalWrite (cleA, HIGH)
}

Est-ce que ça marche vraiment ?

J'espère que vous aller pourvoir m'aider.
Je reste disponible pour plus de précision, si je n'ai pas été assez clair sur certain point.

Amicalement
doudom

Salut,

doudom:
J'ai un grand besoin de l'aide de la communauté arduino.
(...)
Je voudrais qu'a chaque clé insérée, un message s'affiche sur l'écran LCD
disant : il vous reste "tant" de clé à trouver
et qu'ensuite le programme vérifie que les 4 clés sont bien insérer pour pouvoir
actionner un servomoteur (serrure).

Tes serrures se comporteront effectivement comme des interrupteurs.
Il te faut relier chaque interrupteur à une des entrées analogiques de l'arduino, et dans ta boucle principale les tester une par une.
Par exemple (non testé !) :

#define NBCLES 4
const int pin_cles[NBCLES]={2,3,4,5}

void setup() {
  int f;
  // Initialisation des entrées
  for(f=0;f<NBCLES;f++){
    pinMode(pin_cles[f], INPUT);
    digitalWrite (pin_cles[f], HIGH)
  }
}

void loop(){
  int f;
  int cles_restantes=NBCLES;
  // Testons chaque clés
  for(f=0;f<NBCLES;f++){
    if(digitalRead(pin_cles[f])==LOW){
      cles_restantes--;
    }
  }
  // Affichage des résultats sur le LCD
  affichage_il_reste_n_cles(cles_restantes);
  // Si on a le compte, c'est gagné
  if(cles_restantes==0){
      ouverture_coffre();
      // boucle sans fin
      do {
        delay(1000);
      } while(1);
  }
}
}

Enfin c'est l'idée générale.

churchill

Merci infiniment pour ton aide Churchill.
J'ai commencé à regarder le code que tu as écris.
J'ai essayé d'y intégrer le code du lcd et vérifier le petite point virgule qui manquait.

Quel est la bonne syntaxe pour l'affichage des résultats sur le LCD svp ?
J'ai essayé ça :

lcd.print("il reste_n_cles"(cles_restantes));

Mais ça me retourne une erreur : il reste_n_cles cannot be used as a function
si j'enlève 'il reste_n_cles cannot". Il y a juste le chiffre des clés manquantes qui s'affiche et fonctionne parfaitement avec mes inters (yes !!)

Merci encore pour l'aide que tu peux m'apporter !

#include <LiquidCrystal.h>
#include <Wire.h>

#define NBCLES 4
const int pin_cles[NBCLES]={2,3,4,5};

LiquidCrystal lcd(0);

void setup() {
  int f;
  // Initialisation des entrées
  for(f=0;f<NBCLES;f++){
    pinMode(pin_cles[f], INPUT);
    digitalWrite (pin_cles[f], HIGH);
    {
  lcd.begin(16,4);
  lcd.print("welcom secret'box !");
}
  }
}

void loop(){
  int f;
  int cles_restantes=NBCLES;
  // Testons chaque clés
  for(f=0;f<NBCLES;f++){
    if(digitalRead(pin_cles[f])==LOW){
      cles_restantes--;
    }
  }
{
  lcd.setCursor(0, 1);
  lcd.print("il reste_n_cles"(cles_restantes));
  }
}

un truc du style :

lcd.print("il reste ");
lcd.print(cles_restantes);
lcd.print(" clés");

Pour le retour à la ligne, il y a println

Merci taddot pour l'information.

Par contre si je met le code suivant à la fin, le chiffre des clés restantes (sous l'action des inters) ne bouge plus, il reste sur le chiffre 4, est-ce normale ? Pour le moment je l'ai supprimé et ça remarche

do {
        delay(1000);
      } while(1);

La fonction printin si elle s'écrit bien comme cela

lcd.printin();

Ne fonctionne pas chez moi.
D'ailleurs l'affichage de l'écran est un peu bizarre, j'ai 4 lignes, mais exemple : la 2ème lignes s'inscrit sur la 3ème, rien sur la 2ème...etc
Je me suis arrangé avec des espace pour mettre le texte ou je voulais, c'est pas commode, mais ça fait l'affaire.
Je crois avoir lu sur internet qu'il s'agissait d'un problème avec la librairy et qu'il y avait pas grand chose à faire.... mais bon, c'est pas trop grave

Par contre si je veux faire sonner un petit buzzer à chaque clés insérer, je fais comment ? Je voudrais le brancher sur la broche 13.

au départ je m'y prendrais comme cela, c'est bon ou j'ai rien compris ? :

int buzzer= 13;

void setup(){

pinMode(buzzer, OUTPUT);
}

void loop(){

digitalWrite(buzzer, HIGH);
}

J'imagine qu'il faudrait rajouter une condition "IF", du style si les clés sont HIGH faire sonner Buzzer, mais je n'ai pas encore compris comment le traduire par le code.

Dernière question, pour le servomoteur, le code à mettre se serait quoi ? (Vérification des 4 clés insérée, si OK, actionner le servomoteur de "tant de degrés....)

Je suis désolé, j'apprends en même temps que les instructions que je reçois. Je fais aussi des recherches, mais mes connaissances en programmation sont vraiment très limitées...

En tout cas, je vous remercie encore de votre aide. Je vois que c'est vraiment faisable et j'ai hâte que cela prenne forme.

Doudom qui espère réaliser son projet de cadeau !!

Bonjour,

Je ne connais pas grand chose en programmation mais j'ai l'impression que le lcd.println devrait fonctionner si tu mets un L (minuscule a l'avant derniere lettre) sinon avec un i ca aurait donné lcd.printin

Attention a la syntaxe des fois ca peut poser des problemes en programmation ^^

dans le désordre :

  • Println (avec un L) et pas printin (avec un i)
  • pour le buzzer, je sais pas, mais je pense qu'il faut le raccorder sur une entrée analogique, peut-être via un transistor en saturation, car je suis pas sur que tu puisse attaquer directement.
  • pour les lignes du lcd, c'est lié à la gestion de l'espace mémoire de ton LCD. Certains gèrent cela comme un tableau en 2 lignes (au lieu de 4 lignes comme cela pourrait sembler logique) :
<lignelcd1><lignelcd3>
<lignelcd2><lignelcd4>

ou

<lignelcd1><lignelcd2>
<lignelcd3><lignelcd4>

je sais plus (regarde dans les archives du (ancien) forum, il y a topic qui en parle)

Effectivement mcvovol54,

j'avais pris le L pour un i. Il reconnaît bien la fonction maintenant. Merci :wink:
Même si çà ne fait pas grand chose apriori.

J'ai régler le problème de ligne avec des

lcd.setCursor(0, 0); ou (0,1) ou (0,2) ou (0,3)

pour placer le texte sur les lignes ou je le voulais vraiment (c'est mieux que les espaces !!!)

ok taddot

Je regarderais ton code pour voir si c'est plus pratique.

Merci pour ton aide.

Salut doudom,

Sympa ton projet! XD
6 mois après, tu peux faire un petit bilan?

Tu as réussi à le finir à temps? :~ tu as eu des soucis?
Si tout à bien marché, peux-tu poster ton code pour des personnes qui auraient une idée similaire et tagger sujet comme terminé?

Merci d'avance