Cooling-Masters
Connexion · INSCRIPTION · Site Recevoir à nouveau l'e-mail de validation


[Arduino] Topic à Questions-Réponses

Ajouter ou retirer ce sujet de vos favoris  ·  Suivre ce sujet  ·  Imprimer ce sujet
Pages :  1  2  3  4  5  6 
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 19:47:19     
remplacé mais ça m affiche "encore un tour" a chaque fois
Google




     
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 20:01:36     
Donc le If ne détecte pas de changement au niveau du capteur, à voir si il est bien assigné, tout ça ^^

En attendant le ptit chat noir est revenu dans notre jardin, il était planqué dans un coin complètement apeuré, mon chat
à du le poursuivre ^^

EDIIIIIIIIIIIIIIIIT :

Heu je viens d'y penser, mais est ce que ton script met bien à jour le status du voyant ? Si c'est pas dans un loop ou autre il va
resté figé à la valeur par défaut, soit LOW

Faudrait que tu remette le DigitalRead dans le while juste avant la vérif de l'Optique

Message édité par OrOoX le jeudi 22 août 2013 à 20:04:48
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 20:28:18     
Tu vas rire mais même avec le digitalread ça passe pas


Voila le code entier

CODE :

// librairies inclues
#include <Servo.h>
#include <TimeAlarms.h>
#include <Time.h>
#include <LiquidCrystal.h>
// #include <Tone.h> desactive pour le moment car soucis avec d autres librairies, sert a generer des notes avec des temps definis
// pour generer une sonneries, on va utiliser des impulsions pwm sur la sortie 6
//declaration des varaibles

Servo servo;                              // creation de la variable servo ( jusqu'a 9 servo possible)
const int bouton = 8;                     // capteur optique de detection des croquettes dans le tube
const int moteur =  9;                    // moteur du reservoir a croquettes
const int lcdlum =  10;                   // retro-eclairage du lcd
int buttonState = 0;                      // valeur par defaut de l etat du contacteur de niveau de croquettes
int pos = 178;                             // valeur de la variable par defaut de la position servo
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);    // configuration du pin du lcd
int Remplissage_OK = 0;
int Remplissage_Done = 0;
int Optique = digitalRead(bouton);

// configuration des entres sorties, des alarmes et de la date et de son affichage sur le lcd

void setup()

{
 servo.attach(7);                       // on attache le servo a la sortie pwm 7
 pinMode(bouton, INPUT);                // configuration de bouton en entree
 pinMode(moteur, OUTPUT);               // configuration de moteur en sortie
 pinMode(lcdlum, OUTPUT);               // configuration de lcdlum en sortie
 setTime(19,37,0,22,8,13);             // configuration de la date heure/minutes/secondes/mois/jours/annee (a 4 digits ex. 2013)
 Alarm.alarmRepeat(7,30,0,alarme);      // alarme de matin
 Alarm.alarmRepeat(19,40,0,alarme);       // alarme du soir
 lcd.begin(16,2);                       // initialisation du lcd (16 caracteres sur 2 lignes)
 servo.write(178);                      // servo en position ferme

}

// configuration de l alarme

