Choisir pour vous ...

Pour choisir à ma place:

 

M me tot

 

      Qui n'a jamais entendu sa petite femme devant l'armoire, désespérée, dire en soupirant: "je n'ai rien à me mettre ..." Imaginez que j'ai parfois le même problème devant mes 2000 CDs et j'écoute souvent les mêmes ! Donc pour remédier à ce tourment proche de la dépression, l'électronique va me venir en aide, choisissant pour moi ce, avec quoi mes oreilles vont combler mes besoins ...La petite boîte va choisir à ma place, le CD que je vais écouter en m'indiquant son emplacement, dans le meuble, le rayon et la place du disque ! C'est surprenant et je crois que ça le serait encore plus si on l'adaptait aux vêtements, ça en deviendrait comique mais pas pour la personne qui les porte . 

      En appuyant sur un bouton du boitier, on va assurer sa mise en marche et le lancement du processus de choix; aussi longtemps qu'on gardera le doigt sur ce bouton, une boucle va renouveler sans cesse le tirage au sort sans le faire apparaître ( un peu comme la meule des lotos si vous fréquentez ces jeux de société). Ce n'est qu' au lâché que les dernières valeurs seront retenues .

      La génération de trois nombres aléatoires, limités et adaptés aux capacités des meubles de rangement va choisir pour moi l'endroit où est rangé le CD. Si vous voulez utiliser ceci chez vous, il faudra bien sûr adapter les limites de rangements de vos rayonnages ! Le premier nombre généré est la tour de rangement; Chez moi c'est de 1 à 15 . Le deuxième va cibler le casier concerné en hauteur. Là où le problème se corse, c'est que mes éléments n'ont pas tous le même nombre de casiers, et les mêmes dimensions, donc pas le même nombre de CDs dans chaque casier... Après avoir sorti le numéro du meuble, il faut adapter le nombre de rayons de chaque meuble (les 4 premiers en ont 10 et les autres en ont 6) ainsi que le nombre de disques ( 12 pour les 4 premiers et 26 pour les autres). Etant rentrés en machine, il est alors facile de générer deux autres nombres dans les limites précédemment définies .

      Dès la libération du bouton, l'affichage quitte la page d'accueil et indique la position géographique du CD. L'arrêt va se faire tout seul; en commençant, au bout d'un certain temps, par la diminution, jusqu'à l'extinction complète de l'écran puis la coupure du courant . Un deuxième bouton, le vert, va faire à peu près la même chose mais cette fois-ci pour les DVDs.

      Comme l'afficheur TFT inclus également un support de carte SD, je projetais d'y enregistrer les numéros de disques que la machine avait choisi afin d'éviter de désigner à nouveau ceux qui sont déjà passés, mais cela impose de garder l'alimentation active (fichier ouvert) pour chaque écriture sur la SD ; bonjour la consommation de piles a pressions 9 volts . J'ajouterai un correctif, si j'exploite cette fonction plus tard avec un mode sleep sur le micro contrôleur .

 

M me start1                M me chx 1

 

 

Comment ça marche ?

Le Schéma :

 

M me sch

 

      Deux éléments essentiels et une poignée de composants suffisent à faire vivre ce projet, adaptable à tout un éventail de possibilités; Le matériel, comme il est conçu, pourra servir à plein d'autres choses que celle-là ! Datalogger, lecteur de carte SD, borne d'information, la liste est ouverte ....

      On retrouve un classique Arduino Nano pour gérer toutes les fonctions, et un écran TFT de 1,8" pour l'affichage. L'avantage de cet afficheur est d'inclure dans son package un lecteur/enregistreur de carte SD, non utilisé ici, mais câblé tout de même afin de pouvoir s'en servir ultérieurement. Le rétro éclairage de l'écran est piloté par une sortie PWM (modulation de largeur d'impulsion ) du micro, interfacée par un transistor  2N2222 et sa résistance de base R7 de 2K2. Ceci va permettre d'ajuster l'éclairement à votre guise dans un souci de confort ou de prolongement de la durée de la pile . Un relais assure l'auto-maintient de l'alimentation (pour ne pas être obligé de garder le doigt sur le bouton) et la coupure automatique de celle-ci en fin d'utilisation. Ce relais est également commandé en courant par un 2N2222, limité à sa base par la R5 de 22K.

      Pour la mise sous tension, nous avons deux boutons poussoir, qui viennent shunter provisoirement le contact du relais via les diodes 1N4004 (D1 et D3). Les boutons, ayant pour rôle également de faire une sélection sur les entrées du microcontrôleur, viennent porter au potentiel de 5 volts ces dernières, à travers des résistances de limitations (R1 et R6) et des diodes zener (D2 & D4) pour la stabilisation à 4,8 volts. Les R3 et R4 servent de pull down lorsque les boutons sont en l'air.

 

