lm 7805 pour cube led

Portrait de magmasanne

Bonjour; puis je utiliser un lm 7805 pour alimenter en 5 volt un cube de led 8x8x8 que j'ai monté. aurais je assez d'Ampère?

J'ai lu qu'il fallait 4 Ampère, comment dois je calculer? 512 led x 0.02A?

d'après le datasheet c'est 1.5A donc c'est pas bon, que puis mettre à la place pour transformer les 12 volts de mon alimentation?

Merci

Portrait de GEEK

Bonjour

Quel est ton schéma électronique pour piloter ces 512 LEDs ? Si tu n'utilises pas de multiplexage il va te falloir une alimentation de plus de 11 A mini (512 x 0.02 = 10.24 A). si tu utilises le multiplexage tu peux diviser par 8 soit 64 x.0.02 = 1.28 A alors un LM7805 sur dissipateur suffit.

Un  Arduino n'est pas prévu pour alimenter autant de LEDs il te faut un driver même pour 64 LEDs

Portrait de Walter

Effectivement difficile de te répondre précisément sans connaître ton schéma et la façon dont tu pilote tes LEDs, surtout qu'il y a pas mal de composant pour le faire.

Pour une matrice 8x8, j'utilise des registres à décalage (74HCT595N) qui normalement si j'ai bien compris ne devrait pas supporter plus de 75mA au total, mais qui supporte bien les 8*20mA lorsque toutes les LEDs sont allumés sur mes tests, en tout cas je ne me rappel pas avoir utilisé de transistor, il faudrait que je vérifie, mais j'ai pas testé sur de long temps en tout cas.

Beaucoup d'exemple sur le net de cube semble utiliser un 74HC138.

En tout cas, si tu mène ton projet à bout, n'hésite pas a faire un post dans la section "Projets réalisés"

Portrait de magmasanne

Bonjour, désolé de ne pas avoir répondu plus tôt, j'ai eu des soucis de connection google et internet, impossible de télécharger un fichier. J'ai fini ce cube de led, j'irai le mettre dans projet réalisé dès que j'ai un moment. Je me bas avec le klaxon de mon sprinter, je dois trouver la panne. je joint le fichier doc du schéma électrique du câblage et aussi un lien vers la video. je n'ai pas tout à fait fini, j'ai deux ligne qui ne s'allume pas, je pense avoir un mauvais contact dans deux registres 74 hc 595. à ce projet j'ai juste ajouté la télécommande avec un superhétérodyne 433 mHz plus un bc 547. le reste à été empreinté sur you tube.. Je pense pouvoir mettre un LM7805 d'après ce que vous dites? je vais tenter de faire un cube 8x8x8 rgb, c'est autre chose au niveau des cartes, il y en a bcq et 25 registres. L'électronique, c'est un rêve de gosse que je réalise grace à internet et aux composant pas cher et facilement accéssible, ainsi que les tutos. voici la video: https://drive.google.com/open?id=11HTFsPHTHK-D8GIVuBKv6VdGEPOm6vbG

Portrait de Walter

Bravos, très belle réalisation, pour la programmation des animations tu as fait du code spécifiques ?

Portrait de magmasanne

Bonjour; j'ai utilisé un code arduino trouvé sur github, depuis you tube sur les tutos d' electronic demon ou harry le ou encore alex gyver  great scott fait des trucs pas mal aussi, un led cube 5x5x5 avec des led rgb 2 pins.

Portrait de GEEK

Des LEDs RGB 2 pins ?? Comment cela peut il marcher ?

Je connais les LEDs rouge vert et jaune en deux fils, le courant passant dans un sens = vert,, dans le sens inverse = rouge et d'une manière alternative jaune. mais RGB je pense que c'est impossible. Il existe des LEDs avec un bus 2 fils mais en plus du + et - !!

Cubes monté Aliexpress

De plus piloter individuellement 8x8x8x3 soit 1536 LEDs avec un Arduino je ne pense pas que l'on puisse faire des animations très rapides et au niveau du code il faut être unchampion !

Portrait de magmasanne

dsl ,j'ai fait une erreur, il m'avait semblé qu'il utilisait des leds rgb 2 pins mais non, 4 pins. j'ai visionné vite fait et j'avais cru voir deux connections sous le socle.

Portrait de Walter

A priori il utilise des LED 4 broches, mais pilotable avec une seul broche (DIN), chaînable via la broche D0, les deux autres du milieu étant l'alimentation.
Pourrais faire une évolution sympa de ton projet.

 

Portrait de magmasanne

quelle évolution? du programme arduino? c'est sur que plus de figure serait sympa mais je ne sais pas ecrire les programmes, je vais apprendre mais le temps me manque pour l'instant Si il y avait des cours du soir d'informatique et de programmation, j'en prendrai volontiers, c'est plus rapide que d'apprendre seul connais tu un livre bien expliqué pour l 'arduino? J'ai commencé à apprendre sur" zeste de savoir" mais j'ai remis à plus tard je n'ai que le dimanche pour faire de l'electronique, le soir je fais des devis ou je suis trop fatigué

Portrait de Walter

Je voulais dire passer en LED RGB serait une belle évolution.
Non je n'ai pas eu l'occasion de voir de livre d'initiation à programmation d'arduino.
Je trouve que sur ce site https://www.locoduino.org/ les articles sont très pertinents.