void alarme()
{
 digitalWrite(lcdlum, HIGH);           //  allume l eclairage du lcd
 lcd.setCursor(0, 1);                  //  place le curseur sur la deuxieme ligne
 lcd.print(" a table !!!!");           //  parce qu on est poli aussi avec les chats
 delay (500);                          // attente de 500 millis
 tone(6, 960, 500);                    // on genre un signal sonre sur le pin 6 de 960 hertz
 lcd.setCursor(0, 1);                  //  place le curseur sur la deuxieme ligne
 lcd.print("                 ");       //  efface la deuxieme ligne

 // Début du remplissage du tube  
 while ( Remplissage_OK == 0)
 {
   // On fait tourner le réservoir
   digitalWrite(moteur, HIGH);
   delay(3000);                // 3 secondes par remplissage ( A ajuster )

   // Arrêt du moteur pour contrôler le niveau de croquettes
   digitalWrite(moteur, LOW);
   delay(1000);                // Tempo pour laisser les croquettes tomber
   digitalRead(bouton);
   if ( Optique == HIGH )
 {
   lcd.setCursor(0, 1);
   lcd.print("                ");
   lcd.print("Tube plein ! ");
   delay(2000);

   // Ouverture du tube
   servo.write(90);
   delay(500);              // Tempo pour laisser les croquettes tomber

   // Fermeture du tube
   servo.write(178);
   delay(500);             // Tempo pour laisser le temps de se fermer

    // On met fin à la Boucle
   Remplissage_OK = 1;
   Remplissage_Done = 1;
 }

   else {
     // La Boucle continue
     Remplissage_OK = 0;
     Remplissage_Done = 0;
     lcd.setCursor(0, 1);                  //  place le curseur sur la deuxieme ligne
     lcd.print(" encore un tour! ");         //  parce qu on est poli aussi avec les chats
   }
 }

 // ACTION DE FIN
 if ( Remplissage_Done == 1 )
 {                                  
   tone(6, 880, 500);                    // genere une frequence de 880 hertz de 500 millis sur le pin 6
   delay(500);                           // attente 500 millis
   tone(6, 440, 500);                    // genere une frequence de 440 hertz de 500 millis sur le pin 6
   delay(500);                           // attente 500 millis
   tone(6, 880, 500);                    // genere une frequence de 880 hertz de 500 millis sur le pin 6
   delay(500);
   lcd.setCursor(0, 1);                  //  place le curseur sur la deuxieme ligne
   lcd.print("  bon appetit!");         //  parce qu on est poli aussi avec les chats
   delay (500);
   lcd.setCursor(0, 1);      
   lcd.print("                 ");       //  efface la deuxieme ligne
   digitalWrite(lcdlum, LOW);            //  eteind l eclairage du lcd
 }

}
// configuration de l affichage de l heure sur le lcd en premiere ligne

void affichagelcd()
{

 lcd.setCursor(0, 0);
 lcd.print(hour());
 lcd.setCursor(2, 0);
 lcd.print(":");
 lcd.setCursor(3, 0);
 lcd.print(minute());
 lcd.setCursor(5, 0);
 lcd.print(":");
 lcd.setCursor(6, 0);
 lcd.print(second());
 lcd.setCursor(11, 0);
 lcd.print(day());
 lcd.setCursor(13, 0);
 lcd.print("/");
 lcd.setCursor(14, 0);
 lcd.print(month());
}

// programme principal

void loop()
{
 affichagelcd();
 Alarm.delay(1000);
}
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 20:34:22     
Heu Perecastor, t'aurais pas oublier un morceau par hasard ?

digitalRead(bouton);

au lieu de :

Optique = digitalRead(bouton);

Je dis ça, je dis rien hein


Sinon remet les deux int :
int Remplissage_OK = 0;
int Remplissage_Done = 0;


Au dessus du while sinon ça risque de pas les ré-initialisé à chaque lancement du remplissage
kissagogo27


Méchant Vieux Râleur
Messages : 28148

jeudi 22 août 2013 à 20:41:42     
code OrOox , la voie du régime miracle
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 20:41:49     
Lignes 16,17 et 18

Dans la partie déclarations des variables.

On m a toujours dit que les variables tu les déclares en début et pas comme toi en pleins milieu du code.

Message édité par perecastor le jeudi 22 août 2013 à 20:44:33
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 20:46:30     
Je suis d'accord avec toi pour les déclarations, je fais de même quand c'est possible et que ça m'arrange,
après tout l'arduino c'est pour de la dev, y'a donc la possibilité de mettre au propre petit à petit.

Donc tu peux laisser les int en haut si tu veux, mais met ça au dessus du while :

Remplissage_OK = 0;
Remplissage_Done = 0;


Sinon au prochain lancement, le script risque de zapper direct les croquettes car pour lui y'auras toujours
les valeurs sur 1 en mémoire.
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 20:48:23     
J ai oublié de préciser qu il ne faut RIEN rajouter dans la main loop

La partie distribution des croquette est dans le void alarme() qui est déclenche par les alarme definie qui sonnt a 07h30 et 19h40 dans la partie void setup()
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 20:50:54     
Je te suis pas là
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 20:52:47     
QUOTE (OrOoX) :

Je suis d'accord avec toi pour les déclarations, je fais de même quand c'est possible et que ça m'arrange,
après tout l'arduino c'est pour de la dev, y'a donc la possibilité de mettre au propre petit à petit.

Donc tu peux laisser les int en haut si tu veux, mais met ça au dessus du while :

Remplissage_OK = 0;
Remplissage_Done = 0;


Sinon au prochain lancement, le script risque de zapper direct les croquettes car pour lui y'auras toujours
les valeurs sur 1 en mémoire.

Je les ai rajouté mais pas testé la le chat en a marre lol.
Mais si tu regarde bien il sont présent a la fin du else.
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 20:54:52     
QUOTE (OrOoX) :