Le Circuit Imprimé: 

M me brd

 

M me cmp

 

      Le circuit imprimé, bien qu'étant d'une seule face pour simplifier la réalisation, supporte les composants des deux côtés... Après avoir percé à 1 mm de diamètre tout les trous et à 3 le trou de fixation de l'écran, on commencera par souder les CMS sur la face 'soudure' puis les autres composants côté supérieur en terminant par le TFT et l'Arduino Nano .

M me ar

 

M me av

 

Le Sketch

      Donc nous allons utiliser l'IDE de chez Arduino fourni en freeware . Les commentaires étant relativement fournis, je n'apporterai que quelques remarques sur les lignes et ensembles de lignes du programme.

On commence par déclarer les sous-programmes des composants ( Puisqu'ils ont l'avantage d'exister on va les utiliser)!

// Bernard Leclerc 11/2017 Rev.:2

// Définition des pinuches de l'écran
#define TFT_PIN_CS   10 // Arduino-Pin an Display CS   
#define TFT_PIN_DC   9  // Arduino-Pin an A0
#define TFT_PIN_RST  8  // Arduino Reset-Pin

#include "Arduino.h"
#include <SPI.h>
#include <Adafruit_ST7735.h> // Adafruit ST7735 Library

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_PIN_CS, TFT_PIN_DC, TFT_PIN_RST);  // Display-Library Setup

 

      Ci-dessous, nous allons affecter les entrées/sorties utilisées en fonction du schéma ! Attention toutes ne sont pas permutables; certaines ont des fonctions bien dédiées et ne peuvent pas être associées à autres choses .

Ici on va également déclarer les variables utilisées dans le sketch

// Declaration des entrees et des variables 
int relay = 7;
int led = 5;
int sel = 2;
int sel2 = 3;
int m = 0;
int c = 0;
int d = 0;
int cm = 0;
int dm =0;
int n =200;

 

      Et la dessous les commandes exécutées une seule fois au début : Pour nous ce sera l'auto-maintient de l'alimentation par le collage du relais et l'initialisation de l'écran !

void setup()
{
digitalWrite(relay, HIGH); // Automaintien de l'alimentation par le relais
tft.initR(INITR_BLACKTAB);   // Initialisation ST7735-Chip
}

 

 

      Dans la boucle on va y mettre tout le programme qui doit être exécuté jusqu'à l'arrêt, si arrêt il y a, sinon c'est advitam éternam .... Les première instructions créent la page d'accueil sur l'écan.


