Go Down

Topic: Menu pour choix temperature.  (Read 189 times) previous topic - next topic

olivaure

Bonjour a tous.

Voilà je suis entrain de fabriquer un contrôleur de température afin de réguler un frigo a une température voulu. (fermentation de bières)
J'ai pour cela créer un module avec :
-Arduino Mega 2560
-Ecran Vellman VMA203 2x16 plus 6 boutons
- Sonde DS18B
-Carte relais
Pour l'instant je configure ma température et je l'injecte dans la carte.
Je souhaiterais créer un menu me permettant de sélectionner la température voulu.
Malheureusement j'ai beau fouiller partout je ne trouve rien qui me permette de partir sur une base pour essayer de créer seul ce code. Mes connaissances en codage étant limité je me tourne vers vous afin de demander un peut d'aide.
Merci d'avance !!

Mon code actuel:
Code: [Select]
// Je charge les librairies
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
int relais = 51; //Ont assigne le relais a la broche 51
int temp_sensor = 49; //Ont assigne la sonde a la broche 53
float temperature = 0; //Ont creer les variable
int lowerLimit = 18;
OneWire oneWirePin(temp_sensor);
DallasTemperature sensors(&oneWirePin);
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup(void)
{
lcd.begin(16, 2);
lcd.setCursor(1, 0);
lcd.print ("HELLO");
pinMode(relais, OUTPUT);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
//AFFICHAGE TEMPERATURE LCD
lcd.setCursor(1, 0);
lcd.print ("Temp: ");
lcd.setCursor(7, 0);
lcd.print(temperature);
//AFFICHAGE LCD ETAT RELAIS
if (temperature < lowerLimit) {
lcd.setCursor(1, 1);
lcd.print("Relais OFF");
}
else if (temperature > lowerLimit ) {
lcd.setCursor(1, 1);
lcd.print("Relais ON ");
}
//GESTION DU RELAIS
if (temperature < lowerLimit) {
digitalWrite(relais, LOW);
}
else if (temperature > lowerLimit ) {
digitalWrite(relais, HIGH);
}
}

J-M-L

#1
Jun 17, 2018, 01:02 pm Last Edit: Jun 17, 2018, 01:15 pm by J-M-L
Jetez éventuellement un oeil sur mon petit projet Contrôleur de T°, Humidité avec pilotage manuel ou automatique - vous verrez dans le code comment je gère la possibilité de définir des consignes


Sinon j'avais aussi déjà posté (il me semble) ce petit bout de code qui démontre comment rentrer une valeur à l'aide d'un petit clavier à membrane qui utilise la touche '#' pour valider une entrée (et '*' pour effacer ce qui a été tapé, 1 caractère à la fois)

Code: [Select]

// ****** HANDLE KEYPAD ******
#include <Keypad.h> // https://github.com/Chris--A/Keypad

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns

//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 34, 36, 38, 40 };
// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {41, 39, 37, 35};

//initialize an instance of class Keypad
Keypad membraneKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);


// ****** HANDLE LCD ******
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const byte nbCols = 20;
const byte nbLines = 4;
LiquidCrystal_I2C lcd( 0x3F, nbCols, nbLines); // my LCD is at I2C address 0x3F, 20 cols, 4 rows


