En cours aide pour programmation Arduino

  • Auteur de la discussion SEVEN40
  • Date de début
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #1
Bonjour a tous.

J'aurai besoin d'un coup de main pour programmer une carte Arduino Nano.

Je voudrai réaliser un montage , trouvé sur ce lien : https://forums.nasioc.com/forums/showthread.php?t=2810122

J'ai installé le logiciel Arduino IDE et quand je "vérifie" le programme, il sort plein de messages d'erreurs lorsque je "vérifie" le code.

J'aimerai essayer par moi même de me dépatouiller car c'est l'occasion pour moi d'apprendre ( du moins d'essayer) comment ça fonctionne mais je sent que je vais avoir besoin d'aide.

Comme vous le comprendrez assez rapidement, c'est pour utiliser un capteur de taux d'ethanol afin de le rendre "lisible" par ma gestion programmable.


Est-ce que quelqu'un ici pourrai vérifier le programme afin de me dire si c'est moi qui le "copie" mal dans le logiciel ou bien s'il y as réellement des erreurs?
Merci de m'avoir lu et merci d'avance pour votre aide! :-D
 
C
cr-_-
Compagnon
29 Sept 2009
871
FR-31 Plaisance du touch
Bonjour,
Il serait plus facile d'aider avec les messages d'erreurs. Si tu peux nous faire un copier coller des messages sur la console on pourra t'en dire plus

Bonne journée
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 265
Corsier-sur-Vevey (Vaud)
Bonjour SEVEN40
Est-ce que quelqu'un ici pourrai vérifier le programme afin de me dire si c'est moi qui le "copie" mal
Je l'ai vérifié, c'est OK
Au moment de la vérification, si le texte
472341

apparaît, c'est que le programme est OK et que le reste sont des warnings.
Pour supprimer ces warnings, c'est dans le menu Fichier/préférences/
472344

Mettre défaut.

S'il y a des erreurs à la compilation le bouton
472342

Apparaît à droite en bas de la fenêtre.

Cordialement
jpbbricole
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #4
Merci a vous pour votre aide!

Vu que je débute, un rien m'arrête ! :-D

Je vais retenter la manip et voir si j'y arrive mieux cette fois, un grand merci a vous deux !
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #5
Bonsoir.

Voilà les messages d'erreur qui s'affichent. Il faut que j'étudie ça mais je pense que je ne doit pas "entrer" les codes correctement :oops:
Merci de votre aide !

*********************************************************************************************************************************************

Arduino : 1.8.9 (Windows Store 1.8.21.0) (Windows 10), Carte : "Arduino/Genuino Uno"
C:\Users\SEVEN\Documents\Arduino\sketch_may05a\sketch_may05a.ino: In function 'void setup()':
sketch_may05a:28:1: error: a function-definition is not allowed here before '{' token
{
^
In file included from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Arduino.h:30:0,
from sketch\sketch_may05a.ino.cpp:1:
sketch_may05a:36:1: error: expected unqualified-id before string constant
ISR(TIMER1_CAPT_vect) // PULSE DETECTED! (interrupt automatically triggered, not called by main program)
^
sketch_may05a:37:1: error: a function-definition is not allowed here before '{' token
{
^
In file included from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Arduino.h:30:0,
from sketch\sketch_may05a.ino.cpp:1:
sketch_may05a:42:1: error: expected unqualified-id before string constant
ISR(TIMER1_OVF_vect) // counter overflow/timeout
^
sketch_may05a:43:1: error: a function-definition is not allowed here before '{' token
{ revTick = 0; } // Ticks per second = 0
^
sketch_may05a:47:1: error: a function-definition is not allowed here before '{' token
{
^
sketch_may05a:62:13: error: a function-definition is not allowed here before '{' token
void loop() {
^
sketch_may05a:163:1: error: expected '}' at end of input
}
^
exit status 1
a function-definition is not allowed here before '{' token
Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.
 
Yourix
Yourix
Ouvrier
24 Fev 2015
338
Isère
Pas d'erreurs chez moi, t'es sur que tu copie bien depuis la première ligne de "/***********" jusqu'au dernier " } " ??
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #8
Merci de vos réponses :-D

Je "colle" ceci dans la fenêtre du logiciel , je ne sais pas exactement a partir d'où je doit copier :oops:

********************************************************/

// include the library code:
#include <LiquidCrystal.h> //LCD plugin

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 9, 4, 5, 6, 7); //LCD Keypad Shield

int inpPin = 8; //define input pin to 8
int outPin = 11; //define PWM output, possible pins with LCD and 32khz freq. are 3 and 11 (Nano and Uno)

//Define global variables
volatile uint16_t revTick; //Ticks per revolution
uint16_t pwm_output = 0; //integer for storing PWM value (0-255 value)
int HZ; //unsigned 16bit integer for storing HZ input
int ethanol = 0; //Store ethanol percentage here
float expectedv; //store expected voltage here - range for typical GM sensors is usually 0.5-4.5v

int duty; //Duty cycle (0.0-100.0)
float period; //Store period time here (eg.0.0025 s)
float temperature = 0; //Store fuel temperature here
int fahr = 0;
int cels = 0;
static long highTime = 0;
static long lowTime = 0;
static long tempPulse;

void setupTimer() // setup timer1
{
TCCR1A = 0; // normal mode
TCCR1B = 132; // (10000100) Falling edge trigger, Timer = CPU Clock/256, noise cancellation on
TCCR1C = 0; // normal mode
TIMSK1 = 33; // (00100001) Input capture and overflow interupts enabled
TCNT1 = 0; // start from 0
}

ISR(TIMER1_CAPT_vect) // PULSE DETECTED! (interrupt automatically triggered, not called by main program)
{
revTick = ICR1; // save duration of last revolution
TCNT1 = 0; // restart timer for next revolution
}

ISR(TIMER1_OVF_vect) // counter overflow/timeout
{ revTick = 0; } // Ticks per second = 0


void setup()
{
Serial.begin(9600);
pinMode(inpPin,INPUT);
setPwmFrequency(outPin,1); //Modify frequency on PWM output
setupTimer();
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Initial screen formatting
lcd.setCursor(0, 0);
lcd.print("Ethanol: %");
lcd.setCursor(0, 1);
lcd.print(" Hz C");
}

void loop()
{
getfueltemp(inpPin); //read fuel temp from input duty cycle

if (revTick > 0) // Avoid dividing by zero, sample in the HZ
{HZ = 62200 / revTick;} // 3456000ticks per minute, 57600 per second
else
{HZ = 0;} //needs real sensor test to determine correct tickrate

//calculate ethanol percentage
if (HZ > 50) // Avoid dividing by zero
{ethanol = (HZ-50);}
else
{ethanol = 0;}

if (ethanol > 99) // Avoid overflow in PWM
{ethanol = 99;}

expectedv = ((((HZ-50.0)*0.01)*4)+0.5);
//Screen calculations
pwm_output = 1.1 * (255 * (expectedv/5.0)); //calculate output PWM for ECU

lcd.setCursor(10, 0);
lcd.print(ethanol);

lcd.setCursor(2, 1);
lcd.print(HZ);

lcd.setCursor(8, 1);
lcd.print(temperature); //Use this for celsius

//PWM output
analogWrite(outPin, pwm_output); //write the PWM value to output pin

delay(100); //make screen more easily readable by not updating it too often

Serial.println(ethanol);
Serial.println(pwm_output);
Serial.println(expectedv);
Serial.println(HZ);
delay(1000);


}

void getfueltemp(int inpPin){ //read fuel temp from input duty cycle
highTime = 0;
lowTime = 0;

tempPulse = pulseIn(inpPin,HIGH);
if(tempPulse>highTime){
highTime = tempPulse;
}

tempPulse = pulseIn(inpPin,LOW);
if(tempPulse>lowTime){
lowTime = tempPulse;
}

duty = ((100*(highTime/(double (lowTime+highTime))))); //Calculate duty cycle (integer extra decimal)
float T = (float(1.0/float(HZ))); //Calculate total period time
float period = float(100-duty)*T; //Calculate the active period time (100-duty)*T
float temp2 = float(10) * float(period); //Convert ms to whole number
temperature = ((40.25 * temp2)-81.25); //Calculate temperature for display (1ms = -40, 5ms = 80)
int cels = int(temperature);
cels = cels*0.1;
float fahrtemp = ((temperature*1.8)+32);
fahr = fahrtemp*0.1;

}

void setPwmFrequency(int pin, int divisor) { //This code snippet raises the timers linked to the PWM outputs
byte mode; //This way the PWM frequency can be raised or lowered. Prescaler of 1 sets PWM output to 32KHz (pin 3, 11)
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #9
Ayé c'est bon cette fois, ça marche!

Maintenant je n'ai plus qu'a essayer de comprendre comment ce langage fonctionne :oops:
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 265
Corsier-sur-Vevey (Vaud)
Bonsoir SEVEN40
Maintenant je n'ai plus qu'a essayer de comprendre comment ce langage fonctionne :oops:
Super :smt023

La prochaine fois que tu postes du code, utilises la fonction pour
472585


Ainsi, tu sera un vrai pro :wink:

Cordialement
jpbbricole
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #12
Merci a vous! Je vais essayer de m'y mettre, ça fait des années que j'ai envie de me "secouer les méninges", c'est peut-être la bonne cette fois!
 
MegaHertz
MegaHertz
Compagnon
31 Août 2017
1 055
wika58
wika58
Compagnon
17 Déc 2006
13 124
FR-54560 Lorraine
Merci jpb, je vais potacer...
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #17
Bonjour a tous!

Suite a ce topic, j'ai pu finaliser mon montage… … mais ça ne marche pas , malheureusement pour moi.

J'ai branché mon oscilloscope sur le capteur ( alimenté en 12 volts bien sur) et il ne sort aucun signal, en dehors d'un genre de "friture", bref je suis sensé pouvoir lire une "fréquence" d'environ 50 hz et ça n'est pas le cas, donc je pense que le capteur est h.s

Par contre, mon oscilloscope me permets de générer un signal, que je me suis empressé d'envoyer sur la carte Arduino, et là, a ma grande surprise, au lieu d'avoir un voltage "fixe", j'ai un espèce de signal tout brouillon mais qui monte jusqu'à 5 volts! Et ça, que j'alimente l'entrée ou pas!

Bref, je vais devoir potasser le programme de ma carte Arduino parce que je ne comprends pas trop pourquoi j'ai un signal "haché" au lieu d'avoir un voltage fixe :oops:

J'essaye de faire des captures d'écran de la lecture oscillo si jamais ça peut clarifier mes explications , je vous tien au courant de mes investigations dès que possible!
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 265
Corsier-sur-Vevey (Vaud)
Bonjour SEVEN40
a ma grande surprise, au lieu d'avoir un voltage "fixe", j'ai un espèce de signal tout brouillon mais qui monte jusqu'à 5 volts!
C'est normal, sur un Arduino Nano, il n'est pas possible de "sortir" un signal analogique, ce ne peut âtre que du PWM, mets toujours tes copies d'écran.

Cordialement
jpbbricole
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #19
Bonjour @jpbbricole

Merci pour ton message, tu as tout a fait raison, je viens de trouver l'info , merci pour la confirmation!
Du coup je suis retourné contrôler a l'oscilloscope, en "sortie" de l'Arduino j'ai bien un signal pulsé. Après avoir relu les explications du gars qui as mis la modif en ligne, j'ai aussi compris le "pourquoi" de la résistance sur le signal de sortie.

Du coup j'ai revérifié le signal de mon capteur d'éthanol et je pense que finalement il n'est pas hs. Tout simplement l'étalonnage de ce capteur est différent des valeurs utilisées dans le programme Arduino, donc il y as une bonne chance pour que si j'ajuste les valeurs dans le programme, tout se mette a fonctionner correctement.

Par exemple le capteur donne 2 infos : la fréquence donne la quantité d'éthanol et la largeur du signal donne la température du carburant.
Toujours d'après les valeurs du programme, la largeur du "pulse" en entrée Arduino doit être de 5 ms maxi , moi je mesure une largeur de pulse de 18ms environ!
Maintenant, je doit tester le capteur un coup avec de l'essence E5 puis avec de l'E85 , c'est une manip que j'aurai du faire dès le début au final !

Pour les captures d'écran j'essaie d'en faire demain, en espérant que je pourrai aussi tester le capteur. A voir si je ne vais pas être obligé de "filtrer" le signal en ajoutant un condensateur car j'ai peur que l'entrée de ma carte "reprogrammable" soit trop "sensible"

A bientôt pour la suite!
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #20
Bonjour a tous!

Après avoir repris mon circuit, vérifié mon câblage et recontrôlé tout ça, a priori on est bon , cette fois ça fonctionne!
Alors la "panne": pour faire simple, j'ai voulu faire passer le signal venant du capteur par le brochage de mon boitier d'injection, afin de faciliter son extraction en cas de besoin.
J'ai donc rajouté une broche , qui portais mal. Du coup lors de mes contrôles a l'oscillo, je "lisais" le signal venant de l'Arduino uniquement.

Quant au signal de sortie de l'Arduino, effectivement comme me l'as fait judicieusement remarqué @jpbbricole , le signal de sortie est du pwm, donc ça explique ce que je lisais a l'oscillo.
Du coup, deux constats sont s'en suivi: l'entrée analogique sur mon emulateur d'eeprom n'est pas adaptée a recevoir ce type de signal, donc je suis passé par un autre chemin.
Autre constat, en cas de "coupure" du signal d'entrée, l'Arduino sort le signal "maxi" en sortie, je trouve ça un peu bizarre et il faudra que je revérifie tout ça. Au final si c'est le cas, si le capteur d'ethanol viens a tomber en panne, au moins je sera plutôt plus riche que trop pauvre...

Merci de m'avoir lu et de votre aide, la prochaine étape sera de potasser le fonctionnement de la petite bête bleue !
 
MegaHertz
MegaHertz
Compagnon
31 Août 2017
1 055
Autre constat, en cas de "coupure" du signal d'entrée, l'Arduino sort le signal "maxi" en sortie, je trouve ça un peu bizarre et il faudra que je revérifie tout ça. Au final si c'est le cas, si le capteur d'ethanol viens a tomber en panne, au moins je sera plutôt plus riche que trop pauvre...
Bonjour,

Ca s'appelle un branchement pull-up.
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #22
Bonjour a tous!

Me revoilà avec un nouveau projet d'utilisation de carte arduino.
Les grandes lignes: actuellement sur mon véhicule je dispose de 4 manomètres qui m'affichent des informations sur le fonctionnement du moteur.
Deux de ces manomètres ont une sortie "0-5volts" qui me permet de récupérer leurs informations pour ma gestion moteur.
Vous l'aurez compris, mes deux autres manomètres n'ont pas cette fameuse sortie, et bien entendu le prix de manomètres équipés de ces sorties est exorbitant ...
Par ailleurs je commence a manquer de place sur mon tableau de bord donc j'aimerai supprimer les afficheurs et utiliser une carte arduino nano pour récupérer les valeurs des capteurs et les envoyer sur ma gestion programmable.

Dans un premier temps, je vais donc devoir déterminer le type de capteurs dont je dispose, la sonde de température est de type CTN si j'ai bien saisi, quand au capteur de pression c'est une "varistance" dont je doit mesurer la plage ( ainsi que faire un relevé du capteur de température).

J'ai essayé de trouver sur la toile si quelqu'un avais réalisé ce genre de montage mais je n'ai rien trouvé qui "colle" parfaitement a mon utilisation, je vais donc continuer mes recherches et voir si je peut réaliser dans un premier temps la partie "physique" puis envisager de faire le programme :oops: mais je sent d'ors et déjà que je vais avoir besoin d'aide!

A bientôt!
 
shodan47
shodan47
Compagnon
24 Juin 2019
757
47700 Casteljaloux
pour ma part plutôt que d'utiliser une nano j'utilise des Mega2560 pro guère plus gros qu'une nano, mais beaucoup plus large d'utilisation, après faut souder toutes les entrées sorties.
On trouve beaucoup de morceaux de programme sur le web, mais vaut mieux ne pas faire des copier coller, et essayer de comprendre ce que l'on fait. Arduino a beaucoup de possibilités
 
C
cr-_-
Compagnon
29 Sept 2009
871
FR-31 Plaisance du touch
Bonjour,
pour aider peut être un peu plus quelles sont les grandeurs à acquérir ?
la pression et la température, pour quel fluide, quelle plage, quelle réactivité et quelle précision ?
avant de choisir la carte il faut savoir ce que tu veux mesurer et ce que tu veux sortir, vient en suivant le choix de l'outil
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #25
Bonsoir @cr-_-

Oui c'est tout a fait logique comme raisonnement, la carte nano je l'ai déjà en ma possession donc si je peut la réutiliser tant mieux, si je ne peut pas, tant pis!
Pour les fluides, c'est l'huile que je veut surveiller, donc température et pression.
Pour la plage, la même que les manomètres ce serai parfait, en température, de 40° a 150° et en pression de 0 a 10 bars.
Pour la précision, en température +/- 5° je pense, c'est surtout pour avoir un "repère", quant a la pression par contre, +/-0.2 bar si possible, mais ça dépends déjà principalement de la qualité des capteurs dont je dispose!

Par contre je ne suis pas contre l'idée d'acheter un capteur de pression plus précis/costaud, il y en as a prix "sympa" sur ali*****

Pour la réactivité par contre, la contrainte n'est pas la même, la température mets bien plus de temps a changer que la pression, donc j'aurai besoin d'avoir un "rafraichissement" plus important sur la pression que sur la température.

Voilà, en espérant que ça éclaircisse un peu le tableau! :-D
 
SEVEN40
SEVEN40
Compagnon
5 Jan 2013
1 008
LANDES
  • Auteur de la discussion
  • #26
Bonjour a tous

J'ai un peu réfléchi au problème, je me demande si finalement je ne vais pas procéder autrement.
En effet, la carte qui doit reçevoir le signal "o-5v" , je peut la paramétrer.
D'un autre côté, je peut envisager de mettre les capteurs en série sur deux circuits en 5 volts, après je n'aurai que l'étalonnage des capteurs a faire, et ce en entrant les échelles dans ma carte?

Je pense que ça sera beaucoup plus simple au final que de passer par l'arduino, c'est dommage car c'est pour moi l'occasion de me creuser un peu les méninges , mais déjà rien que de réaliser le circuit avec les capteurs serai pour moi un gros challenge!

A voir si ça fonctionne bien entendu!
 
Haut