Pour moi plus qu'un livre pour apprendre, le mieux est la pratique sur des projets simples.
Par exemple piloter 5 LEDs via 5 broches de l'arduino(puis  utiliser une seul broche) et gérer l'animation soit même est un exercice tout à fait formateur, qui t'apprend les variables, les instructions conditionnelles et les boucles, ....
Faire un robot mobile avec un capteur à ultrason est aussi très instructifs

Après n'hésite pas à demander de l'aide si tu bloque sur des notions.

Portrait de magmasanne

Oui, j'ai déjà acheté tt les composant pour la voiture robot, je vais le faire un de ces jours mais je vais faire le cube rgb 8x avant. mon premier projet était de faire fonctionner un esp 8266, j'ai galéré 2 mois, l'arduino méttait un temps fou à télécharger le programme et je n'attendais pas car je pensais qu'il y avait un problème. je suis parti un jour en laissant le telechargement se faire et en revenant ça fonctionnait. Ce'st bête!

Portrait de Walter

Tu as dû configurer la vitesse du port séries à 9600, normalement je crois que tu peux mettre une vitesse plus rapide.
Si tu veux jouer avec des esp8266 prend quelque chose comme ça https://fr.aliexpress.com/item/32656775273.html?spm=a2g0o.cart.0.0.457d3c00UaAEUv&mp=1
Comme ça tu ne passe pas par ton arduino.
Tu peux même prendre un esp32 si le bluetooth t'intéresse.

Portrait de magmasanne

oui, un esp 32 c'est ce que j'ai utilisé, il est toujours programmé et près à l'emploi si j'en ai besoin, je réactive tout les mois sur no ip. à ce propos j'ai une question, si je veux utiliser 2 esp chez moi avec la possibilité de les activer depuis n'importe où dans le monde, ce n'est pas possible car je ne peux utiliser qu'un seul port 80!  je n'avais pas trouvé de réponse à cette question.. c'était pour le cas ou je voudrai utiliser un esp classique integré sur un relais et un esp 32. J'ai 4 bouton sur mon smartphone qui active mon esp 32, ça fonctionne mais j'aurai voulu ajouter une caméra  j'ai abandonné ou remis à plus tard. .

Portrait de Walter

Ha du coup pourquoi tu passe par ton arduino pour le programmer ?
Tu peux choisir la vitesse de transfert normalement dans l'éditeur Arduino ?

