Connexion
·
INSCRIPTION
·
Site
Recevoir à nouveau l'e-mail de validation
Forum Cooling-Masters
>
Electronique
>
Réalisations diverses
[Arduino] Topic à Questions-Réponses
Ajouter ou retirer ce sujet de vos favoris
·
Suivre ce sujet
·
Imprimer ce sujet
Bas de page
Pages :
1
2
3
4
5
6
Page précédente
Page suivante
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
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
Haut de page
Pages :
1
2
3
4
5
6
Page précédente
Page suivante
Forum Cooling-Masters
>
Electronique
>
Réalisations diverses
Page générée en 0.021 secondes