Je te suis pas là

Je dit ca car j ai mis le code en entier et que je ne veux rien rajouter dans la main loop.

Toute les modification doivent être présente dans le void alarme() et les setup.
Pas plus sinon le prog ne compte plus correctement et je n ai plus de vrais secondes.

Message édité par perecastor le jeudi 22 août 2013 à 20:55:09
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 20:58:24     
QUOTE :

Mais si tu regarde bien il sont présent a la fin du else.


En effet, mais dans le cas où le tube est plein, le else est ignoré et le programme quitte la boucle en
laissant les deux valeurs sur 1
Sk_rmouche


Apprenti Aigri
Messages : 17926

jeudi 22 août 2013 à 21:18:33     
Je suis à l'étranger là c'est pas possible
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 21:25:45     
Aller hop en exclu pour vos petits yeux, le code actuel de la régule pour la PAC, 364 lignes déjà
et aucune fonction principale n'a vu le jour lol

Le code a pas mal maigri avec l'ajout de fonctions pour compacter le code répétitif tels que les sondes et relais.

SPOILER :


CODE :

/////////////////////////
// PARTIE DES INCLUDES //
/////////////////////////

// Librairies
#include <LiquidCrystal.h>
#include <DHT11.h>

// Définition des pins utilisés par le Shield LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Définiction des valeurs des boutons de l'écran LCD
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// Définition page menu
int page_menu   = 0;
int Menu        = 0;
int min_page    = 0;
int max_page    = 0;
int Null;

// Définition Broches de commandes des relais
int c_relai_1     = 39;
int c_relai_2     = 41;
int c_relai_3     = 43;
int c_relai_4     = 45;
int c_relai_5     = 47;
int c_relai_6     = 49;
int c_relai_7     = 51;
int c_relai_8     = 53;

int id_relai      = 0;
int pin_relai[]   = {Null, 39, 41, 43, 45, 47, 49, 51, 53};
char nom_relai[]  = {Null, c_relai_1, c_relai_2, c_relai_3, c_relai_4, c_relai_5, c_relai_6, c_relai_7, c_relai_8};

// Définition status relais
int relai_in    = 0;
int sel_relai[] = {Null, 0, 0, 0, 0, 0, 0, 0, 0}; // Status des relais

// Définition Sondes Temp & Humidité
int sonde_in;
char sel_sonde[]  = {Null, A1, A2, A3, A4, A5, A6, A7, A8};

// Définition status des pages
int aff_temp     = false;
int aff_reglages = false;
int aff_relais   = false;
int aff_inputs   = false;

//////////////////////////
// PARTIE DES FONCTIONS //
//////////////////////////

// Fonction affichage Temp & Humidité
int aff_temp_humi(int sonde_in)
{
 char sonde = sel_sonde[sonde_in];
 DHT11 dht11(sonde);
 int err;
 float temp, humi;
 
 dht11.read(humi, temp); // Lecture de la température et hygrométrie
 
 // RAZ deuxième ligne
 lcd.setCursor(0,1);
 lcd.print("S  ");
 lcd.setCursor(1,1);
 lcd.print(page_menu);
 lcd.setCursor(9,1);
 lcd.print(" ");
 
 // Affichage température
 lcd.setCursor(3,1);
 lcd.print(temp);
 lcd.setCursor(8,1);
 lcd.print("C");
   
 // Affichage hygrométrie
 lcd.setCursor(10,1);
 lcd.print(humi);
 lcd.setCursor(15,1);
 lcd.print("%");
 
 delay(250);
}

// Lecture de la valeur des boutons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);

 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50)   return btnRIGHT;
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;
 
 return btnNONE;
}

// Affichage de l'état du relai
int aff_etat_relai(int relai_in)
{
 int status_relai = sel_relai[relai_in];
 lcd.setCursor(0,1);
 lcd.print("Relai  :");
 lcd.setCursor(6,1);
 lcd.print(page_menu);  
 lcd.setCursor(9,1);
 lcd.print(status_relai);
 lcd.setCursor(10,1);
 lcd.print("      ");
}

int maj_relai(int id_relai)
{
  if (sel_relai[id_relai] == 1)
  {
    digitalWrite(nom_relai[id_relai], LOW);
    sel_relai[id_relai] = 0;
  }
  else {
    digitalWrite(nom_relai[id_relai], HIGH);
    sel_relai[id_relai] = 1;
  }
}

////////////////////////////////
// PARTIE AFFICHAGE DES PAGES //
////////////////////////////////