Je suppose que sur ton routeur ADSL tu as mappé le port 80 sur celui de ton esp(port 80 de l'IP de ton ESP)?
Dans ce cas il suffit que tu choisisse un autre port port ton autre ESP (ex 81 ou 8080 ou autre) et que tu fasse la même chose sur ton routeur ADSL pour celui-ci.

Portrait de magmasanne

la vitesse de transfert est le "baud"?

J'ai fait ça il y a plus d'un an mais je me souviens qu'il y avait le port écrit ds le programme, j'avais changé par 8080 mais ça n'avait pas marché ou alors j'ai omis de le changer ds le programme.  

En faisant mes recherches j'avais trouvé cette solution, ça me revient maintenant.

au moins je sais maintenant que c'est la soluce..

Merci pour tes conseils, Je me suis fait aussi une boite aux lettres à ouverture électronique avec keypad et ecran LCD 2 lignes, j'y ai ajouté un superhétérodyne 433 mhz pour la sonnette et pour le compteur d'ouverture de trappe ou porte. Suite à un vol de colis aliexpress, par mon voisin qui a un passe, j'ai été obligé de faire ça. le facteur à le code, c'est là depuis  2018 et ça fonctionne toujours, je me suis aussi fabriqué un keypad avec 16 boutons car les keypad aliexpress finissent par déconner.

lorsque le facteur ouvre la trappe ou la boite, un canard porte clef reconverti fait coin coin pour m'avertir et le compteur indique le nombre d'ouverture. sur la vidéo ile 433 mhz n'était pas encore installé.

https://www.youtube.com/watch?v=7jKE9yWWRVc

Portrait de Walter

Oui c'est ça par défaut on utilise une valeur standard de 9600 bauds, mais tu peux normalement mettre bien plus (115200 voir 200000 et des bananes).
 

Très jolie boite à lettre, de même que pour ton cube, n'hésite pas a en faire un sujet dans "Projet réalisé"
Coté consommation/autonomie cela donne quoi ?

Portrait de GEEK

.

Portrait de magmasanne

pas les bananes, si j'en mange une, je transpire des gouttes grosses comme le bout de l'anulaire et j'ai un mal de ventre terrible, le premier signe est un chatouillement dans la gorge comme Thierry Lermite.J'ai mangé ma dernière banane en 81. Je n'ai jamais osé en manger une autre depuis.

mon montage consomme 3 18650 / semaine mais je vais remplacer le relais par une puce C005 et un transistor, ça consommera moins. en appuyant sur le bouton, le relais ferme le circuit durant 30 sec durant lesquels le lcd affiche et l'arduino est actif ainsi que le relais qui envoie les 12 volt vers le solénoide

les 18650 font un peu moins de 3000 mAh. je crois avoir une conso de 15 mA en hors service et 75 en service. si mes souvebir sont bon.

je ferai une nouvelle video de tout ça lorsque j'aurai refais un circuit moins gourmand et je le mettrai en projet réalisé avec le cube. Bien qu'une charge par semaine n'est pas contraignant.

le 433 mHz et les piles du solenoide sont rechargé tout les 3/4 mois, ça consomme pas du tout..

Portrait de GEEK

magmasanne, peux tu nous donner le nom de ton provider internet : Orange, Bouygues, Free, SFR ou Numericable etc...

Si je te demande cela c'est pour te donne la marche à suivre pour faire des transferts de port et ainsi te permettre de mettre plus de ESP32 que tu ne voudras jamais en mettre accessibles aussi bien depuis ton réseau wifi que depuis n'importe où dans le monde via le réseau internet.

Pour ce qui est de ta boite au lettre il est possible de passer à aucune consommation lorsque tu ne l'utilises pas. Par contre peux tu accéder aux batteries si celles-ci sont complètement vides ?

Portrait de magmasanne

Bonjour; j'étais et je suis tjrs occupé avec mon pare brise de sprinter, la baie était rouillé, j'ai fait enlevé le pare brise et j'ai décaper et mastiqué les trous , j'ai ajouté un transformateur de rouille pour être sur que ça ne rouillera plus. coût 250€ pour un pare brise neuf et son joint. ils me demandaient 800€ chez carglass, ils peuvent offrir les essuie glace à ce prix. chez france pare brise ils m'ont dit " on traite la rouille au framéto, ça s'arrête là". en préparant la baie moi même, je suis sur que se sera bien fait.

je suis chez bouygyes avec l'adsl fil de cuivre, j'ai même pas la tv mais j'ai iptv qui fonctionne moyen souf le soir, freeze à toute les chaînes..

la batterie qui alimente l'arduino et le lcd est une box avec 3 18650 dedans dont voici le lien, le problème avec ces box c'est qu'il ne délivre pas en permanence 5 volts, la tension baisse à 2 volt env après 10 sec si il n'est pas sollicité, du coup l'affichage du minuteur s'allume et s'éteint sans arrêt.

quel solution as tu? je suis très intéressé. Merci

https://fr.aliexpress.com/item/32787714527.html?spm=a2g0o.detail.1000014.21.60e61c44jlbUFp&gps-id=pcDetailBottomMoreOtherSeller&scm=1007.13338.136569.000000000000000&scm_id=1007.13338.136569.000000000000000&scm-url=1007.13338.136569.000000000000000&pvid=8c50d233-911c-4862-b491-7aa1a06e1060

Portrait de Walter

Oui c'est le problème avec les batteries externes, elle se "coupe" lorsqu'il n'y a pas de demande.
Dans ton cas ce que propose GEEK pour ne pas avoir de consommation, devrait sûrement pouvoir faire que ta batterie se vide alors dans une charge qui la fasse revenir au 5V et alimenter du coup ton arduino.

Après sinon tu achète 3/4 batterie 18650 avec un régulateur de charge qui consomme peu et tu fait sortir ton arduino de sommeil en mettant la broche adéquat à l'état haut via ton bouton poussoir.
Ton arduino est en 5V ou 3.3V?
Les batteries
Le regulateur

Portrait de GEEK

nouveau

Dans ton cas ce que propose GEEK pour ne pas avoir de consommation, devrait sûrement pouvoir faire que ta batterie se vide alors dans une charge qui la fasse revenir au 5V et alimenter du coup ton arduino.

Tu as un décodeur ? Je n'ai rien compris, comment la batterie se décharge toute seul ? Il serait bon de se relire avant de poster !!!!

Portrait de Walter

J'ai bien indiqué se vide dans une charge, Donc pas toute seule, il serait bon de lire complément les messages avant de poster :).
Comme je ne sais pas si le relais suffit à réveiller la batterie, une charge en série avec ton bouton poussoir devrait sûrement le faire?
Je pense que cela devrait aussi marcher avec un arduino en veille ?
 

Portrait de GEEK

Là je comprends plus besoin de décodeur !

Portrait de Walter

:) Cool, reste à voir ce qu'il faut mettre pour sortir la batterie de veille, quelques mA de consommation doivent suffire.

Portrait de magmasanne

elle se décharge par l'action du facteur et de la batterie qui passe sans arret de 2.5 volt à 5 volt puis l'inverse, plus l'affichage de la miuterie ( 0.02A)

Portrait de magmasanne

5 volts, tout le circuit l'est

Portrait de magmasanne

Bonjour; j'avais déjà vu ces régulateur sur aliexpress sans trop savoir à quoi ils servent et comment les utiliser.

comment se branche le régulateur? deux entrées deux sorties + -?

Portrait de GEEK

Pour avoir zéro consommation quand ton système n'est pas opérationnel il suffit de rajouter un relais et un bouton poussoir. La bobine du relais est commandée par une des sorties de l'Arduino. Le contact travail (normalement ouvert) relie le + de la batterie à l'Arduino et aux autres consommateurs . De se fait quand l'Arduino est hors tension le relais est ouvert et aucun courant n'est consommé. Le bouton poussoir normalement ouvert aussi est en parallèle sur le contact ouvert du relais. Lorsque tu maintiens deux secondes environ l'Arduino est alimenté et la première chose à exécuter dans le code c'est de passer la sortie de ce même Arduino qui pilote le relais à l'état haut et cela avec une temporisation.

Ce qui fait que lorsque tu veux ouvrir ta boite au lettre tu maintiens le BP deux secondes et le reste de ton programme devient opérationnel pendant la temporisation. Cette dernière peut être réinitialisée  lorsque tu actionnes une touche du clavier par exemple.

Le code :

