Étape 13 :
/* */
/ * Titre : cuiseur Imersion contrôleur * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * MCWSM * /
/* */
/ * Description: * /
/ * Cette esquisse fonctionne sur la plateforme Arduino Uno * /
/ * avec un bouclier SainSmart 1602 LCD/clavier, * /
/ * SainSmart à l’état solide relais périphérique et LM35 * /
/ * capteur de température. Il est conçu pour contrôle * /
/ * deux éléments communs de chauffage et une petite * /
/ * pompe immergeable dans un cuiseur à immersion. Le * /
/ * utilisateur compose simplement dans une température réglée à l’aide de la * /
/ * clavier et les stroboscopes contrioller le chauffage * /
/ * éléments à atteindre et à maintenir l’eau réglée * /
/ * température. */
/* */
/ * AVENIR : ajoutez des fonctions de minuterie/horloge * /
/* */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
#include < LiquidCrystal.h >
#define VERSION_STRING « 1.0 »
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define ELEMENT_1 2 / / 1 élément control port
#define ELEMENT_2 3 / / 2 de l’élément de commande port
#define LED_PORT 13
#define THIRTY_SECONDS 30000 ; 30 000 microsecondes
#define KEYBOARD_PORT 0
#define TEMP_PORT 1
#define augmentation 1
#define diminution -1
#define NO_CHANGE 0
#define sélectionnez 999
#define 0 CELSIUS
#define FARENHEIT 1
#define TEMP_COUNT 10
#define KEY_BOUNCE_DELAY 333
int iTempMode = Fahrenheit ; défaut de Farenheit...
int iSetTemp = 130 ; iSetTemp est global...
int iKeyPressIn = 0 ;
flotteur fTemp [TEMP_COUNT] ; Tableau de lissage température mondiale...
int iCurrentIndex = 0 ; iCurrentIndex est un indice mondial en tableau temp...
bDegreeSymbol Byte [8] = / / masque de bits pour symbole °...
{
B11100,
B10100,
B11100,
B00000,
B00000,
B00000,
B00000,
B00000
};
bCheckMarkSymbol Byte [8] = / / masque de bits pour le symbole √...
{
B00000,
B00000,
B00000,
B00001,
B00010,
B10100,
B01100,
B01000
};
Innovente lcd (8, 9, 4, 5, 6, 7) ; initialiser la bibliothèque avec les numéros des broches interface
void setup()
{
/*****************************************************/
/* */
/ * Module : le programme d’installation * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Initialise l’affichage à cristaux liquides et affiche splash * /
/ * écran. */
/ * Pendant la séquence d’installation, la température * /
/ * Tableau de lissage est initialisé avec les lectures comme * /
/ * bien. */
/* */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
String strLine1 ;
String strLine2 ;
String strElipses = "." ;
lcd.createChar (0, bDegreeSymbol) ; Créer des personnages de LCD
lcd.createChar (1, bCheckMarkSymbol) ;
LCD.Begin (16, 2) ; colonnes de configuration LCD affichage, les lignes...
LCD (« Boot... », "") ;
pour (int iIndex = 0; iIndex < TEMP_COUNT ; iIndex ++) / / instancier le tableau de température pour le lissage de signal...
{
fTemp [iIndex] = analogRead(TEMP_PORT) ;
fTemp [iIndex] = ((fTemp [iIndex] * 3.3) / 1023) ; 10 mV par degré Celsius
Si (iTempMode == FARENHEIT)
{
fTemp [iIndex] = ConvertCelsiusToFarenheit(fTemp[iIndex]); / / convertir en Farenheit...
}
LCD (« Boot... », strElipses) ;
strElipses += "." ;
Delay(100) ;
}
pinMode (ELEMENT_1, sortie) ;
pinMode (ELEMENT_2, sortie) ;
pinMode (LED_PORT, sortie) ;
strLine1 = « Immersion cuisinière » ; Créer et afficher l’écran de démarrage
strLine2 = "Version:" ;
strLine2 += VERSION_STRING ;
LCD (strLine1, strLine2) ;
Delay(2000) ;
}
void loop()
{
/*****************************************************/
/* */
/ * Module : boucle * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Obtient SetTemp nouveau, le cas échéant. Il appelle ensuite SetTemp * /
/ * pour stroboscope les éléments chauffants pour ajuster le * /
/ * temp. Ensuite, il affiche les infos temp, retarde un * /
/ * seconde alors retours. Le délai empêche le * /
/ * Relais à état solide soit en continu * /
/ * activée ou désactivée. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
String strLCDLine0 = "" ;
String strLCDLine1 = "" ;
iSetTemp = GetSetTemp(iSetTemp) ; voir si l’utilisateur souhaite modifier le temp...
SetTemp(iSetTemp) ; Eléments de chauffage...
DisplayTemps (iSetTemp, GetCurrentTemp(), les de ') ; Affichage temps...
Delay(1000) ; Ne saturez SSRs...
}
int GetSetTemp (int iSetTemp)
{
/*****************************************************/
/* */
/ * Module : GetSetTemp * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Lit le clavier pour voir si des ajustements sont en cours * /
/ * fait au courant de la valeur temp. La valeur par défaut est * /
/ * qu’aucune clé n’est être déprimé. Cette propriété renvoie * /
/ * btnNone de ReadKeypad et de résultats dans un * /
/ * retour immédiat à l’appelant. Dans le cas contraire, le * /
/ * température de consigne est réglée correctement et * /
/ * nouvelle température ajustée. */
/* */
/ * Ce module permet également l’utilisateur d’entrer dans * /
/ * un sous-menu où le peut faire des choses comme changer * /
/ * le mode de fonctionnement de Fahrenheit à Celsius. */
/* */
/ * Si l’utilisateur a enfoncé les touches pour faire temp * /
/ * ajustements, ils doivent s’appuyer sur la touche Select * /
/ * pour faire ces ajustements permanents et retour * /
/ * à l’appelant. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
int iKeyIn ;
int iNewSetTemp ;
int iTempDelta ; AUGMENTER. DIMINUTION ou SELECT...
char cSetTemp [4] ;
bSelected booléen = false ;
char cTempMode = s ' ;
iNewSetTemp = iSetTemp ; Commencez par temp actuel...
iKeyIn = ReadKeypad() ;
Si (iKeyIn! = btnNONE) / / btnNONE = rien à faire, il suffit de retourner à l’appelant...
{
/ / tant que les bSelected...
{
Switch(iKeyIn)
{
case btnUP: / / régler la température jusqu'à...
iNewSetTemp += 1 ;
cTempMode = « A » ; informer l’ajustement de l’utilisateur en cours...
rupture ;
case btnDOWN: / / régler la température à la baisse...
iNewSetTemp-= 1 ;
cTempMode = « A » ; informer l’ajustement de l’utilisateur en cours...
rupture ;
affaire btnLEFT :
iNewSetTemp = Menu() ; menu d’options...
bSelected = true ; sortir une fois que toutes les options du menu...
rupture ;
case btnSELECT: / / ajustements complet...
bSelected = true ;
rupture ;
par défaut: / / ignorer les autres touches...
rupture ;
}
DisplayTemps (iNewSetTemp, GetCurrentTemp(), cTempMode) ; afficher chaque ajustement tel qu’il apparaît...
Delay(KEY_BOUNCE_DELAY) ; lisser les multiple...
iKeyIn = ReadKeypad() ; intérieure en lecture boucle...
} tandis que (! bSelected) ;
}
Return(iNewSetTemp) ;
}
Sub SetTemp(int iSetTemp)
{
/*****************************************************/
/* */
/ * Module : SetTemp * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module compare le paramètre d’iSetTemp à * /
/ * la température actuelle. Si il y a plus qu’un * /
/ * degré de variance, il transforme les éléments chauffants * /
/ * activer ou désactiver selon le cas. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
int iCurrentTemp ;
iCurrentTemp = GetCurrentTemp() ; vérifier la température actuelle...
Si (abs (iSetTemp - iCurrentTemp) > = 1) / / si la température varie de plus de 1 degré
{
Si (iCurrentTemp > iSetTemp) / / si la température trop élevée, désactiver des éléments de chauffage
{
digitalWrite (ELEMENT_1, basse) ;
digitalWrite (ELEMENT_2, basse) ;
digitalWrite (LED_PORT, basse) ;
}
d’autre
{
digitalWrite (ELEMENT_1, élevé) ; Si temp trop bas, tourner sur les éléments de chauffage
digitalWrite (ELEMENT_2, élevé) ;
digitalWrite (LED_PORT, élevé) ;
}
}
}
int GetCurrentTemp()
{
/*****************************************************/
/* */
/ * Module : GetCurrentTemp * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module indique la température actuelle de la * /
/ * capteur et il stocke le signal lissage * /
/ * tableau. La température du capteur est en * /
/ * Celsius et nous convertir en Farenheit au besoin * /
/ * par le mode de fonctionnement actuel. L’utilisateur est alors * /
/ * retourne un entier représentant la lissée * /
/ * (c'est-à-dire moyen de tous les temps dans le tableau) * /
/ * température. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
int iReturnTemp = 0 ;
float fCumulativeTemp = 0 ;
float fADCIn ;
Si ((iCurrentIndex) == TEMP_COUNT) / / rester dans les limites du tableau...
{
iCurrentIndex = 0 ;
}
fADCIn = analogRead(TEMP_PORT) ; obtenir temp signal du capteur...
Si (iTempMode == CELSIUS) / / faire la conversion en degrés Celsius...
{
fTemp [iCurrentIndex] = (((fADCIn * 3.7) / 1024) * 100) ;
}
d’autre
{
fTemp [iCurrentIndex] = fADCIn ; lecture de droite est en farenheit...
}
pour (int iIndex = 0; iIndex < TEMP_COUNT ; iIndex ++) / / somme le dernier X lectures...
{
fCumulativeTemp += fTemp [iIndex] ;
}
iReturnTemp = ((int)(fCumulativeTemp / TEMP_COUNT)) ; Return temp lissée...
iCurrentIndex ++ ; index de la bosse pour appel suivant...
Return(iReturnTemp) ;
}
void DisplayTemps (int iSetTemp, int iCurrentTemp, char cTempMode)
{
/*****************************************************/
/* */
/ * Module : DisplayTemps * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module affiche deux lignes des températures * /
/ * sur l’écran LCD. Le premier est le temp set * /
/ * et est étiqueté basé sur la question de savoir si nous sommes * /
/ * réglage il, ou elle est la température de consigne. Le * /
/ * deuxième ligne de l’écran toujours le courant * /
/ * température. */
/* */
/ * Si ce module est appelé en continu, le * /
/ * cligno alors l’appelant devrait retarder entre * /
/ * appels. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
String strLine1 ;
String strLine2 ;
Si (cTempMode == « A ») / / mode de réglage...
{
strLine1 = "Adjust:" ;
}
d’autre
{
strLine1 = "la valeur:" ; Mode Set...
}
strLine1 += iSetTemp ;
strLine2 = String ("actuel:") ;
strLine2 += iCurrentTemp ;
LCD.Clear() ;
lcd.setCursor (0, 0) ;
LCD.Print(strLine1) ;
LCD.Write(Byte(0)) ; symbole de degré...
Si (iTempMode == FARENHEIT)
{
LCD.Print("F") ;
}
d’autre
{
LCD.Print("C") ;
}
lcd.setCursor (0, 1) ;
LCD.Print(strLine2) ;
LCD.Write(Byte(0)) ;
Si (iTempMode == FARENHEIT)
{
LCD.Print("F") ;
}
d’autre
{
LCD.Print("C") ;
}
}
void LCD (String strLine0, String strLine1)
{
/*****************************************************/
/* */
/ * Module : LCD * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module affiche deux lignes de texte à l’écran * /
/ * afficher. */
/ * Si ce module est appelé en continu, le * /
/ * cligno alors l’appelant devrait retarder entre * /
/ * appels. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
LCD.Clear() ;
Si (strLine0.length() > 0)
{
lcd.setCursor (0, 0) ;
LCD.Print(strLine0) ;
}
Si (strLine1.length() > 0)
{
lcd.setCursor (0, 1) ;
LCD.Print(strLine1) ;
}
}
int ReadKeypad()
{
/*****************************************************/
/* */
/ * Module : ReadKeypad * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Lit le clavier SainSmart. Si l’utilisateur * /
/ * déprime une clé, une valeur est retournée. Cette valeur * /
/ * peut varier d’un appareil. Ainsi, nous * /
/ * déterminer la valeur de voir si nous sommes près de * /
/ * la valeur lue. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
int iKeyIn = analogRead(KEYBOARD_PORT) ;
Si (iKeyIn > 1000) / / ce sera le plus souvent résultat...
{
Return btnNONE ;
}
ElseIf (iKeyIn < 50)
{
Delay(KEY_BOUNCE_DELAY) ; poignée multiple...
Return btnRIGHT ;
}
ElseIf (iKeyIn < 195)
{
Delay(KEY_BOUNCE_DELAY) ; poignée multiple...
Return btnUP ;
}
ElseIf (iKeyIn < 380)
{
Delay(KEY_BOUNCE_DELAY) ; poignée multiple...
Return btnDOWN ;
}
ElseIf (iKeyIn < 555)
{
Delay(KEY_BOUNCE_DELAY) ; poignée multiple...
Return btnLEFT ;
}
ElseIf (iKeyIn < 790)
{
Delay(KEY_BOUNCE_DELAY) ; poignée multiple...
Return btnSELECT ;
}
else return btnNONE ; Si tout cela échoue...
}
int Menu()
{
/*****************************************************/
/* */
/ * Module : Menu * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module permet à l’utilisateur un moyen de * /
/ * pour accéder aux autres fonctionnalités au sein de la * /
/ * cuiseur à immersion. Pour la version 1.0 c’est limité * /
/ * pour modifier le mode de fonctionnement entre Farenheit * /
/ * et Celsius. Pour l’avenir, il s’agira notamment * /
/ * pour accéder aux fonctions de l’horloge. */
/ * Ce module retourne une fois le bouton Select * /
/ * déprimé. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
int iKeyIn ;
bSelected booléen = false ;
int iStartingTempMode = iTempMode ;
LCD ("Celsius", « Farenheit ») ; Commencez par afficher le paramètre actuel...
Si (iTempMode == CELSIUS)
{
lcd.setCursor (10, 0) ;
}
d’autre
{
lcd.setCursor (10, 1) ;
}
LCD.Write(Byte(1)) ; la coche de l’option en cours d’affichage...
faire
{
iKeyIn = ReadKeypad() ; obtenir la sélection de l’utilisateur...
Switch(iKeyIn)
{
affaire btnUP :
LCD ("Celsius", « Farenheit ») ;
lcd.setCursor (10, 0) ;
LCD.Write(Byte(1)) ; afficher la coche de l’option choisie...
iTempMode = CELSIUS ;
rupture ;
affaire btnDOWN :
LCD ("Celsius", « Farenheit ») ;
lcd.setCursor (10, 1) ;
LCD.Write(Byte(1)) ; afficher la coche de l’option choisie...
iTempMode = Fahrenheit ;
rupture ;
case btnSELECT: / / Ceci termine le menu et met en œuvre l’action demandée...
bSelected = true ;
rupture ;
par défaut: / / ignorer les autres touches...
rupture ;
}
Delay(KEY_BOUNCE_DELAY) ;
} tandis que (! bSelected) ;
Si (iTempMode! = iStartingTempMode) / / si nous avons changé les modes...
{
Si (iTempMode == CELSIUS)
{
iSetTemp = (int) ConvertFarenheitToCelsius((float) iSetTemp) ; convertir iSetTemp Celsius pour fins d’exposition...
}
d’autre
{
iSetTemp = (int) ConvertCelsiusToFarenheit((float) iSetTemp);// iSetTemp convertir de Fahrenheit pour afficher des fins...
}
ConvertTempSmoothingArray(iTempMode) ; convertir les temps de la température gamme de lissage...
}
Return(iSetTemp) ;
}
Sub ConvertTempSmoothingArray(int iNewTempMode)
{
/*****************************************************/
/* */
/ * Module : ConvertTempSmoothingArray * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module permet de sélectionner la température * /
/ * lissage tableau de conversion des températures comprises entre * /
/ * Fahrenheit et Celsius basée sur le nouveau * /
/ * mode de fonctionnement sélectionné. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
int iIndex = 0 ;
Switch(iNewTempMode)
{
cas de Fahrenheit :
pour (int iIndex = 0; iIndex < TEMP_COUNT ; iIndex ++) / / pour chaque temp dans le tableau de lissage...
{
fTemp [iIndex] = ConvertCelsiusToFarenheit(fTemp[iIndex]) ; convertir en Farenheit...
}
rupture ;
cas c :
pour (int iIndex = 0; iIndex < TEMP_COUNT ; iIndex ++) / / pour chaque temp dans le tableau de lissage...
{
fTemp [iIndex] = ConvertFarenheitToCelsius(fTemp[iIndex]) ; convertir Celsius...
}
rupture ;
par défaut :
rupture ;
}
}
flotteur ConvertCelsiusToFarenheit(float fCelsiusTemp)
{
/*****************************************************/
/* */
/ * Module : ConvertCelsiusToFarenheit * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module convertit une température de Celsius * /
/ * à Farenheit * /
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
Return ((fCelsiusTemp * 1.8) + 32,0) ;
}
flotteur ConvertFarenheitToCelsius(float fFarenheitTemp)
{
/*****************************************************/
/* */
/ * Module : ConvertFarenheitToCelsius * /
/ * Version : 1.0 * /
/ * Version Date : 05/01/2012 * /
/ * Auteur : Edward A Ranzenbach * /
/ * Description: * /
/ * Ce module convertit une température de * /
/ * Fahrenheit à Celsius. */
/ * Histoire: * /
/* */
/ * 2012-05-01 - Edward A Ranzenbach * /
/ * Codage initiale * /
/* */
/*****************************************************/
retour ((fFarenheitTemp-32.0) *. 555) ;
}