// Affichage menu princiapl
int affichage_menu_princ()
{
 if (page_menu == 1)
 {
   lcd.setCursor(0,1);
   lcd.print("Afficher Temp.  ");
 }
 else if (page_menu == 2)
 {
   lcd.setCursor(0,1);
   lcd.print("Configuration   ");
 }
 else if (page_menu == 3)
 {
   lcd.setCursor(0,1);
   lcd.print("Etat des relais ");
 }
 else if (page_menu == 4)
 {
   lcd.setCursor(0,1);
   lcd.print("Etat des inputs ");
 }
 else {
   lcd.setCursor(0,1);
   lcd.print("-> DEBUT MENU <-");
 }
}

// Affichage menu des températures & hygrométrie
int affichage_menu_temp()
{  
 // AFFICHAGE DES TEMPERATURES
 if (page_menu != 0 && page_menu <= 4)
 {
   aff_temp_humi(page_menu);
 }
 else {
   lcd.setCursor(0,1);
   lcd.print("-> DEBUT LIST <-");
 }
}

// Affichage du menu des réglages
int affichage_menu_reglages()
{
 // CODE
}

// Affichage du menu des relais électriques
int affichage_menu_relais()
{
 // AFFICHAGE DE L'ETAT DES RELAIS
 if (page_menu != 0)
 {
   aff_etat_relai(page_menu);
 }
 else {
   lcd.setCursor(0,1);
   lcd.print("-> DEBUT LIST <-");
 }
}

// Affichage de l'état des entrées
int affichage_menu_inputs()
{
 // AFFICHAGE DE L'ETAT DES INPUTS
}

////////////////////////
// PARTIE DES SCRIPTS //
////////////////////////

// Incrémentation des pages
int incr_page()
{
  if (aff_temp == true)
  {
    min_page = 1;
    max_page = 7;
  }
  else if (aff_reglages == true)
  {
    min_page = 1;
    max_page = 8;
  }
  else if (aff_relais == true)
  {
    min_page = 1;
    max_page = 7;
  }
  else if (aff_relais == true)
  {
    min_page = 1;
    max_page = 8;
  }
  else {
    min_page = 1;
    max_page = 8;
  }
 
    if (lcd_key == 2 && page_menu >= min_page)
    {
     --page_menu;
    }
    if (lcd_key == 1 && page_menu <= max_page)
    {
     ++page_menu;
    }
}

// Sélection des pages
int select_menu()
{
 // Touche SELECT
 if (lcd_key == 4)
 {
   if (aff_temp == false && aff_reglages == false && aff_relais == false && aff_inputs == false)
   {
     if (page_menu == 1 )
     {
       aff_temp = true;
       page_menu = 0;
     }
     else if (page_menu == 2)
     {
       aff_reglages = true;
       page_menu = 0;
     }
     else if (page_menu == 3)
     {
       aff_relais = true;
       page_menu = 0;
     }
     else if (page_menu == 4)
     {
       aff_inputs = true;
       page_menu = 0;
     }
   }
   
 }
 
 // Touche LEFT => RESET
 if (lcd_key == 3)
 {
   aff_temp = false;
   aff_reglages = false;
   aff_relais = false;
   aff_inputs = false;
   page_menu = 0;
 }
 
 // Forçage des relais
 if (aff_relais == true && lcd_key == 4)
 {
   maj_relai(page_menu);
 }
}

// Initialisation de variables
void setup()
{
 // Définition du Mode des broches Relais
 pinMode(c_relai_1, OUTPUT);
 pinMode(c_relai_2, OUTPUT);
 pinMode(c_relai_3, OUTPUT);
 pinMode(c_relai_4, OUTPUT);
 pinMode(c_relai_5, OUTPUT);
 pinMode(c_relai_6, OUTPUT);
 pinMode(c_relai_7, OUTPUT);
 pinMode(c_relai_8, OUTPUT);
 
 // Initialisation de l'écran sur 16 colonnes et 2 lignes
 lcd.begin(16, 2);
}