// **********************************************************************************
// getNumber()
// if prepare is true, we initialize everything to receive data in a specific field on the LCD
// otherwise it handles the data input
// returns true when user has pressed the # key
// Note: defined defaults value to simplify calling the function when not in prepare stage (see below)
// **********************************************************************************
boolean getNumber(long *dataEntry, const boolean prepare = false, const uint8_t x = 0, const uint8_t y = 0, const uint8_t fieldSize = 2, const char asciiChar = '_')
{
  boolean entryCompleted = false;
  static uint8_t _x0, _y0, _x, _w;
  static char _p; //padding Char
  static boolean _fullEntry = false;

  if (prepare) { // initialize the capture field
    const byte maxLongLength = 12; // enough for -2147483648 so 11 characters + trailing null
    char dataBuffer[maxLongLength];
    _x0 = _x = x;
    _y0 = y;
    _w = fieldSize;
    _p = asciiChar;

    lcd.setCursor(_x0, _y0);
    for (uint8_t i = 0; i < _w; i++) lcd.write(_p);
    lcd.setCursor(_x0, _y0);

    if (dataEntry) { // if we gave an initial value, display the part that fits into the area
      ltoa(*dataEntry, dataBuffer, 10); // convert value into c-string in base 10
      if (strlen(dataBuffer) < _w) { // do we fit in the reserved area?
        _fullEntry = false;
        lcd.print(dataBuffer);
        _x = _x0 + strlen(dataBuffer);
      } else {
        dataBuffer[_w] = '\0';
        *dataEntry = atol(dataBuffer);
        _fullEntry = true;
        lcd.print(dataBuffer);
        _x = _x0 + strlen(dataBuffer) - 1;
        lcd.setCursor(_x, _y0); // and don't go further than the reserved space
      }
    }
    lcd.blink();
  } else {
    char entry = membraneKeypad.getKey();

    switch (entry) // don't deal with case 'A'...'D':
    {
      case '0'...'9': // add this digit
        lcd.print(entry);
        if (_fullEntry) {
          *dataEntry = (*dataEntry / 10) * 10 + entry - '0'; // overwrite the last digit
          lcd.setCursor(_x, _y0); // and don't go further than the reserved space
        } else {
          *dataEntry = *dataEntry * 10 + entry - '0';
          _x++;
          if (_x >= _x0 + _w) {
            _x--;
            lcd.setCursor(_x, _y0);
            _fullEntry = true;
          }
        }
        break;

      case '*': // erase last digit
        *dataEntry = *dataEntry / 10;
        if (_fullEntry) {
          _fullEntry = false;
        } else {
          if (_x > _x0) _x--;
        }
        lcd.setCursor(_x, _y0);
        lcd.write(_p);
        lcd.setCursor(_x, _y0);
        break;

      case '#':
        lcd.noBlink();
        if (!_fullEntry)
          for (uint8_t i = _x; i < _x0 + _w; i++) lcd.write(' '); // replace padding with white spaces
        entryCompleted = true;
        break;
    }
  }
  return entryCompleted;
}


void setup() {
  Serial.begin(115200);
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Min=")); // to see the area

  // prepare the data entry. initial value in empty, prepare mode, start col for field entry, start line for field entry, padding number during entry
  getNumber(NULL, true, 4, 0, 5, '_');
}

void loop() {
  static long dataEntry = 0; // important to be static to survive across loops

  if (getNumber(&dataEntry)) { // wait until we get an entry validated by #

    // erase the second line
    lcd.setCursor(0, 1);
    for (byte i = 0; i < nbCols; i++) lcd.print(F(" "));
    lcd.setCursor(0, 1);

    // print the data we got
    lcd.print(F("Min set @ ")); lcd.print(dataEntry);

    // prepare the next data entry. initial value is what has been entered
    getNumber(&dataEntry, true, 4, 0, 5, '_'); // we start from the existing value, use * for example on the pad to erase digits if necessary

    // if you want to restart from an empty value you would do that instead of the line above
    // dataEntry = 0;
    // getNumber(NULL, true, 4, 0, 5, '_'); // start with no value

  }

  // here you could do other stuff
}


Un clavier à membrane ça ressemble à cela et ça coûte 1 euro sur eBay en commandant en asie (ou deux pour 1,72€.. à ce prix là autant en prendre un de rechange)


Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

olivaure

Bonjour et merci pour votre réponse.
Je ne souhaite pas m'encombrer du clavier supplémentaire sachant que les boutons de l'écran sont largement suffisant. Je cherche vraiment a programmer ses bouton afin de choisir la temperature voulu.

GuillaumeDeGrenoble

#3
Jun 17, 2018, 10:35 pm Last Edit: Jun 17, 2018, 10:37 pm by GuillaumeDeGrenoble Reason: Modif
Salut,
Je suis en train de réaliser une régulation basée sur des consignes modifiable avec affichage sur lcd.
J'ai donc essayer plusieurs système, bouton poussoir, encodeur, et potentiomètre.

Pour moi le système retenue est le potentiomètre et ça marche nickel!!

Donc j'utilise une fonction « map » sur le potar. Autrement dit un bête produit en croix.
Je détermine une valeur min et une Max. J'ai également possibilité de régler le pas de réglage.
Un BP pour valider mes choix et le tour est joué, super fonctionnel, et efficace.

J'ai un bout de prog si ça t'interesse...

J-M-L

Bonjour et merci pour votre réponse.
Je ne souhaite pas m'encombrer du clavier supplémentaire sachant que les boutons de l'écran sont largement suffisant. Je cherche vraiment a programmer ses bouton afin de choisir la temperature voulu.
OK - mon petit projet "Contrôleur de T°, Humidité avec pilotage manuel ou automatique" mentionné ci dessus utilise des boutons et un potentiomètre pour faire varier la valeur de consigne
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

lesept

Il existe une bibli pour faire des menus. Je ne 'ai jamais testée, mais tu dois pouvoir l'utiliser pour ton besoin.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

olivaure

Bonjour,

Merci a tous pour vos réponses! Je vais en faire une synthèse et voir ce que je peux en tirer comme solution. J'y ai deja passé la moitié de la nuit et j'ai un peut avancé ;)

Go Up