Bonjour, désolé de ne pas avoir répondu plus tôt
Donc je vous post mon code Arduino qui fonctionne pour la lecture de l'entrée analogique et le code visual c# associé
Ensuite je vous posterai (dans un autre post pour eviter toutes confusion ce que j'ai essayé de faire pour commander le moteur mais qui ne marche pas
Donc voici mon code Arduino :
void setup()
{
Serial.begin(19254 );
}
void loop()
{
if(Serial.available())
{
int c = Serial.read();
if (c == '4')
{
Serial.println(analogRead(A1));
}
}
}
et le code visual c#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;
using System.Windows.Forms.DataVisualization.Charting;
using Microsoft.Office.Interop.Excel;
using ApplicationForm = System.Windows.Forms.Application;
using System.Globalization;
namespace Acqu_donnee
{
public partial class Form1 : Form
{
SerialPort Port1; //ouverture du port série
public Form1()
{
InitializeComponent();
for (int i = 1; i <= 50; i++)
{
try
{
Port1 = new SerialPort("COM" + i, 19254); //Port1 trouve le port COM du PC
Port1.Open(); //Port1 est ouvert
Port1.ReadTimeout = 1000; //Delais pour l'écriture
Port1.WriteTimeout = 1000; //Délais pour la lecture
Port1.Write("4"); //Ecrit 4 sur le port 1
byte[] lus = new byte[8];
int nblu = Port1.Read(lus, 0, 8);
if (nblu > 0)
{
return; // port trouvé
}
}
catch (Exception)
{
Port1.Dispose();
}
}
}
public void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (Port1.IsOpen) Port1.Close(); //Ferme le port1 à la fermeture du programme
}
public void timer1_Tick(object sender, EventArgs e) //Evenement à chaque tick du Timer1
{
string r = ""; //défini r comme un string vide
double x = 0; //défini x comme un double vide
double value = 0; //Défini vélue comme un double vide
if (Lect_mes.Checked) //Si Lect_mes est cochée
{
Port1.Write("4"); //on écrit 4 sur le port1
}
r = Port1.ReadLine(); //r = ce qu'il lit sur le port1
try
{
x = Convert.ToDouble(r); //converti un Char en Double
value = Math.Round((x / 1024 * 5 * 2 * 196.2), 2); //On calcul la pression
//1024 = 0...1023 échantillons (valeur renvoyée par le port1)
//5 car on est sur la plage 0...5V
//196.2 convertion Kg en Newton
//2, on arrondis à 2 décimales
}
catch
{
if (listBox1.Items.Count == 0)
{
value = 0;
}
else
{
value = double.Parse( listBox1.Items[listBox1.Items.Count - 1].ToString());
}
}
listBox1.Items.Add(value); //Ajoute les valeurs de value dans la ListBox
listBox1.SelectedIndex = listBox1.Items.Count - 1; //AutoScroll de la ListBox
double xVal = listBox1.Items.Count * 0.02; //Valeur axe des x
chart1.Series[0].Points.AddXY(xVal, value); //Ecriture des points sur le graph
chart1.ChartAreas[0].AxisX.Maximum = xVal; // Maximum de l'axe des x est la dernière valeur de XVal
if (chart1.Series[0].Points.Count > 250) // Permet d'afficher que 5 secondes sur l'axe des x
{
chart1.Series[0].Points.RemoveAt(0);
}
chart1.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue;
}
private void timer2_Tick(object sender, EventArgs e)
{
string r = ""; //défini r comme un string vide
double x = 0; //défini x comme un double vide
double value = 0; //Défini vélue comme un double vide
if (Lect_mes.Checked) //Si Lect_mes est cochée
{
Port1.Write("4"); //on écrit 4 sur le port1
}
r = Port1.ReadLine();
try
{
x = Convert.ToDouble(r); //converti un Char en Double
value = Math.Round((x / 1023 * 5 * 2 * 196.2), 2); //On calcul la pression
//1024 = 0...1023 échantillons (valeur renvoyée par le port1)
//5 car on est sur la plage 0...5V
//196.2 convertion Kg en Newton
//2, on arrondis à 2 décimales
}
catch
{
value = 0;
}
textBox1.Text = value.ToString() +' ' + 'N'; // Rajoute N après la mesure dans la TextBox
}
public void Lect_mes_CheckedChanged(object sender, EventArgs e) //Evenement quand Lect_mes change d'état
{
if (Lect_mes.Checked) //Si Lect-mes est coché on écrit 4 sur le Port1
{ //et on actionne les Timers
Port1.Write("4");
timer1.Enabled = true;
timer2.Enabled = true;
}
else
{
timer1.Enabled = false; //Sinon on coupe les Timers
timer2.Enabled = false;
}
}
public void Del_ListBox_Click(object sender, EventArgs e)
{
listBox1.Items.Clear(); //Clear la ListBox
chart1.Series[0].Points.Clear(); //Clear le Graph
textBox1.Clear(); //Clear la TextBox
}
private void toExcel_Click(object sender, EventArgs e)
{
Excel.Application oXL; //Définition d'une nouvelle application Excel
Excel.Workbook oWB; //Définition d'un classeur
Excel.Worksheet oSheet; //Définition d'une feuille
object misValue = System.Reflection.Missing.Value;
// initialisation feuille excel
try
{
oXL = new Excel.Application(); //myExcelApp est créee par Excel.Application
oXL.Visible = true; //Ouvre Excel automatiquement après l'export
FileInfo fi = new FileInfo(ApplicationForm.ExecutablePath);
oWB = (Excel.Workbook)(oXL.Workbooks.Open(Path.Combine(fi.DirectoryName, "Acquisition.xls"))); //Ouvre le fichier Acquisition.xls
oSheet = (Excel.Worksheet)oWB.ActiveSheet;
Excel.Range oRange = (Excel.Range)oSheet.get_Range("A3", "B30000"); //Ecrit les données de la cellule A3 a B30000
oRange.Clear();
//écriture dans feuille excel
for (int i = 0; i < Math.Min(listBox1.Items.Count - 1, 27997); i++)
{
oXL.Cells[i + 3, 2] = listBox1.Items[i].ToString(); //On inscrit toutes les valeurs de la ListBox les une en dessous des autres à partir de B3
if (i == 0)
{
oXL.Cells[3, 1] = 0; //Permet d'écrire le temps dans A3
}
else
{
oXL.Cells[i + 3, 1] = i * 0.02; //Permet d'écrire le temps dans A4 jusque autant de mesure par pas de 0,02 (50hz)
}
}
}
catch
{
MessageBox.Show("L'exportation n'a pas été effectuée"); //Si exportation Excel plante, message d'erreur
}
}
}
}
NB : y a deux timer dans le code car j'ai une acquisition à 50hz dans une listbox et une a 10hz dans une textbox
Voila, ceci fonctionne très bien pour lire l'entrée analogique A1