unsigned long Tempo;
int DelaiTempo = 10000; // dix secondes par exemple !!
int PortRelais = 8 ; // ici 8 mais n'importe quel port peut convenir
bool action;
/* La suite de tes déclarations */
void setup() {
  pinMode(PortRelais, OUTPUT);
  digitalWrite(PortRelais, HIGH);
  Tempo = millis() + DelaiTempo;
  /* La suite de ton setup */

}

void loop() {
  if (millis() > Tempo) {
    digitalWrite(PortRelais, LOW); // Si le délai est dépassé l'alimentation de l'ensemble est coupée par le relais
  }
  /* La suite de ton code */

  /* Si tu veux rajouter dix secondes pour toute action que tu fais dans le laps de temps de la tempo
     rajoute le code ce qui suit:
     
  if (action == true) { // par exemple "action" est l'appui d'une touche sur le clavier
    Tempo = millis() + DelaiTempo; // ce qui te laisse à nouveau dix secondes pour une autre action etc...
  }
  */
      }

Si je n'ai pas été clair n'hésite pas à poser tes questions

Portrait de magmasanne

je n'avais pas vu  ta réponse, en faite je remplace ma minuterie par un relais supplémentaire.

J'avoue que je ne sais pas exactement où mettre ce code ds le code existant, tout en haut de setup puis en  haut de void loop? je vais faire un montage chez moi pour tester. c'est vrai que là il n'y aura aucune consommation, c'est super car quand il touche la clavier, le temps se remet au début, donc 10 secondes suffit.

Evidemment puisque c'est la première action de l'arduino, le code va en haut. je vais me débrouiller, je pense pouvoir insérer le code.

donc mon void loop sera:

