C'est mon 1er projet sur arduino. Habituellement je programme mes microcontrôleur en assembleur. je me lance dan le langage C.
J'ai fait un projet d'un coupleur de batteries pour camping car avec un LCD déporté en I2C.
Un double relais a seuil avec affichage des tension et de l'etat des 2 sorties relais.
Maintenant j'ai introduit une communication Modbus slave sur mon arduino afin de récupéré les 2 tensions et l'etat de mes relais.
la communication fonctionne (je scanne avec Tabdia32) mes mon problème , j'obtient ZERO pour mes 2 valeurs analogique ???? alors que je les lit sur le LCD.
Pour faire mon code , je me suis inspiré de tutos trouver sur le net.
Code : Tout sélectionner
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
modbusDevice regBank;
modbusSlave slave;
#define RS485TxEnablePin 2
#define RS485Baud 9600
#define RS485Format SERIAL_8E1
#define LED1 11
#define LED2 12
// Entrées Analogiques physiques
const int Ain0 = A0; // Broche entrée 0-5V Voie 0
const int Ain1 = A1; // Broche entrée 0-5V Voie 1
const int Ain2 = A2; // Broche entrée 0-5V Voie 2
const int Ain3 = A3; // Broche entrée 0-5V Voie 3
// Sorties TOR physiques
const int Couplage = 3; // Sortie relai couplage pin 3
const int Batt_Low = 4; // Sortie batterie faible pin 4
// Variable de stokage de la valeur
int Voie0 = 0;
int Voie1 = 0;
int Voie2 = 0;
int Voie3 = 0;
word batt_V = 0; // Tension Batterie Vehicule en Mv
word batt_A = 0; // Tension Batterie Auxilliaire en Mv
float U_batt_V = 0; // Tension Batterie Vehicule
float U_batt_A = 0; // Tension Batterie Auxilliaire
// LCD I2C
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27 // <<----- Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
//LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
void setup()
{
pinMode(Couplage, OUTPUT); // Pin en mode Sortie
pinMode(Batt_Low, OUTPUT); // Pin en mode Sortie
lcd.begin (16,2); // <<----- My LCD was 16x2
lcd.home (); // go home
//Assign the modbus device ID.
regBank.setId(1);
//Add Analog Input registers to the register bank
regBank.add(30001);
regBank.add(30002);
//Add Analog Output registers to the register bank
regBank.add(40001);
regBank.add(40002);
slave._device = ®Bank;
slave.setBaud(&Serial,RS485Baud,RS485Format,RS485TxEnablePin);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
}
void loop()
{
{
digitalWrite(LED1, regBank.get(40001));
digitalWrite(LED2, regBank.get(40002));
Voie0 = analogRead(Ain0);
batt_V = (Voie0 * 1500) / 1024;
regBank.set(30001, (word) batt_V);
//regBank.set(30001, (word) analogRead(A0)); //from 0 - 1023
Voie1 = analogRead(Ain1);
batt_A = (Voie1 * 1500) / 1024;
regBank.set(30002, (word) batt_A);
//regBank.set(30002, (word) analogRead(A1)); //from 0 - 1023
slave.run();
}
// Tension Batterie Véhicule
{
U_batt_V = (Voie0 * 15.0) / 1024.0;
if(U_batt_V > 13.5)
{
digitalWrite(Couplage, HIGH);
lcd.setCursor(13, 0);
lcd.print("ON ");
}
else if(U_batt_V < 12.5)
{
digitalWrite(Couplage, LOW);
lcd.setCursor(13, 0);
lcd.print("OFF");
}
else
delay(500);
}
// Tension Batterie Auxilliaire
{
U_batt_A = (Voie1 * 15.0) / 1024.0;
if(U_batt_A > 12.5)
{
digitalWrite(Batt_Low, HIGH);
lcd.setCursor(13, 1);
lcd.print("ON ");
}
else if(U_batt_A < 10.5)
{
digitalWrite(Batt_Low, LOW);
lcd.setCursor(13, 1);
lcd.print("OFF");
}
else
delay(500);
}
// Affiche Sur Le LCD
{
lcd.setCursor(0, 0);
lcd.print("BATT V=");
lcd.setCursor(7, 0);
lcd.print(U_batt_V);
lcd.setCursor(0, 1);
lcd.print("BATT A=");
lcd.setCursor(7, 1);
lcd.print(U_batt_A);
}
}
Steph