Choisir pour vous ...
Pour choisir à ma place:
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 .
Comment ça marche ?
Le Schéma :
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é:
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 .
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 me (26.65 Ko)
Ajouter un commentaire