void loop(){

if (millis()> tempo){

digitalWrite (portRelais, LOW);

if (action==true) {

Tempo = millis() + Delais Tempo;

}

la suite de mon void loop, la ponctuation est bonne?

j'essayerai ça dimanche. Merci

Portrait de GEEK

Poste ton code je le modifierai pour toi !

Portrait de magmasanne

c'est très gentil de ta part, je vais le faire et je te l'enverrai pour correction si ça ne marche pas, il faut que j'apprenne. je t'avais envoyé mon schéma électrique ainsi que le code, tu ne l'as pas reçu? je l'avais envoyé depuis ma boite gmail magmasanne en "répondre" à la notification d'une réponse à mon post. peut etre qu'on ne peut pas répondre de cette façon? je dois tout transformer en" doc" si je veux envoyer qq chose depuis ici?

je suis intrigué par le moins de la batterie sur ton schéma, je dois le brancher à cette endroit obligatoirement ? car il est le" -" général de l'arduino?

Portrait de GEEK

Le moins tu peux le connecter à la pin GND, c'est vrai que c'est plus logique !

(C'était pour voir si tu suivais MDR !! )

Attention le mot "action" c'est uniquement pour te faire comprendre, tel quel cela ne veut rien dire !!!

J'aurais dû être plus explicite !

Prenons comme exemple que dans ton code (que e n'ai pas reçu) un bouton poussoir qui serait entre la pin 8 et GND. Avec 8 en INPUT_PULL !!!

ton  code initial serait :

if (digitalRead(8) == LOW) ;
{
   //le reste de ton code
}

il faut le modifié comme suit :

if (digitalRead(8) == LOW) ;
{
   Tempo = milis()+DelaiTempo ;
   //le reste de ton code pour cette "action"  "action étant ici :  if (digitalRead(8) == LOW)
}

Suis-je plus clair ?

Tu devrais regarder toutes les vidéos d'Alex elles sont superbement bien faites !! et d'une qualité parfaite.

Portrait de magmasanne

oui je regarderai les videos,  voici mon code, tout compte fais je veux bien que tu l'insère parce que comme tu as vu j'y comprends encore rien mais c'est vrai que j'ai pas bcq chercher à apprendre jusque là, j'aimerai mais je dois trouver le temps, au moins d'en apprendre un peu:

le code

#include <LiquidCrystal.h> //include LCD library (standard library)
#include <Keypad.h> //include keypad library - first you must install library (library link in the video description)
//#define LedRouge 10 //define the LED pins
//#define LedVerte 12
#define LedRouge 11 //define the LED pins
#define LedVerte 12

char* password     = "1234"; //create a password
int position       =  0; //keypad position
int vitesse        = 50;
byte BoucleAttente = 15;//15*50=750ms tempo cadencement scroll ecran
const byte rows    =  4; //number of the keypad's rows and columns
const byte cols    =  4;
byte PositionEtoile =  0;
char keyMap [rows] [cols] = { //define the symbols on the buttons of the keypad
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

//byte rowPins [rows] = {1, 2, 3, 4}; //pins of the keypad
//byte colPins [cols] = {5, 6, 7, 8};

byte rowPins [rows] = {2, 3, 4, 5}; //pins of the keypad
byte colPins [cols] = {6, 7, 8, 9};

Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, rows, cols);
//  pins of the LCD.(RS,  E, D4, D5, D6, D7)
//LiquidCrystal lcd (A0, A1, A2, A3, A4, A5);
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
void setup() {
  Serial.begin(115200);
  lcd.begin(16, 2);
  pinMode(LedRouge, OUTPUT);  //set the LED as an output
  pinMode(LedVerte, OUTPUT);
  premier_affichage();
  setLocked (true); //state of the password
}
void loop()
{
  for (int positionCounter = 0; positionCounter < 8; positionCounter++)
  {
    lcd.scrollDisplayRight(); // scroll one position right:
    attente();
  }

  for (int positionCounter = 0; positionCounter < 8; positionCounter++)
  {
    lcd.scrollDisplayLeft();// scroll one position left:
    attente();
  }
  saisie_code();//Serial.println(nom[f]);
}

void saisie_code()
{ //Serial.print(password [position+1]);Serial.print("....");Serial.println(position);
  char toucheSaisie = myKeypad.getKey(); //define which key is pressed with getKey
  if (toucheSaisie)
  { PositionEtoile++; lcd.setCursor(PositionEtoile + 4, 1); lcd.print("* ");
    Serial.print(position); Serial.print("  "); Serial.println(toucheSaisie);
    if (toucheSaisie == '*' || toucheSaisie == '#' || toucheSaisie == 'A' ||      //define touche non valides
        toucheSaisie == 'B' || toucheSaisie == 'C' || toucheSaisie == 'D')
    {
      position = 0;//Serial.println(position);
      setLocked (true);                       //on ferme
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" ENTER PASSWORD ");//lcd.print(toucheSaisie);
      delay(1000);
      asm volatile ("  jmp 0");
    }
    if (toucheSaisie == password [position]) //si le chiffre attendu est ok, on incremente le compteur
    {
      position ++;
    }
    if (position == 4)
    { //si le compteur = 4
      setLocked (false);                      //on ouvre
      lcd.clear();
      //lcd.setCursor(0, 0);
      lcd.print("*** Code Bon ***");
      delay(3000);
      lcd.clear();
      lcd.setCursor(5, 0);
      lcd.print("MERCI");
      lcd.setCursor(1, 1);
      lcd.print("Bonne journee.");
      delay(3000);
      asm volatile ("  jmp 0");
    }
  }
}

void setLocked(int locked)
{
  if (locked)
  { //on ferme
    digitalWrite(LedRouge, HIGH);
    digitalWrite(LedVerte, LOW);
  }
  else
  { //on ouvre
    digitalWrite(LedRouge, LOW);
    digitalWrite(LedVerte, HIGH);
    delay(2000);                  //impulsion de 2 secondes sur la led/gache/solenoide
    digitalWrite(LedRouge, HIGH);
    digitalWrite(LedVerte, LOW);
  }
}
void attente()
{
  for (int a = 0; a <= BoucleAttente; a++)
  {
    delay(vitesse); saisie_code();
  }
}
void premier_affichage()
{ lcd.clear();//lcd.setCursor(0, 1);lcd.print("            ");
  lcd.setCursor(4, 0); lcd.print("L MARION n4");
  lcd.setCursor(3, 1);
      lcd.print("0680184xxx");
  for (int positionCounter = 0; positionCounter < 2; positionCounter++)
  {
    lcd.scrollDisplayLeft();// scroll one position left:
    attente();
  }
  lcd.setCursor(4, 1);
}

et voici un lien vers mon schéma.

:https://drive.google.com/file/d/1nmTwWohA8Vd8Uu1I54cIQym0AI6Qn6ll/view?u...

Portrait de magmasanne

PS, je n'ai pas de step down comme indiqué sur le schéma, j'ai une alim en 5 volts

Portrait de GEEK

Voilà ce que j'ai modifié est entre des lignes comme celles-ci :

/******************************************/

Par contre je n'ai pas pu vérifier n'ayant pas le matériel nécessaire, mais dis moi ci cela fonctionne ou quels sont les problèmes.

Par contre je trouve ce code bien compliqué et un tantinet obscure, il y a moyen de faire beaucoup plus simple, eni je crois car je n'ai pas encore écrit une ligne mais si j'ai une petite heure je pense te le soumettre.

Une dernière chose quel est la nécessité d'utiliser un ecran LCD c'est pour faire beau ?

#include <LiquidCrystal.h> //include LCD library (standard library)
#include <Keypad.h> //include keypad library - first you must install library (library link in the video description)
#define LedRouge 11 // the LED pins
#define LedVerte 12

/******************************************/
unsigned long Tempo;
int DelaiTempo = 10000; // dix secondes par exemple !!
#define PortRelais 10 // numero du port sur lequel raccorder le nouveau relais
/******************************************/

char* password     = "1234"; //create a password
int position       =  0; //keypad position
int vitesse        = 50;
byte BoucleAttente = 15;//15*50=750ms tempo cadencement scroll ecran
const byte rows    =  4; //number of the keypad's rows and columns
const byte cols    =  4;
byte PositionEtoile =  0;
char keyMap [rows] [cols] = { //define the symbols on the buttons of the keypad
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins [rows] = {2, 3, 4, 5}; //pins of the keypad
byte colPins [cols] = {6, 7, 8, 9};

Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, rows, cols);
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
void setup() {

  /******************************************/
  pinMode(PortRelais, OUTPUT);
  digitalWrite(PortRelais, HIGH);
  Tempo = millis() + DelaiTempo;
  /******************************************/

  Serial.begin(115200);
  lcd.begin(16, 2);
  pinMode(LedRouge, OUTPUT);  //set the LED as an output
  pinMode(LedVerte, OUTPUT);
  premier_affichage();
  setLocked (true); //state of the password
}
void loop()
{

  /******************************************/
  if (millis() > Tempo) {
    digitalWrite(PortRelais, LOW);
  }
  /******************************************/

  for (int positionCounter = 0; positionCounter < 8; positionCounter++)
  {
    lcd.scrollDisplayRight(); // scroll one position right:
    attente();
  }

  for (int positionCounter = 0; positionCounter < 8; positionCounter++)
  {
    lcd.scrollDisplayLeft();// scroll one position left:
    attente();
  }
  saisie_code();//Serial.println(nom[f]);
}

void saisie_code()
{ //Serial.print(password [position+1]);Serial.print("....");Serial.println(position);
  char toucheSaisie = myKeypad.getKey(); //define which key is pressed with getKey
  if (toucheSaisie) {

    /******************************************/
    Tempo = millis() + DelaiTempo;
    /******************************************/

    PositionEtoile++; lcd.setCursor(PositionEtoile + 4, 1); lcd.print("* ");
    Serial.print(position); Serial.print("  "); Serial.println(toucheSaisie);
    position = 0;//Serial.println(position);
    setLocked (true);                       //on ferme
    if (toucheSaisie == '*' || toucheSaisie == '#' || toucheSaisie == 'A' ||      //define touche non valides
        toucheSaisie == 'B' || toucheSaisie == 'C' || toucheSaisie == 'D')
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" ENTER PASSWORD ");//lcd.print(toucheSaisie);
      delay(1000);
      asm volatile ("  jmp 0");
    }
    if (toucheSaisie == password [position]) //si le chiffre attendu est ok, on incremente le compteur
    {
      position ++;
    }
    if (position == 4)
    { //si le compteur = 4
      setLocked (false);                      //on ouvre
      lcd.clear();
      //lcd.setCursor(0, 0);
      lcd.print("*** Code Bon ***");
      delay(3000);
      lcd.clear();
      lcd.setCursor(5, 0);
      lcd.print("MERCI");
      lcd.setCursor(1, 1);
      lcd.print("Bonne journee.");
      delay(3000);
      asm volatile ("  jmp 0");
    }
  }
}

void setLocked(int locked)
{
  if (locked)
  { //on ferme
    digitalWrite(LedRouge, HIGH);
    digitalWrite(LedVerte, LOW);
  }
  else
  { //on ouvre
    digitalWrite(LedRouge, LOW);
    digitalWrite(LedVerte, HIGH);
    delay(2000);                  //impulsion de 2 secondes sur la led/gache/solenoide
    digitalWrite(LedRouge, HIGH);
    digitalWrite(LedVerte, LOW);
  }
}
void attente()
{
  for (int a = 0; a <= BoucleAttente; a++)
  {
    delay(vitesse); saisie_code();
  }
}
void premier_affichage()
{ lcd.clear();//lcd.setCursor(0, 1);lcd.print("            ");
  lcd.setCursor(4, 0); lcd.print("L MARION n4");
  lcd.setCursor(3, 1);
  lcd.print("0680184xxx");
  for (int positionCounter = 0; positionCounter < 2; positionCounter++)
  {
    lcd.scrollDisplayLeft();// scroll one position left:
    attente();
  }
  lcd.setCursor(4, 1);
}

Portrait de magmasanne

Bonjour; j'ai testé avec mon code où tu as ajouté le tempo (30/08 à 13h07) mais la led verte ne s'allume pas, ça ne s'éteint pas au bout de 10 sec mais env 40 sec après  sauf si j'appuie sur A/B/C/D/# ou*, s'éteint après 6 secondes

le nouveau code que tu as écris est trop compliqué pour le facteur car quand il se fait remplacer il doit expliquer au remplaçant donc il faut quelque chose de simple, un code à 4 chiffre qui allume la led verte, squand le code est donné dans l'ordre, même dans une série de chiffre, tel que ça se passe dans mon code actuel.

mais tu ne l'as pas écrit pour rien car je le conserve pour une alarme que je dois faire.

donc si tu pouvais revoir le premier code du 30/08 à 13h07, se serait sympa, la rallonge de 10 seconde si appuie sur une touche n'est pas obligé, 30 seconde suffit pour tout.

j'ai fait une video pour te montrer:

https://drive.google.com/open?id=17qq_nq9qGMpmlLAlL3IlXPP3sl3LQvHi

Portrait de GEEK

Tu peux mettre le code que tu veux ! il te suffit de mettre celui de ton choix dans la variable Secret.

Exemple : Secret ="1234";

J"ai mis cette instruction en gras dans le code pour que tu puisses la repérer facilement !

Portrait de magmasanne

Merci bcq, je n'aurais pas su l'écrire correctement, j'aurai oublié de définir la pin 10, en plus il fallait insérer un delaiTempo en dessous de void saisie_code.

le delaiTempo signifie 10000 millisecondes. c'est génial tout ça, vivement que j'en sache plus.

je vais tester tout ça dimanche et je te donnerai le résultat mais ça devrait fonctionner..

je peux aussi ajouter des sons associer au touche du clavier ?

Portrait de GEEK

Oui tu peux ajouter des sons mais pour le moment restons sur ce projet !!

Je suis entrain d'écrire un code sur un simulateur, je t'en ferais part !

Portrait de GEEK

Chose promise....

Avec le simulateur utilisé on ne peut simuler la coupure de l'alimentation du circuit, mais le schéma plus haut donne la solution

Attention comme l'Arduino Nano n'est pas disponible dans le simulateur les PINS 2 et 13 sont à modifier dans ton code  respectivement 11 et 10 !!

  • La LED verte représente l'état du relais d'alimentation.
  • La LED jaune représente l'état de la gâche électrique.
  • Les touches de 0 à 9, A, B est * (étoile) sont disponibles pour créer le code secret
  • La touche D efface le dernier caractère saisi (Delete)
  • La touche C efface la totalité du code (Clear)
  • La touche # lance la vérification du Code saisi
  • Toutes les touches redonnent dix secondes de plus avant de couper l'alimentation du circuit

Le code est affiché sous la vidéo il est documenté ligne à ligne j'espère qu'il est clair pour toi et qu'il te servira à comprendre l'ensemble de son principe, si tu ne piges pas tout donne moi les points qui bloquent !

Il est possible de compléter le programme pour sonoriser les touches et aussi de modifier " in situ "  le code secret

geek

Le code :

#include <LiquidCrystal.h> // Library du LCD
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); // Attribution des pins pour le LCD

