Arduino Mega Shield [LCD + 4 boutons]

Bonsoir à tous, je viens vous présenter le shield que je viens de finir.


Arduino Mega LCD Shield par DIY Effixe, sur Flickr

Un LCD 16x2, 4 boutons poussoirs et un potard pour le contraste du LCD.

J'ai conçu le shield sur fritzing, le fichier .fzz est téléchargeable sur le site fritzing/projects


Arduino Mega LCD Shield_bb par DIY Effixe, sur Flickr


Artduino Mega LCD Shield_pcb par DIY Effixe, sur Flickr

[edit]je viens de me rendre compte que sur les schémas du dessus il manquait une connection que j'ai refaite sur le shield. il manque un lien entre une pin du LCD et le gnd. le pb est corrigé sur le .fzz mais j'ai pas réuploadé les shémas[/edit]

sinon, ça fonctionne bien, j'ai maintenant quelques soucis avec du code. ça concerne le projet de développeuse de films argentiques, pour en savoir plus sur le projet, c'est là : diyautolab.blogspot.com

J'ai besoin de développer un menu assez simple dans un premier temps. il faut que je puisse choisir entre trois type de développement : C41, E6 et NB, un fois cette partie validée il faut choisir la température de développement, C41 : 25°C, 38°C et custom ; E6 : 38°C et custom ; NB Stand et custom. Donc là on choisit la température de process et en choisissant custom, on arrive sur un troisième niveau du menu qui change la variable de température.