void loop()
{

tft.fillScreen(ST7735_BLACK);// couleur du fond d'ecran
delay(200); // 0,2 secondes d'attente

//Tracé de la ligne verte
tft.drawLine(10,135,118,135,ST7735_GREEN);// drawLine(x_start,y_start,x_end,y_end,couleur);

//Ecriture du Copyright  
tft.setTextSize(1);// Réglage nouvelle grandeur de caracteres
  tft.setTextColor(ST7735_GREEN);// Reglage Nouvelle couleur de text
    tft.setCursor(18,140);// Position du nouveau texte
      tft.print("bernard.leclerc");// Ecriture du texte première ligne
    tft.setCursor(30,148);// Position du nouveau texte seconde ligne
  tft.print("@wanadoo.fr");// Ecriture du texte seconde ligne 
analogWrite(led, 200);// Allume l'écran en PWM a 80%  

//Ecriture du titre
tft.setTextSize(2);  // reglage grandeur de caracteres
   tft.setCursor(20,4);  // Définir la position du texte
     tft.setTextColor(ST7735_RED);// couleur du texte
        tft.print("Choisir");  // texte ecrit
     tft.setCursor(45,45);  // Définir la position du texte
   tft.setTextColor(ST7735_YELLOW);// couleur du texte
tft.print("Mon");  // texte ecrit

 

      Sur cette partie là, on va s'inquiéter de l'état des boutons; sont-ils pressés et si oui, lequel; avec saut au sous programme si l'un ou l'autre est actif !
if (digitalRead(sel)){ //Si le bouton 1 est pressé => Sous-programme
  goto cdchoice;  
}
if (digitalRead(sel2)){ //Si le bouton 2 est pressé => Sous-programme
  goto dvdchoice;  
}

 

      Premier s/programme choix du CD
cdchoice:
tft.setTextSize(4);  // reglage grandeur de caracteres
  tft.setCursor(35,80);  // Définir la position du texte
     tft.setTextColor(ST7735_WHITE);// couleur du texte
  tft.print("CD");  // texte ecrit
delay(200); // 0,2 secondes d'attente

//Choix des positions
while (digitalRead(sel)) { // Boucle tant que le bouton 1 est pressé, 
m = random(1,16); //generation de nombres aléatoires du meuble
  if (m < 5) { // Configuration géographique du nombre de casiers par meuble
    cm = 11;
    dm = 11; // Configuration géographique du nombre de disquess par casier
  }
  else {
    cm = 7;  // Configuration géographique du nombre de casiers par meuble
    dm = 26; // Configuration géographique du nombre de disquess par casier
  }
c = random(1,cm); //generation de nombres aléatoires du casier
d = random(1,dm); //generation de nombres aléatoires du disque
}


//Ecriture du titre
tft.fillScreen(ST7735_BLACK);
tft.setTextSize(2);  // reglage grandeur de caracteres
  tft.setTextColor(ST7735_BLUE);// couleur du texte
         tft.setCursor(25,4);  // Définir la position du texte
            tft.print("MEUBLE:");  // texte ecrit
         tft.setCursor(50,25);  // Définir la position du texte
      tft.print(m);  // texte ecrit
  tft.setTextColor(ST7735_WHITE);// couleur du texte
tft.setCursor(30,50);  // Définir la position du texte
  tft.print("CASE:");  // texte ecrit
    tft.setCursor(50,75);  // Définir la position du texte
      tft.print(c);  // texte ecrit
        tft.setCursor(25,100);  // Définir la position du texte
      tft.setTextColor(ST7735_RED);// couleur du texte
    tft.print("DISQUE:");  // texte ecrit
  tft.setCursor(50,125);  // Définir la position du texte
tft.print(d);  // texte ecrit

delay (5000);
goto arret; 

 

Deuxième s/programme choix du DVD

dvdchoice:
tft.setTextSize(4);  // reglage grandeur de caracteres
  tft.setCursor(35,80);  // Définir la position du texte
     tft.setTextColor(ST7735_WHITE);// couleur du texte
  tft.print("DVD");  // texte ecrit
delay(200); // 0,2 secondes d'attente

//Choix des positions
while (digitalRead(sel2)) {// Boucle tant que le bouton 2 est pressé, 
m = random(1,3); //generation de nombres aléatoires du meuble
  if (m < 2) { 
    cm = 7; // Configuration géographique du nombre de casiers par meuble
    dm = 23; // Configuration géographique du nombre de DVD par casier
  }
  else {
    cm = 5; // Configuration géographique du nombre de casiers par meuble
    dm = 56; // Configuration géographique du nombre de DVD par casier
  }
c = random(1,cm); //generation de nombres aléatoires du casier
d = random(1,dm); //generation de nombres aléatoires du DVD
}


//Ecriture du titre
tft.fillScreen(ST7735_BLACK);
tft.setTextSize(2);  // reglage grandeur de caracteres
  tft.setTextColor(ST7735_BLUE);// couleur du texte
         tft.setCursor(25,4);  // Définir la position du texte
            tft.print("MEUBLE:");  // texte ecrit
         tft.setCursor(50,25);  // Définir la position du texte
      tft.print(m);  // texte ecrit
  tft.setTextColor(ST7735_WHITE);// couleur du texte
tft.setCursor(30,50);  // Définir la position du texte
  tft.print("RANG:");  // texte ecrit
    tft.setCursor(50,75);  // Définir la position du texte
      tft.print(c);  // texte ecrit
        tft.setCursor(35,100);  // Définir la position du texte
      tft.setTextColor(ST7735_RED);// couleur du texte
    tft.print("DVD:");  // texte ecrit
  tft.setCursor(50,125);  // Définir la position du texte
tft.print(d);  // texte ecrit

delay (5000);

goto arret; 

 

?Arrêt progressif par diminution de l'éclairage et coupure de l'alimentation lorsque il est éteint .
arret:

 delay (200);
  analogWrite(led, n);// Allume l'écran en PWM a n%
  n = n - 1; // extinction progressive
  if (n < 2) { goto fini; } //Saute au final si pratiquement éteind
  goto arret; 

fini:
  delay (5000);
digitalWrite(relay, LOW); // Coupure de l'alimentation
      
}

 

 

      Dans le fichier zipé suivant, vous trouverez tous les éléments décris plus haut, pour reproduire ce montage; N'oubliez pas que le lecteur de carte est câblé et que la partie hardware peut faire plein d'autres choses !

M meM me (26.65 Ko)

 

 

 

M me tot1

 

 

Ajouter un commentaire