unsigned long Tempo; // Variable du temps alloulé pour valider le code
int DelaiTempo = 10000; // Valeur d'incrément de la tempo à chaque appui sur le clavier
#define PortRelai 13 // pin pour la commande du relais
#define PortGache 2 // pin pour la commande de la gâche
int L, C; // Variable correspodants à la ligne et à la colonne du clavier
String Saisie, Code, Secret = "1234A"; // Caractère Saisi, Code saisi, Valeur du code secret
String Touche[5][5] = {{"", "", "", "", ""}, {"D", "D", "C", "B", "A"}, {"", "#", "9", "6", "3"}, {"", "0", "8", "5", "2"}, {"", "*", "7", "4", "1"}};
// Tableau de léquivalence des Caractères en onction de la touche actionnée

void setup() {
  pinMode(PortRelai, OUTPUT);   digitalWrite(PortRelai, HIGH); // Configuration du port Relai et mise à l'état Haut
  pinMode(PortGache, OUTPUT);  digitalWrite(PortGache, LOW); // Configuration du port Gâche et mise à l'état Bas

  delay(500);
  for ( L = 4; L < 8; L++) { // Configuration du port des Lignes du Clavier et mise à l'état Haut
    pinMode(L, OUTPUT);
    digitalWrite(L, HIGH);
  }
  for ( C = 8; C < 12; C++) { // Configuration du port des Colonness du Clavier et mise à l'état Hautn par résistance interne (PULLUP)
    pinMode(C, INPUT_PULLUP);

  }
  Tempo = millis() + DelaiTempo; // Attribution du temps à la tempo
  lcd.begin(16, 2); // Déclaration du nombre de caractères et lignes du LCD
}

