#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
hd44780_I2Cexp lcd;
const int nbCols = 20;
const int nbLignes = 4;
#include <OneButton.h>
OneButton question(2);
OneButton reponse(3);
enum Etat : uint8_t {INCONNU, SOLIDE, GAZEUX, LIQUIDE };
const char* EtatText[] = {"Inconu", "Solide", "Gazeux", "Liquide"};
struct Element {
char nom[20];
char symbole[3];
Etat etat;
float masse_atomique;
};
static const Element tablePeriodique[] PROGMEM = {
{"Hydrogène", "H", GAZEUX, 1.008},
{"Hélium", "He", GAZEUX, 4.0026},
{"Lithium", "Li", SOLIDE, 6.94},
{"Béryllium", "Be", SOLIDE, 9.0122},
{"Bore", "B", SOLIDE, 10.81},
{"Carbone", "C", SOLIDE, 12.011},
{"Azote", "N", GAZEUX, 14.007},
{"Oxygène", "O", GAZEUX, 15.999},
{"Fluor", "F", GAZEUX, 18.998},
{"Néon", "Ne", GAZEUX, 20.18},
{"Sodium", "Na", SOLIDE, 22.99},
{"Magnésium", "Mg", SOLIDE, 24.305},
{"Aluminium", "Al", SOLIDE, 26.982},
{"Silicium", "Si", SOLIDE, 28.085},
{"Phosphore", "P", SOLIDE, 30.974},
{"Soufre", "S", SOLIDE, 32.06},
{"Chlore", "Cl", GAZEUX, 35.45},
{"Argon", "Ar", GAZEUX, 39.95},
{"Potassium", "K", SOLIDE, 39.098},
{"Calcium", "Ca", SOLIDE, 40.078},
{"Scandium", "Sc", SOLIDE, 44.956},
{"Titane", "Ti", SOLIDE, 47.867},
{"Vanadium", "V", SOLIDE, 50.942},
{"Chrome", "Cr", SOLIDE, 51.996},
{"Manganèse", "Mn", SOLIDE, 54.938},
{"Fer", "Fe", SOLIDE, 55.845},
{"Cobalt", "Co", SOLIDE, 58.933},
{"Nickel", "Ni", SOLIDE, 58.693},
{"Cuivre", "Cu", SOLIDE, 63.546},
{"Zinc", "Zn", SOLIDE, 65.38},
{"Gallium", "Ga", SOLIDE, 69.723},
{"Germanium", "Ge", SOLIDE, 72.63},
{"Arsenic", "As", SOLIDE, 74.922},
{"Sélénium", "Se", SOLIDE, 78.971},
{"Brome", "Br", LIQUIDE, 79.904},
{"Krypton", "Kr", GAZEUX, 83.798},
{"Rubidium", "Rb", SOLIDE, 85.468},
{"Strontium", "Sr", SOLIDE, 87.62},
{"Yttrium", "Y", SOLIDE, 88.906},
{"Zirconium", "Zr", SOLIDE, 91.224},
{"Niobium", "Nb", SOLIDE, 92.906},
{"Molybdène", "Mo", SOLIDE, 95.95},
{"Technétium", "Tc", SOLIDE, 98.0},
{"Ruthénium", "Ru", SOLIDE, 101.07},
{"Rhodium", "Rh", SOLIDE, 102.91},
{"Palladium", "Pd", SOLIDE, 106.42},
{"Argent", "Ag", SOLIDE, 107.87},
{"Cadmium", "Cd", SOLIDE, 112.41},
{"Indium", "In", SOLIDE, 114.82},
{"Étain", "Sn", SOLIDE, 118.71},
{"Antimoine", "Sb", SOLIDE, 121.76},
{"Tellure", "Te", SOLIDE, 127.6},
{"Iode", "I", SOLIDE, 126.9},
{"Xénon", "Xe", GAZEUX, 131.29},
{"Césium", "Cs", SOLIDE, 132.91},
{"Baryum", "Ba", SOLIDE, 137.33},
{"Lanthane", "La", SOLIDE, 138.91},
{"Cérium", "Ce", SOLIDE, 140.12},
{"Praséodyme", "Pr", SOLIDE, 140.91},
{"Néodyme", "Nd", SOLIDE, 144.24},
{"Prométhium", "Pm", SOLIDE, 145.0},
{"Samarium", "Sm", SOLIDE, 150.36},
{"Europium", "Eu", SOLIDE, 152.0},
{"Gadolinium", "Gd", SOLIDE, 157.25},
{"Terbium", "Tb", SOLIDE, 158.93},
{"Dysprosium", "Dy", SOLIDE, 162.50},
{"Holmium", "Ho", SOLIDE, 164.93},
{"Erbium", "Er", SOLIDE, 167.26},
{"Thulium", "Tm", SOLIDE, 168.93},
{"Ytterbium", "Yb", SOLIDE, 173.05},
{"Lutécium", "Lu", SOLIDE, 175.00},
{"Hafnium", "Hf", SOLIDE, 178.49},
{"Tantale", "Ta", SOLIDE, 180.95},
{"Tungstène", "W", SOLIDE, 183.84},
{"Rhénium", "Re", SOLIDE, 186.21},
{"Osmium", "Os", SOLIDE, 190.23},
{"Iridium", "Ir", SOLIDE, 192.22},
{"Platine", "Pt", SOLIDE, 195.08},
{"Or", "Au", SOLIDE, 196.97},
{"Mercure", "Hg", LIQUIDE, 200.59},
{"Thallium", "Tl", SOLIDE, 204.38},
{"Plomb", "Pb", SOLIDE, 207.2},
{"Bismuth", "Bi", SOLIDE, 208.98},
{"Polonium", "Po", SOLIDE, 209.98},
{"Astate", "At", SOLIDE, 210.0},
{"Radon", "Rn", GAZEUX, 222.0},
{"Francium", "Fr", SOLIDE, 223.0},
{"Radium", "Ra", SOLIDE, 226.0},
{"Actinium", "Ac", SOLIDE, 227.0},
{"Thorium", "Th", SOLIDE, 232.04},
{"Protactinium", "Pa", SOLIDE, 231.04},
{"Uranium", "U", SOLIDE, 238.03},
{"Neptunium", "Np", SOLIDE, 237.0},
{"Plutonium", "Pu", SOLIDE, 244.0},
{"Américium", "Am", SOLIDE, 243.0},
{"Curium", "Cm", SOLIDE, 247.0},
{"Berkélium", "Bk", SOLIDE, 247.0},
{"Californium", "Cf", SOLIDE, 251.0},
{"Einsteinium", "Es", SOLIDE, 252.0},
{"Fermium", "Fm", SOLIDE, 257.0},
{"Mendélévium", "Md", SOLIDE, 258.0},
{"Nobelium", "No", SOLIDE, 259.0},
{"Lawrencium", "Lr", SOLIDE, 262.0},
{"Rutherfordium", "Rf", INCONNU, 267.0},
{"Dubnium", "Db", INCONNU, 270.0},
{"Seaborgium", "Sg", INCONNU, 271.0},
{"Bohrium", "Bh", INCONNU, 270.0},
{"Hassium", "Hs", INCONNU, 277.0},
{"Meitnérium", "Mt", INCONNU, 278.0},
{"Darmstadtium", "Ds", INCONNU, 281.0},
{"Roentgenium", "Rg", INCONNU, 282.0},
{"Copernicium", "Cn", INCONNU, 285.0},
{"Nihonium", "Nh", INCONNU, 286.0},
{"Flerovium", "Fl", INCONNU, 289.0},
{"Moscovium", "Mc", INCONNU, 289.0},
{"Livermorium", "Lv", INCONNU, 293.0},
{"Tennessine", "Ts", INCONNU, 294.0},
{"Oganesson", "Og", INCONNU, 294.0}
};
const size_t nombreElements = sizeof tablePeriodique / sizeof * tablePeriodique;
size_t questionChoisie;
void nouveauChoix() {
questionChoisie = random(0, nombreElements);
lcd.clear();
lcd.print("Nom de ");
lcd.print((__FlashStringHelper*) tablePeriodique[questionChoisie].symbole);
}
void afficheReponse() {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Symbole:"); lcd.print((__FlashStringHelper*) tablePeriodique[questionChoisie].symbole);
lcd.setCursor(0, 1); lcd.print("nom:"); lcd.print((__FlashStringHelper*) tablePeriodique[questionChoisie].nom);
lcd.setCursor(0, 2); lcd.print("Etat:"); lcd.print(EtatText[pgm_read_byte(&tablePeriodique[questionChoisie].etat)]);
lcd.setCursor(0, 3); lcd.print("Masse:"); lcd.print(pgm_read_float(&tablePeriodique[questionChoisie].masse_atomique), 3);
}
void setup() {
question.attachClick(nouveauChoix);
reponse.attachClick(afficheReponse);
int result = lcd.begin(nbCols, nbLignes);
if (result) {
Serial.print("erreur LCD");
Serial.println(result);
hd44780::fatalError(result);
}
randomSeed(analogRead(A0));
nouveauChoix();
}
void loop() {
question.tick();
reponse.tick();
}Q
R