// "Bouclage"
void loop()
{
 lcd_key = read_LCD_buttons();  // Lecture du bouton
 incr_page();    // Script incrément page
 select_menu(); // Script de détection sélection
 
 lcd.setCursor(3,0);
 lcd.print(".: MENU :."); // print a simple message
 
 lcd.setCursor(0,0);
 lcd.print(millis()/1000);      // Affiche en seconde le temps de fonctionnement
 
 lcd.setCursor(14,0);
 lcd.print("#");
 lcd.setCursor(15,0);
 lcd.print(page_menu);
 
 if (aff_temp == true)
 {
   // CODE
   affichage_menu_temp();
 }
 
 else if (aff_reglages == true)
 {
   // CODE
   affichage_menu_reglages();
 }
 
 else if (aff_relais == true)
 {
   // CODE
   affichage_menu_relais();
 }
 
 else if (aff_inputs == true)
 {
   // CODE
   affichage_menu_inputs();
 }
 
 else {
   Menu = affichage_menu_princ();
 }
 
 delay(250);
}

kissagogo27


Méchant Vieux Râleur
Messages : 28148

jeudi 22 août 2013 à 21:36:43     
wé déjà pas laisser crever le chat de faim avant de faire péter ta pac
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 21:47:57     
Bah vu la dernière vidéo, il va plutôt mourir de sur-nutrition
Budington


Membre
Messages : 2830

jeudi 22 août 2013 à 22:15:09     
Image
kissagogo27


Méchant Vieux Râleur
Messages : 28148

jeudi 22 août 2013 à 22:34:39     
boarf suffit de réduire le diam interne et hop
perecastor


Modérateur-faker/Portuguais des iles/父 亲河&a
Messages : 15091

jeudi 22 août 2013 à 22:56:24     
Adrien, ça fait toujours pareil!
J ai toujours le "encore un tour!" qui ressort.
Je lâche l affaire pour ce soir et je remet ma version avec ses if ^^
au moins y en a un qui me fera pas chier demain matin.
Au passage, une fois fermé on n entend rien depuis la chambre
Budington


Membre
Messages : 2830

jeudi 22 août 2013 à 23:10:18     
sauf le chat qui miaule a cause de sa crise de foie
OrOoX


AFK ? Késako ? :D
Messages : 9889

jeudi 22 août 2013 à 23:24:19     
C'est bizarre ça quand même, les tests avec mon bouton fonctionnait bien, tu as du le voir sur la vidéo ...


Faudrait faire un Loop du capteur et voir ce qu'il retourne si tu coupe le faisceau ou non car là je sèche ...

Remet le nom par défaut ( buttonState )pour voir, ça ce trouve c'est la majuscule au début qui fou la merde car si on regarde
les fonctions et autres c'est : digitalRead() ou encore pinMode()

Edit : Quote d'un PDF

QUOTE :


2.10 Règles d'écriture
Le C est "case sensitive" mais à part cela vous pouvez nommer les variables et constantes
commevous voulez. Mais si vous ne voulez pas vous fairetraiter de mauvais programmeur
au premier coup d'oeil jeté à votre programme, il faut suivre les règles suivantes :

les constantes ont un nom qui commence par une majuscule ValeurMax
les variables ont un nom qui commence par une minuscule demiPeriode
les noms des identificateurs sont significatifs (pas de var, toto)


Apparemment le problème vient bien de "Optique"

Message édité par OrOoX le jeudi 22 août 2013 à 23:28:52
moyen_moins


aka metalazzo | Anti²Bug
Messages : 10216

vendredi 23 août 2013 à 01:10:10     
moi j'aurais mis Optique = digitalRead(bouton); dans la boucle
et juste int Optique en déclaration de variable
OrOoX


AFK ? Késako ? :D
Messages : 9889

vendredi 23 août 2013 à 01:34:31     
C'est déjà le cas sur son dernier code, mais d'après ce que j'ai vu faut que Optique soit marqué en minuscule
moyen_moins


aka metalazzo | Anti²Bug
Messages : 10216

vendredi 23 août 2013 à 02:00:56     
Non.
"Vous pouvez nommer les variables et constantes comme vous voulez."
Si tu veux faire propre ou ayatollah du C, OK sinon, ça doit pas avoir d'impact.
OrOoX


AFK ? Késako ? :D
Messages : 9889

vendredi 23 août 2013 à 03:11:24     
Bah faut reconnaitre que y'a une part de mystère car avec ça :

buttonState = digitalRead(bouton);

Bah ça fonctionne, mais pas avec ça :

Optique = digitalRead(bouton);


J'ai comparé les deux programmes, je vois que ça qui pourrait foutre la merde ...


D'ailleurs de son côté, les 4 points d'exclamations ne font pas buguer son arduino mais de mon côté c'est
le cas, donc va savoir, peut être que Optique fait buguer la sienne mais pas la mienne !

Message édité par OrOoX le vendredi 23 août 2013 à 03:12:32
Google




     
Pages :  1  2  3  4  5  6