void loop() {

  while (Tempo > millis()) { // Tant que la varaible tempo est supérieure au temps depuis que l'Arduino est sous tension
    Clavier(); // Activation du Clavier
  }
  digitalWrite(13, LOW); // Si la condition ci dessus n'est plus respectée la relai est désactivé
}

void Clavier() {
  for (L = 4 ; L < 8; L++) { // on passe à létat bas tour à tour une ligne du clavier
    digitalWrite(L, LOW); //    ""           ""         ""           ""         ""
    for (C = 8; C < 12; C++) { // on lit la valeur des colonnes du clavier
      if (digitalRead(C) == LOW) { // si elle passe à l'état bas c'est que la touche correspondant est appuyée (court circuit entre L et C)
        Tempo = millis() + DelaiTempo; // On ajoute du temps à la tempo
        Saisie = Touche[L - 3][C - 7]; // La valeur Saisi est récupérée dabs le tableau de correspodance des touches en onction de la ligne et la colonne
        if (Saisie == "D") // Si D est appuyé on efface le dernier caractère saisi
          Code = Code.substring(0, Code.length() - 1); // ""        ""        ""
        else if (Saisie == "C") // Si C est appuyé on efface tout le code saisi
          Code = "";            // ""    ""     ""      ""          ""
        else if (Saisie == "#") // Si # est appuyé on lance la vérification du code par la fonction VerifCode
          VerifCode();
        else                    // pour tout autre caractère on le rajoute à la variable Code
          Code = Code + Saisie;
        lcd.setCursor(0, 0); // positionnement du caractère 0 de la ligne 0 su LCD
        lcd.print(Code + "                     "); // Affichage du code saisi les espaces qui suivent servent à effacer les traces de l'ancien code
        while (digitalRead(C) == LOW) { // Tant que la touche n'est pas relanchée on tourne en rond
          delay(20);
        }
      }
    }
    digitalWrite(L, HIGH); // on repasse la ligne à l'état haut avant de passer à la ligne suivante
  }
}

void VerifCode() {
  lcd.clear(); // effacement de l'afficheur LCD
  int Position = (16 - Code.length()) / 2; // calcul de la position pour le centrage de l'affichage du code
  lcd.setCursor(Position, 0); // Positionnement du curseur sur cette position
  lcd.print(Code); // affichage du code sur le LCD
  lcd.setCursor(0, 1);// Positionnement due curseur sur la ligne du bas premier caractère
  if (Code == Secret) {  // si le Code correspond à la variable Secret
    lcd.println("Ouverture Boite "); // on affiche ce message
    digitalWrite(PortGache, HIGH); // on actionne la Gâche
  }
  else // si non
    lcd.println("Le code est faux"); // on affiche que le code est faux

  delay(2000); // on attend 2 secondes
  digitalWrite(PortGache, LOW); // On relache la gâche
  Code = "";
  Tempo = millis() + DelaiTempo; // on rallonge la tempo
  lcd.clear(); // on efface le LCD
}

Espérant avoir été clair !

Portrait de magmasanne