Viendront surement plus tard une autre partie au menu qui sera dédié à la gestion des pompes (qu'il faut encore que je trouve) pour purger le système manuellement.

pour l'instant j'ai quelque chose d'assez fonctionnel bien que pas encore terminé et surement optimisable. Je lutte un peu par manque de connaissance du langage et de la logique de codage.
Je voulais vous en faire part pour avoir vos avis éclairés de codeurs inventifs.

/*
DEVUINO AutoLab: developpement semi-automatique de photos
MAJ : 18/09/2011
*/

/*
Aruino Mega LCD Shield for DIY Jobo Atl by Effixe
The circuit:
LCD :

  • LCD RS pin to digital pin 48
  • LCD Enable pin to digital pin 46
  • LCD D4 pin to digital pin 44
  • LCD D5 pin to digital pin 42
  • LCD D6 pin to digital pin 40
  • LCD D7 pin to digital pin 38
  • LCD R/W pin to ground

4 push buttons
Button 01 (prev) to digital pin 41
Button 02 (next) to digital pin 39
Button 02 (exe) to digital pin 43
Button 02 (cancel) to digital pin 37
*/

// Chargement des fonctions

#include <LiquidCrystal.h> // Ecran LCD

// DECLARATION DES CONSTANTES

// création du caractère °
byte degree[8] = {
B00010,
B00101,
B00010,
B00000,
B00000,
B00000,
B00000,
};

// Identification des boutons du LCD Arduino Mega
const int B_Prev = 41;
const int B_Next = 39;
const int B_Exe = 43;
const int B_Cancel = 37;

// DECLARATION DES VARIABLES

// Initialisation du LCD
LiquidCrystal lcd(48, 46, 44, 42, 40, 38); //Arduino Mega Shield

// Etat des boutons
int B_Prev_State=0;
int B_Next_State=0;
int B_Exe_State=0;
int B_Cancel_State=0;

// Affichage du LCD
char * V_LCD_L1="BIENVENUE";
char * V_LCD_L2="DEVUINO V0.6";

int V_Menu=0; // Position dans le menu
int V_Choix=0; // Position actuelle du choix
int V_Choix_Max=2; // Choix max. dans un menu
int Type_Dev = 0; //Type de dev à effectuer
int Temperature = 20;

// SETUP
void setup () {

// Vitesse de transfert avec le port serie
Serial.begin(9600);
lcd.createChar(0, degree); // création du caractère spécial °

// Parametres des boutons
pinMode(B_Prev, INPUT);
pinMode(B_Next, INPUT);
pinMode(B_Exe, INPUT);
pinMode(B_Cancel, INPUT);

// Message d'accueil
lcd.begin(16,2); //initialisation affichage LCD 16x2 lignes
lcd.setCursor(3,0);lcd.print(V_LCD_L1);
lcd.setCursor(4,1);lcd.print(V_LCD_L2);
delay(2000);
AfficheMenu(V_Menu);
AfficheChoix(V_Choix);

while(Type_Dev == 0){
PresseBouton();
}

}

void loop() {

lcd.print("Dev : "); //debug test
lcd.print(Type_Dev);
}

// AFFICHAGE DES MENUS

void AfficheMenu(int V_Menu) {

lcd.clear();
// Enumeration de tous les menus et du nombre de choix que chacun propose
switch (V_Menu) {
case 0:V_LCD_L1="DEV |C41|E6|NB"; V_Choix_Max=2; break;
case 1:V_LCD_L1="Temp. |20|25|38"; V_Choix_Max=2; break;
case 11:V_LCD_L1="DEV C41 @ 20"; V_Choix_Max=1; break;
case 12:V_LCD_L1="DEV C41 @ 25"; V_Choix_Max=1; break;
case 13:V_LCD_L1="DEV C41 @ 38"; V_Choix_Max=1; break;
case 2:V_LCD_L1="Dev E6 @ 38"; V_Choix_Max=0; break;
case 3:V_LCD_L1="Type Custom|STD";V_Choix_Max=2; break;
case 32:V_LCD_L1="Stand Dev N&B";V_Choix_Max=1; break;
case 31:V_LCD_L1="Temp. + | -";V_Choix_Max=0; break;
}
// Affichage du menu en cours
lcd.setCursor(0,0);lcd.print(V_LCD_L1);
if (V_Menu == 2){lcd.write(0);lcd.print("C");delay(2000);if (B_Exe_State==HIGH){Type_Dev = V_Menu;}}
if (V_Menu == 11){lcd.write(0);lcd.print("C");delay(2000);if (B_Exe_State==HIGH){Type_Dev = V_Menu;}}
if (V_Menu == 12){lcd.write(0);lcd.print("C");delay(2000);if (B_Exe_State==HIGH){Type_Dev = V_Menu;}}
if (V_Menu == 13){lcd.write(0);lcd.print("C");delay(2000);if (B_Exe_State==HIGH){Type_Dev = V_Menu;}}
if (V_Menu == 31){lcd.print(Temperature);lcd.write(0);lcd.print("C");ChoixTemperature();}
}

void AfficheChoix(int V_Choix) {

// AFFICHAGE D'UN CHOIX DANSUN{ MENU
// Enumeration de toutes les possibilites de choix (3 cas)
switch (V_Choix) {
case 0:V_LCD_L2="* ";break;
case 1:V_LCD_L2=" * ";break;
case 2:V_LCD_L2=" *";break;

}
// Affichage du choix en cours
lcd.setCursor(9,1);lcd.print(V_LCD_L2);

}

// ETAT DES BOUTONS

void PresseBouton() {

delay(100);
B_Prev_State = digitalRead(B_Prev);
B_Next_State = digitalRead(B_Next);
B_Exe_State = digitalRead(B_Exe);
B_Cancel_State = digitalRead(B_Cancel);

AfficheChoix(V_Choix);

if (B_Prev_State==HIGH) { // Précédent
if (V_Choix>0) {
V_Choix--;
}
}

if (B_Next_State==HIGH) { // Suivant
if (V_Choix<V_Choix_Max) {
V_Choix=V_Choix+1;
}
}

if (B_Exe_State==HIGH) { // Execute

if (V_Menu<40){
V_Menu=V_Menu*10+(V_Choix+1);
V_Choix = 0;
AfficheMenu(V_Menu);

}
}
if (B_Cancel_State==HIGH) { // Cancel
V_Menu=V_Menu/10;
V_Choix = 0;
AfficheMenu(V_Menu);
}

}

void ChoixTemperature(){
Serial.print(Temperature);
while (B_Exe_State==LOW){

if (B_Next_State==HIGH) {
Temperature=Temperature+1;
lcd.setCursor(0,13);lcd.print(Temperature);

}
if (B_Prev_State==HIGH) {
Temperature=Temperature-1;
lcd.setCursor(0,13);lcd.print(Temperature);

}
}}

merci à vous.

ça inspire personne? :roll_eyes:

concernant mon problème de menu, je viens de tomber sur le phi-menu, vous avez déjà testé? ça a l'air de bien trouner.

Effixe:
ça inspire personne? :roll_eyes:

bonjour si,si ça inspire et respire, mais il faut laisser calmement du temps à la prise de vue, ensuite à la révélation et enfin à la fixation :grin:

ça me fait penser que mon vieux Durst M605 dort depuis longtemps au grenier de ma campagne. :grin:

Je lirais plus tard, mais pour les pompes de remplissage "liquide" et compte tenu de la chimie employée , il faut soit vous tourner vers de la tête "teflon" (très cher) ou de la péristaltique .
Par contre pour les purges des bains en auto par gravité , il y a plus simple et pas onéreux si vous prenez en compte un cycle de lavage/nettoyage :smiley:

Merci Artouste,

effectivement les pompes péristaltique peuvent être une solution, mais qu'en est-il du débit? je vais aller faire quelques googleries pour en savoir plus.

merci pour cette nouvelle voie.