Bonjour; j'ai téléchargé ce dernier code que tu as réécrit, bcq de temps pour faire tout ça dit moi? avec la video très bien faite d'ailleurs! j'ai déclaré portGache13 et portRelai12.

tu as déclaré un keypad 5x5?

j'ai le A à la place du 3, B/6, C (éffacement)/8 et le tempo ne fonctionne pas, le keypad n'est plus utilisable après le delais.

j'ai lu ton code mais je ne vois pas où tu déclare les pins pour le keypad, j'ai vu sur la video qu'ils sont entre d4 et d11

l'affichage des chiffres me permet de constater que le keypad que j'ai fabriqué fonctionne correctement.

si je connecte la pin 2 du bouton push sur le vin de l'arduino, ça ne fonctionne pas correctement, il faut le connecter sur le + 5 volts.

en tout cas, merci bcq pour le temps que tu prends pour moi, c'est vraiment sympa et j'espère pouvoir te rendre service à mon tour. Je suis couvreur zingueur, il ne t'arrive pas une tuile? lol

Portrait de Walter

Oui le tableau à deux dimensions représentant le keypad est de 5x5.
le code semble à correcte comme ça pour la lecture, le Touche[L - 3][C - 7];" L de 4 à 7 et C de 8 à 11
lit les éléments du tableau 5x5 de l'indice 1 à 4 (premier élément avec l'indice 0) pour le premier ensemble et de 1 à 4 pour le deuxième élément.
Donc le premier tableau avec les "" est ignoré, ainsi que le premier elements des autres tableaux.
Tu n'a rien changé?

La déclaration du clavier est dans la fonction setup()

for ( L = 4; L < 8; L++) { // Configuration du port des Lignes du Clavier et mise à l'état Haut
    pinMode(L, OUTPUT);
    digitalWrite(L, HIGH);
  }
  for ( C = 8; C < 12; C++) { // Configuration du port des Colonness du Clavier et mise à l'état Hautn par résistance interne (PULLUP)
    inMode(C, INPUT_PULLUP);

  }

La première boucle déclare les broches 4, 5, 6, 7 en sortie et les positionne à HIGH
La première boucle déclare les broches 8, 5, 6, 11 en entré connecté avec une résistance au +5

En espérant avoir pu un peu d'aider

Portrait de magmasanne

non, mis à part le portRelai et gache

Portrait de GEEK

Je suis certain que mon code fonctionne donc tu as un problème quelque part !

Le code que j'ai posté est celui que j'ai mis dans le simulateur donc il y a un hic chez toi.

De plus dans ta vidéo tu commences par appuyer sur un BP qui n'existe pas sur le schéma que tu nous as fournis sous ton code ???

pour ce qui est des tuiles de mon toit tout va bien :o)

Tu es dans quelle région pour ma part je suis en Rhône Alpes, mais il faut savoir que nous sommes quatre sur ce même pseudo, tous dans un rayon d'environ 40 km mais seulement deux d'entre nous sont assidus sur ce site, un lyonnais et un de la banlieue de Bourgoin-Jallieu.

Portrait de magmasanne

j'ai téléchargé mon code d'origine pour voir si mes branchements sont ok, tout fonctionne. 

 sur ton code l'appuie sur 3 affiche un A à l'écran, le 6 un B et le 9 éfface tout. l'appuie sur les lettres ne donne rien. un BP c'est un bouton push?

c'est quoi ton simulateur? ça m'as l'air bien, pas besoin de faire de montage. où est ce que les pins du keypad sont déclarées ds ton code?

je suis de Royan, charentes maritime mais je suis ch'ti, j'habite ici depuis une trentaine d'années. y'a plus de soleil, moins humide, moins froid, y'a pas photo c'est mieux..

je vais essayer cette semaine d'insérer la temorisation ds mon code d'origine sans action sur les touches, en mettant juste 30 secondes de fonctionnement car je pense que l'afficahge du lcd s'emmêle les pinceaux, il ne faut pas grand chose pour que ça ne fonctionne pas mais ça me plait bcq et je vais consacrer mon hiver à apprendre la programmation arduino. C'est pour ça que ton simulateur m'interesse.

Portrait de Walter

je t'ai répondu sur la déclaration des broches, regarde mon post un peu plus haut :)
 

Si tu continue à avoir le décalage joue avec l'instruction "Touche[L - 3][C - 7];"

en mettant C-8 par exemple, mais cela voudrait dire que tu as que 4 élément dans ton deuxième tableau.
c'est dire {"D", "C", "B", "A"} au lieu de {"D", "D", "C", "B", "A"}

Portrait de magmasanne

c'est tinkercad le simulateur, j'ai deja un compte pour les objet en 3d, je ne savais pas que ça faisait simulateur arduino, c'est cool! j'ai refais le circuit en simulateur tel que je l'avais fait sur la video que je t'ai envoyé et j'ai inséré en texte ton code mais ça ne marchait pas. j'ai enlevé le câble rw vers gnd du lcd et ça marche, la boite s'ouvre mais la led verte reste allumé. le code inséré est le nouveau que tu as réécrit.

quel est le problème selon toi?

Portrait de GEEK

Dans Tinkercad la simulation du temps est catastrophement longue regarde le compteur en haut vers le haut de l'écran tu auras les secondes et 1/100 de seconde pour cette raison j'ai remplacer dans ce simulateur

DelaiTempo = 10000;     par DelaiTempo =500 ;

Tu verras que le code est bon !

Pages