32
1

Scanu SPEA

  • Upload
    vanbao

  • View
    227

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Scanu SPEA

1

Page 2: Scanu SPEA

2

Page 3: Scanu SPEA

3

Obbiettivo e situazione di partenza Pag. 4

Schema a blocchi Pag. 5

Schema elettrico Pag. 6

Circuito stampato (fronte, retro e modello 3D) Pag. 7

Schema elettrico Arduino UNO Pag. 8

Codice del programma Pag. 9

Codice dell’interfaccia principale Pag.9

Codice del form con il grafico Pag.16

Codice form seleziona porta seriale Pag.19

Schermata dei collaudi su Excel Pag. 21

Elenco componenti Pag. 22

Progettazione schemi elettrici e circuiti Stampati Pag. 23

Progettazione software Pag. 24

Immagini montaggio hardware e sviluppo software Pag. 25

Dettagli Hardware Pag. 26

Codice di Arduino Pag.27

Dettagli del software Pag. 30

Conclusioni Pag. 32

Page 4: Scanu SPEA

4

Obiettivi e situazione di

partenza

Durante quest’anno scolastico l’azienda di Volpiano SPEA ha indetto un progetto dove potevano aderire gli

studenti di classi quinte di indirizzi elettronica, informatica e meccanica.

Io ho deciso di aderire al progetto ma facendo sia una parte di elettronica e una parte di informatica.

La parte elettronica in sintesi

La parte elettronica prevede la misura della temperatura con un sensore LM35 e al superamento dei 75

gradi il circuito deve far scattare un relè o un interruttore per togliere l’alimentazione al dispositivo e

metterlo così in condizioni di sicurezza, inoltre il dispositivo deve misurare il valore di resistenze,

condensatori e regolatori di tensione, e con un sensore identificare il colore dei diodi led. Tutti i valori

devono essere inviati tramite una porta seriale RS232. Il tutto è fatto per collaudare degli alimentatori.

La parte informatica in sintesi

La parte informatica prevede lo sviluppo di un software che acquisisce, tramite seriale RS232, i valori

misurati con il dispositivo hardware. I valori devono essere salvati su un database, e deve essere possibile

recuperarli cercandoli per data di salvataggio e poterli visualizzare su un documento di Excel o Access.

Siccome ho deciso di unire i due progetti ho dovuto trovare un modo per fare una parte di elettronica e

una parte di informatica.

Per la parte elettronica ho deciso di sviluppare un hardware in grado di misurare la temperatura e di

inviarla ad un microprocessore, da quest’ultimo il dato viene inviato alla seriale RS232 e se la temperatura

supera i 75 gradi fa scattare un relè. Il relè è collegato ad un diodo led verde che viene spento al

superamento dei 75 gradi.

Per la parte informatica ho deciso di sviluppare un software in grado di leggere e visualizzare la

temperatura acquisita sulla porta seriale, con la possibilità di salvarla in una tabella dentro un database,

nella tabella insieme alla temperatura viene salvato anche l’ID della scheda misurata, la data del collaudo e

il nome del operatore che ha effettuato il collaudo. I dati salvati possono essere visualizzati su un foglio

elettronico di Excel e con la possibilità di poter visualizzare la temperatura acquisita durante il giorno su un

grafico.

Page 5: Scanu SPEA

5

Schema a blocchi

Sensore LM35

Arduino Computer con

programma in C#

Relè e led verde di

emergenza

Database con le

misure

RS232

Alimentatore

5V

Led verde e giallo in

base alla

temperatura se è <

75°C

Page 6: Scanu SPEA

6

Schema elettrico

Page 7: Scanu SPEA

7

Circuito stampato

Circuito stampato parte retro, scala 1:1

Circuito stampato parte frontale, scala 1:1 (SENZA RELE)

Modello 3D del dispositivo

In allegato i datasheet dei componenti.

Page 8: Scanu SPEA

8

Schema elettrico di Arduino UNO

Page 9: Scanu SPEA

9

Codice del programma

Codice dell’interfaccia principale

Interfaccia principale del programma

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.IO.Ports; using System.IO; using Excel = Microsoft.Office.Interop.Excel; /* Creare un database SqlServer * 1) Nella finestra ESPLORA SERVER click destro su CONNESSIONE DATI * 2) Selezionare Crea nuovo database di Sql Server... * 3) Nell'omonima finestra di dialogo inserire: * Nome Server: NomeComputer\SqlExpress * Nome nuovo database: nome di database non ancora esistente * OK * Aggiungere una Connessione dati * 1) Nella finestra ESPLORA SERVER click destro su CONNESSIONE DATI * 2) Selezionare Aggiungi connessione...

Page 10: Scanu SPEA

10

* 3) Nell'omonima finestra di dialogo inserire: * Nome Server: NomeComputer\SqlExpress * Seleziona o immetti nome di database: cliccare sul menu a discesa * del comboBox e selezionare il nome di uno dei database proposti quindi * cliccare su OK * 4) Modificare il nome del database nella stringa di connessione (all'interno del * metodo Form1_Load() ) * * Creare ed aprire un file Excel in C# * 1) Menu Progetto | Aggiungi riferimento... * 2) Nella scheda .NET scorrere in basso, selezionare * Microsoft.Office.Interop.Excel quindi OK. * 3) Aggiungere using Excel = Microsoft.Office.Interop.Excel * Per cambiare il numero di fogli di lavoro iniziali in * Excel menu File | Opzioni scheda Generale impostare ad 1 * il numero di fogli da includere */ namespace Collaudo_schede_SPEA { public partial class Form1 : Form { bool start = false; double temperatura; SqlConnection cnSQLServer = new SqlConnection("Data Source= .\\SQLEXPRESS;Initial Catalog = schedeCollaudate; Integrated Security = true"); //SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); SqlCommand cmd = null; //cmd per i comandi da passare a sql int[] xval = { 0 }; // matrice contenente il numero di schede funzionanti e guaste double[] yval = { 0}; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { lblTemperatura.Text = "Dispositivo non connesso."; toolTipTemperatura.Active = true; btnChiudiSeriale.Enabled = false; } private void esciToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); //chiude il programma } private void impostazioniRS232ToolStripMenuItem_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) //verifica se la porta seriale è gia stata aperta MessageBox.Show("Attenzione seriale già in uso! Prima di aprire le impostazioni chiudere la porta.", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Information); else { ImpostaSeriale selezionaSeriale = new ImpostaSeriale(); selezionaSeriale.ShowDialog(this); //apre il form per selezionare la porta seriale if (selezionaSeriale.DialogResult == DialogResult.OK) { try { serialPort1.PortName = selezionaSeriale.CmbBxPorta.SelectedItem.ToString(); //prende il nome della seriale dal form

Page 11: Scanu SPEA

11

serialPort1.BaudRate = Convert.ToInt32(selezionaSeriale.CmbBxBaudeRate.SelectedItem); //prende il baudrate dal form della seriale serialPort1.Open(); //apro la porta seriale } catch (InvalidOperationException ex) { MessageBox.Show(ex.Message, "Attenzione!!!"); return; } catch (System.IO.IOException ex1) { MessageBox.Show(ex1.Message, "Attenzione!!!"); return; } } } } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { int leggidato = serialPort1.ReadByte(); //leggo il dato ricevuto da arduino temperatura = ((5.0 * leggidato) / 1024.0) * 100; //ricavo il valore effettivo della temperatura lblTemperatura.Text = string.Format("{0:F2}", temperatura) + " °C"; //mostro su una label il valore della temperatura DateTime data = DateTime.Now; if (start == true) try { string temp = string.Format("{0:F2}", temperatura); //converto in string il valore della temperatura temp = temp.Replace(',', '.'); //metto il punto al posto della virgola nella temperatura string codiceScheda = TxtBxCodiceScheda.Text; //prendo il codice della scheda dalla txtbox string nomeOperatore = TxtBxOperatore.Text; cnSQLServer.Open(); //mi connetto al server this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); //gli do il comando da c da eseguire in sql cmd.CommandText = "INSERT TestSchede ( CodiceScheda, Temperatura, DataTest, Operatore)" + "VALUES('" + codiceScheda + "','" + temp + "','" + data.ToShortDateString() + "','" + nomeOperatore + "')"; this.Text = cmd.ExecuteNonQuery().ToString(); cnSQLServer.Close();//chiudo il server btnChiudiSeriale.Enabled = true; start = false; } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } finally { cnSQLServer.Close(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; } } private void btnChiudiSeriale_Click(object sender, EventArgs e)

Page 12: Scanu SPEA

12

{ serialPort1.Close(); //chiudo la porta seriale btnChiudiSeriale.Enabled = false; lblTemperatura.Text = "Dispositivo non connesso."; } private void btnStartCollaudo_Click(object sender, EventArgs e) { string pathExe = Application.StartupPath; string LeggiVerifica = pathExe + "\\verificatabella.ska"; string temp = string.Format("{0:f2}", temperatura); StreamReader readVerifica = new StreamReader(LeggiVerifica); string ver = readVerifica.ReadLine();//leggo il valore del file readVerifica.Close(); if (ver == "1" && TxtBxOperatore.Text != "" && serialPort1.IsOpen == true && TxtBxCodiceScheda.Text != "") { //verifico se il valore letto nel file prima è = 1 start = true; DateTime data = DateTime.Now; DataGridViewRowCollection row = this.dataGridView1.Rows; row.Add(TxtBxCodiceScheda.Text, temp, data.ToString(), TxtBxOperatore.Text); } else//se il valore letto nel file è zero appare un messaggio di errore MessageBox.Show("Verifica di aver creato una tabella, di aver aperto la porta RS232, "+ "di aver inserito il nome Operatore e di aver inserito il codice della scheda.", "Attenzione!!", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void mnuCreaTab_Click(object sender, EventArgs e) { try { cnSQLServer.Open(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); //con questo comando sotto creo una tabella di nome TestSchede cmd.CommandText = "CREATE TABLE TestSchede(IDTest INT NOT NULL IDENTITY PRIMARY KEY," + "CodiceScheda CHAR(20),Temperatura CHAR(20),DataTest DATE,Operatore CHAR(20))"; cmd.ExecuteNonQuery(); cnSQLServer.Close(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; string pathExe = Application.StartupPath; string scriviTab = pathExe + "\\verificatabella.ska"; StreamWriter nuovaTab = new StreamWriter(scriviTab); nuovaTab.WriteLine("1"); //la prima volta che crea la tabella salva nel file verificatabella il valore 1 nuovaTab.Close(); } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } finally { cnSQLServer.Close(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; } }

Page 13: Scanu SPEA

13

private void mnuEliminaTab_Click(object sender, EventArgs e) { try { cnSQLServer.Open(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); //con questo comando cancella la tabella TestSchede cmd.CommandText = "DROP TABLE TestSchede"; cmd.ExecuteNonQuery(); cnSQLServer.Close(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; string pathExe = Application.StartupPath; string scriviTab = pathExe + "\\verificatabella.ska"; StreamWriter nuovaTab = new StreamWriter(scriviTab); nuovaTab.WriteLine("0"); //quando cancella la tabella TestSchede scrive nel file verificatabella il valore 0 nuovaTab.Close(); } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } finally { cnSQLServer.Close(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; } } private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) { int countRecord = 0; try { Excel._Worksheet workSheet; SqlDataReader reader = null; cnSQLServer.Open(); this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); cmd.CommandText = "SELECT * FROM TestSchede WHERE DataTest = @DataTest"; SqlParameter data = new SqlParameter("@DataTest", SqlDbType.Date); data.Value = e.Start; //prende il valore della data dall'oggetto e cmd.Parameters.Add(data);//salvo la data nel parametro @DataTest reader = cmd.ExecuteReader(); Excel.Application exceApp = new Excel.Application(); //apre excel exceApp.Workbooks.Add(); //salva i valori della tabella nel server su excel workSheet = exceApp.ActiveSheet; exceApp.Range["A1"].Value = "IDTest"; exceApp.Range["B1"].Value = "Codice Scheda"; exceApp.Range["C1"].Value = "Temperatura"; exceApp.Range["D1"].Value = "Data del test"; exceApp.Range["E1"].Value = "Operatore"; for (int i = 2; reader.Read(); i++) { workSheet.Cells[i, "A"] = reader["IDTest"]; workSheet.Cells[i, "B"] = reader["CodiceScheda"]; workSheet.Cells[i, "C"] = reader["Temperatura"]; workSheet.Cells[i, "D"] = reader["DataTest"];

Page 14: Scanu SPEA

14

workSheet.Cells[i, "E"] = reader["Operatore"]; countRecord++; } workSheet.Cells[1, "A"].Interior.Color = Color.Aquamarine; workSheet.Cells[1, "B"].Interior.Color = Color.YellowGreen; workSheet.Cells[1, "C"].Interior.Color = Color.Orange; workSheet.Cells[1, "D"].Interior.Color = Color.LightSeaGreen; workSheet.Cells[1, "E"].Interior.Color = Color.LightCoral; // chiude connessione al database cnSQLServer.Close(); // visualizza stato connessione, nome del database e nome istanza di SQL Server this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; // adatta al contenuto la larghezza delle colonne for (int i = 1; i <= 5; i++) exceApp.Columns[i].AutoFit(); // seleziona cella exceApp.ActiveCell.Offset[countRecord + 2, 0].Select(); // rende visibile Excel (invisibile --> false) exceApp.Visible = true; } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } } private void chiudiPortaRS232ToolStripMenuItem_Click(object sender, EventArgs e) { serialPort1.Close(); //chiudo la porta seriale btnChiudiSeriale.Enabled = false; lblTemperatura.Text = "Dispositivo non connesso."; } private void mnuCancellaRecords_Click(object sender, EventArgs e) { try { // apre connessione al database cnSQLServer.Open(); this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); // costruisce stringa contenente comando DELETE per eliminare tutti i records della tabella TestSchede cmd.CommandText = "DELETE TestSchede"; // chiama metodo ExecuteNonQuery() cmd.ExecuteNonQuery(); cnSQLServer.Close(); this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } finally { // chiude connessione al database cnSQLServer.Close(); this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource;

Page 15: Scanu SPEA

15

} } private void visualizzaGraficoDellaTemperaturaDiOggiToolStripMenuItem_Click(object sender, EventArgs e) { graficoTemperatura temp = new graficoTemperatura(); temp.Show(this); } private void eliminaUnRecordDallaTabellaToolStripMenuItem_Click(object sender, EventArgs e) { eliminaRecord frmRecords = new eliminaRecord(); frmRecords.ShowDialog(this); if (frmRecords.DialogResult == DialogResult.OK) try { // apre connessione al database cnSQLServer.Open(); // visualizza stato connessione, nome del database e nome istanza di SQL Server this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); // costruisce stringa contenente comando DELETE per eliminare tutti i records della tabella TestSchede cmd.CommandText = "DELETE TestSchede WHERE IDTest = @IDTest"; // creazione del parametro SqlParameter riga = new SqlParameter("@IDTest", SqlDbType.Int); // Imposta valore parametro SQL, cioè numero record da eliminare riga.Value = Convert.ToInt32(frmRecords.txtID.Text); // aggiunge al comando SQL precedente il parametro SQL contenente la data selezionata cmd.Parameters.Add(riga); // chiama metodo ExecuteNonQuery() cmd.ExecuteNonQuery(); // chiude connessione al database cnSQLServer.Close(); // visualizza stato connessione, nome del database e nome istanza di SQL Server this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } finally { // chiude connessione al database cnSQLServer.Close(); // visualizza stato connessione, nome del database e nome istanza di SQL Server this.Text = cnSQLServer.State.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; } } } }

Page 16: Scanu SPEA

16

Codice del form con il grafico

Interfaccia di visualizzazione del grafico

/* Controllo Chart * 1)Proprietà Dock di chart1 = Fill * 2)Rinominare Series1 come Tensione: * chart1 | Series | Editor insieme Series | Dati | Name * 3)Scelta tipo di grafico: * chart1 | Series | Editor insieme Series | Grafico | ChartType = Line * 4)Modifica colore sfondo area attorno a grafico: * chart1 | BackColor * 5)Modifica colore sfondo grafico: * chart1 | chartAreas | Editor insieme chartArea | Aspetto | BackColor * 6)Aggiunta titoloa grafico: * chart1 | Titles | Editor insieme Title--> click su pulsante AGGIUNGI * Nelle proprietà di Title1 Aspetto | Text --> digitare il titolo desiderato * 7)Modifica aspetto Legenda: * chart1 | Legends | Editor insieme Legend | Aspetto | Font, BackColor, ForeColor, * BorderColor,BorderWidth * 8)Visualizzazione dei valori di tensione in Etichette: * chart1 | Series | Editor insieme Series | Etichetta | IsValueShownAsLabel = true * 9)Modifica aspetto Etichette: * chart1 | Series | Editor insieme Series | Aspetto Etichetta | Font, LabelBackColor, * LabelForeColor, LabelBorderColor,LabelBorderWidth * 10)Visualizzazione degli Indicatori (marker): * chart1 | Series | Editor insieme Series | Indicatore | MarkerStyle | None, Circle, * Square, Triangle, etc. * 11)Modifica aspetto Indicatori (marker): * chart1 | Series | Editor insieme Series | Indicatore | MarkerColor, MarkerSize, * MarkerBorderColor, MarkerBorderWidth * 12)Modifica aspetto linee grafico: * chart1 | Series | Editor insieme Series --> selezionare serie desiderata, quidi * Aspetto | Color, BorderWidth, BorderColor (colore bordo indicatori) * 13)Inserire titoli per gli assi X e Y:

Page 17: Scanu SPEA

17

* chart1 | chartAreas | Editor insieme chartArea | Assi | Axes | Editor insieme Axis * --> selezionare un asse, quindi Titolo | Title, TitleFont, TitleForeColor, * TitleAlignment, TextOrientation * 14)Fissare origine assi in X=0: * chart1 | chartAreas | Editor insieme chartArea | Assi | Axes | Editor insieme Axis * --> selezionare un asse, quindi Scala | IsMarginVisible = false * 15)Modifica aspetto assi X e Y: * chart1 | chartAreas | Editor insieme chartArea | Assi | Axes | Editor insieme Axis * --> selezionare un asse, quindi Aspetto | LineColor, LineWidth, ArrowStyle * 16)Inserimento cursore asse X: * chart1 | chartAreas | Editor insieme chartArea | Cursore | CursorX | IsUserEnabled = true, * IsUserSelectionEnabled = true * Sono disponibili anche le proprietà LineColor e Interval (fissa l'entità dello spostamento * del cursore, ad es. 0,1) * 17)Adattare intervallo valori asse X al numero di valori a disposizione * chart1 | chartAreas | Editor insieme chartArea | Assi | Axes | Editor insieme Axis * --> selezione asse X, quindi Intervallo | IntervalAutoMode = VariableCount * 18)Abilitare/Disabilitare segni graduazione griglia secondaria: * chart1 | chartAreas | Editor insieme chartArea | Assi | Axes | Editor insieme Axis * --> selezione asse X, quindi Segni di graduazione griglia | minorGrid | Enabled = true * oppure false * Sono disponibili anche le proprietà LineColor e LineWidth * */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.IO; namespace Collaudo_schede_SPEA { public partial class graficoTemperatura : Form { SqlConnection cnSQLServer = new SqlConnection("Data Source= .\\SQLEXPRESS;Initial Catalog = schedeCollaudate; Integrated Security = true"); SqlCommand cmd = null; public graficoTemperatura() { InitializeComponent(); } private void graficoTemperatura_Load(object sender, EventArgs e) { int countRecord = 0; try { cnSQLServer.Open(); SqlDataReader reader = null; this.Text = cnSQLServer.ToString() + " " + cnSQLServer.Database + " " + cnSQLServer.DataSource; cmd = cnSQLServer.CreateCommand(); cmd.CommandText = "SELECT * FROM TestSchede WHERE DataTest = @DataTest"; SqlParameter data = new SqlParameter("@DataTest", SqlDbType.Date); data.Value = DateTime.Now; cmd.Parameters.Add(data); reader = cmd.ExecuteReader();

Page 18: Scanu SPEA

18

for (int i = 2; reader.Read(); i++) { chart1.Series["Temperatura"].Points.AddXY(reader["IDTest"], reader["Temperatura"]); countRecord++; } cnSQLServer.Close(); this.Text = DateTime.Now.ToString(); } catch (SqlException ecc) { MessageBox.Show(ecc.Message, "Attenzione!!"); } } private void chart1_DoubleClick(object sender, EventArgs e) { if (chart1.ChartAreas["ChartArea1"].Area3DStyle.Enable3D == true) chart1.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = false; else chart1.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true; } } }

Page 19: Scanu SPEA

19

Codice form seleziona porta seriale

Interfaccia di selezione della porta seriale, e della velocità di baudRate

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace Collaudo_schede_SPEA { public partial class ImpostaSeriale : Form { public ImpostaSeriale() { InitializeComponent(); } public void BtnOk_Click(object sender, EventArgs e) { if (CmbBxBaudeRate.SelectedIndex != 9) { if (MessageBox.Show("Attenzione! Il baudRate del dispositivo di default è 57600, cambiandolo si potrebbero avere dei dati non attendibili. Impostare baudRate a 57600 Si o No?", "Attenzione!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) CmbBxBaudeRate.SelectedIndex = 9; } } public void ImpostaSeriale_Load(object sender, EventArgs e) { ControlBox = false; //carica i valori del baudrate nel combobox CmbBxBaudeRate.Items.Add(300); CmbBxBaudeRate.Items.Add(1200); CmbBxBaudeRate.Items.Add(2400); CmbBxBaudeRate.Items.Add(4800); CmbBxBaudeRate.Items.Add(9600); CmbBxBaudeRate.Items.Add(14400); CmbBxBaudeRate.Items.Add(19200); CmbBxBaudeRate.Items.Add(28800); CmbBxBaudeRate.Items.Add(38400); CmbBxBaudeRate.Items.Add(57600); CmbBxBaudeRate.Items.Add(115200); //indice dell'elemento da selezionare CmbBxBaudeRate.SelectedIndex = 9;

Page 20: Scanu SPEA

20

//seleziona l'elemento con l'indice fissato CmbBxBaudeRate.SelectedItem = CmbBxBaudeRate.SelectedIndex; //salva l'elenco delle porte in una matrice string[] porteCom = SerialPort.GetPortNames(); //visualizza elementi della matrice nel combobox foreach (string portaRS232 in porteCom) CmbBxPorta.Items.Add(portaRS232); //verifica presenza nel pc di almeno una porta COM if (CmbBxPorta.Items.Count != 0) { //imposta ultimo indice come quello dell'elemento selezionato di default CmbBxPorta.SelectedIndex = CmbBxPorta.Items.Count - 1; //seleziona elemento con indice fissato CmbBxPorta.SelectedItem = CmbBxPorta.SelectedIndex; } else { //avviso assenza di porte COM MessageBox.Show("Nessuna porta COM rilevata", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close();//chiude form 2 } } } }

Page 21: Scanu SPEA

21

Schermata dei collaudi su Excel

Visualizzazione dei dati su Excel

Page 22: Scanu SPEA

22

Elenco componenti

Componenti Costi su rs-component Costi su

componenti.elettronici.com

2 resistenze da 680 OHM 0,006€ (1 pz in confezione da

5000)

0,14€

1 resistenza da 1,5 KOHM 0,006€ (1 pz in confezione da

5000)

0,07€

1 resistenza da 12 KOHM 0,006€ (1 pz in confezione da

5000)

0,07€

1 connettore da 3 pin 0,146€ (1 pz in confezione da 10) 0,34€

1 connettore da 8 pin 0,233€ (1 pz in confezione da 10) 0,34€

1 scheda Arduino UNO 26,11€ /

1 sensore LM35 4,41€ 1,45€

4 diodi led (1 rosso, 1 giallo e 2

verde)

0,178€ (1 pz in confezione da 25) (0,36€, 0,13€, 0,44€)

1 transistor npn BC337 0,22€ 0,07€

1 integrato LM358N 0,306€ (1 pz in confezione da 25) 0,32€

1 relè 6V DC 6,20€ 4,14€

Guaina termo restringente 3,04€ 1,57€

1 diodo 1N4007 0,023€ (1 pz in confezione da

500)

0,08€

Page 23: Scanu SPEA

23

Progettazione schemi elettrici e

circuiti

Stampati

Per creare lo schema elettrico del

dispositivo e per la progettazione del

circuito stampato ho utilizzato il

programma KiCad, è un programma open

source di software Electronic Design

Automation (EDA) per il disegno di schemi

elettrici e circuiti stampati.

Come programma l’ho trovato semplice da

usare, ed è molto affidabile, per essere

gratuito come qualità si avvicina a molti

programmi che sono attualmente in

commercio.

All’interno del programma possiamo trovare diversi programmi.

Il primo è Eeschema questo serve per la creazione dello schema elettrico, ci sono molti componenti a

disposizione dell’utente, e nel caso che non troviamo un componente che ci serve su internet si possono

trovare delle librerie con molti altri componenti, oppure si possono creare direttamente componenti

all’interno del programma.

Un altro programma importante al suo interno è Pcbnew, questo serve per la creazione del circuito

stampato, e anche qui c’è la possibilità di aggiungere componenti mancanti con delle librerie.

Con Kicad c’è anche la possibilità di passare da schema elettrico direttamente al circuito stampato grazie a

vari tools all’interno del programma.

Page 24: Scanu SPEA

24

Progettazione software

Per lo sviluppo del software ho

utilizzato il programma Visual

Studio 2010 della Microsoft,

all’interno del programma si ha la

possibilità di usare diversi

programmi con diversi linguaggi di

programmazione. Il linguaggio che

ho usato io è C# molto comodo e

facile da usare. Preciso che ho

utilizzato la versione ultimate del

programma perché con questa

versione si ha la possibilità di avere

anche SQLserver mente nella

versione Express si hanno

parecchie limitazioni, inoltre per la

visualizzazione esterna dei dati salvati nel database bisogna avere installato una versione di Microsoft

Office per usare il pacchetto di Excel.

Page 25: Scanu SPEA

25

Immagini montaggio hardware

e sviluppo software

Dispositivo montato su breadboard

Parte del codice software

Page 26: Scanu SPEA

26

Dettagli Hardware Il dispositivo hardware è abbastanza semplice, come sensore per misurare la temperatura ho usato un

LM35 che come si può vedere nel suo datasheet è molto sensibile ( varia di 10mV/°C), all’uscita della Vout

del sensore ho messo un inseguitore usando un amplificatore operazionale un LM358N. Come

microcontrollore ho deciso di usare una scheda Arduino UNO.

Quindi la tensione all’uscita dall’inseguitore va ad un pin analogico di Arduino (nel mio caso l’ho messo al

pin 5), non ho dovuto inserire un convertitore AC/DC perché su Arduino ce n’è installato già uno. All’interno

del microcontrollore la tensione viene inviata tramite RS232, ( anche questo sulla scheda di Arduino è già

installato), e il microcontrollore verifica se la tensione supera i 75°C. Ma prima di verificare bisogna fare dei

banali calcoli, siccome in ingresso la tensione è stata convertita da analogica a digitale, in entrata si avrà un

valore compreso tra 0 e 1024.

Per ricavare la temperatura effettiva quindi bisogna usare una formuletta:

� =�� ∗ �

2�

Dove � è la nostra incognita (quindi sarà la nostra temperatura effettiva), �� è la tensione di Arduino quindi

5V, � è il nostro dato arrivato dall’AC/DC e infine è il numero di bit massimo in Arduino cioè 10 quindi al

denominatore avremo 1024.

Supponiamo che il nostro � vale 15, facendo tutti i calcoli avremo 0,0732, ora per avere il valore effettivo lo

moltiplichiamo per 100 (perché il sensore lavora nell’ordine dei mV), quindi avremo la nostra temperatura

di 7,32°C.

Ora che sappiamo la temperatura effettiva possiamo verificare se è minore o maggiore di 75°C. Possiamo

notare che nel circuito ci sono 4 led, tre servono per indicare la temperatura il verde si accende se la

temperatura è inferiore a 30°C, se invece la temperatura è compresa tra 30 e 50 rimangono accesi i led

verde e giallo, se la temperatura è compresa tra 50 e 75 rimane acceso solo il giallo ed infine se supera i 75

si accende il led rosso, ma oltre ad accendersi questo led Arduino fa scattare il relè e quindi fa spegnere il

quarto led che è attaccato al relè ( ovvero apre il circuito e toglie tensione per proteggerlo dall’alta

temperatura).

Ai capi della bobina del relè possiamo trovare un diodo rettificatore di protezione per evitare che danneggi

Arduino, e possiamo trovare un transistor il BC337, questo transistor serve per amplificare la corrente al

relè altrimenti la bobina non si eccita e quindi non farebbe aprire il circuito. Il circuito viene aperto nello

stesso momento in cui si accende il led rosso.

Come velocità di baudRate ho impostato 57600 è un valore scelto a caso perché funziona anche con 9600

(il minino) e 115200 (il massimo).

Nella pagina seguente si può osservare il programma caricato sul microcontrollore, da notare che il metodo

accensione serve solamente come “abbellimento” del circuito creando un effetto luminoso con i led.

Page 27: Scanu SPEA

27

Codice di Arduino const int piedinoTemperatura=5; //Piedino del sensore di temperatura LM35

const int pinGreen = 11; //piedino usato per il led verde

const int pinYellow = 12; //piedino usato per il led giallo

const int pinRed = 13; //piedino usato per il led rosso

float tempEffettiva;

int a;

int verifica = 0;

void setup(){

pinMode(pinGreen,OUTPUT); //imposto il pin 3 in OUTPUT

pinMode(pinYellow,OUTPUT); //imposto il pin 5 in OUTPUT

pinMode(pinRed,OUTPUT); //imposto il pin 6 in OUTPUT

Serial.begin(57600); //imposto la velocità della trasmissione tramite seriale

}

void loop(){

if(verifica == 0) { //esegue questo if solo quando si accende

for(a = 0; a <= 20; a++)

accensione();

verifica = 1;

}

//acquisisco la temperatura dal sensore

unsigned int temperatura = analogRead(piedinoTemperatura);

delay(20);

//ricavo la temperatura effettiva

tempEffettiva = (5.0 * temperatura * 100) / 1024;

//invio al pc tramite seriale la temperatura

Serial.write(temperatura);

//accendo il led verde se la temperatura e < 30

Page 28: Scanu SPEA

28

if(tempEffettiva <= 30) {

digitalWrite(pinGreen,HIGH);

digitalWrite(pinYellow,LOW);

digitalWrite(pinRed,LOW);

}

//accendo il led verde e giallo se la temperatura e > 30 e < 50

else if(tempEffettiva > 30 && tempEffettiva <= 50) {

digitalWrite(pinGreen,HIGH);

digitalWrite(pinYellow,HIGH);

digitalWrite(pinRed,LOW);

}

//accendo il led giallo se la temperatura e > 50 e <= 75

else if(tempEffettiva > 50 && tempEffettiva < 75) {

digitalWrite(pinGreen,LOW);

digitalWrite(pinYellow,HIGH);

digitalWrite(pinRed,LOW);

}

//accendo il led rosso se la temperatura e >= 75

else if(tempEffettiva >= 75) {

digitalWrite(pinGreen,LOW);

digitalWrite(pinYellow,LOW);

digitalWrite(pinRed,HIGH);

}

}

void accensione(){ //metodo usato quando si accende il dispositivo

digitalWrite(pinGreen,HIGH);

delay(80);

digitalWrite(pinGreen,LOW);

digitalWrite(pinYellow,HIGH);

delay(80);

Page 29: Scanu SPEA

29

digitalWrite(pinYellow,LOW);

digitalWrite(pinRed,HIGH);

delay(80);

digitalWrite(pinRed,LOW);

digitalWrite(pinYellow,HIGH);

delay(80);

digitalWrite(pinYellow,LOW);

}

Page 30: Scanu SPEA

30

Dettagli del software Ora analizzeremo più in dettaglio anche la parte del software.

All’apertura del programma ci troviamo davanti diverse impostazioni ma molto intuitive, come prima cosa

siccome la comunicazione tra hardware e software avviene tramite seriale RS232 dobbiamo aprire la porta

seriale, in alto ci sono tre diversi menù tra cui troviamo “impostazioni RS232” se clicchiamo sopra vedremo

due voci “Attiva Porta RS232” e “Disattiva Porta RS232” come

possiamo vedere nella Figura 1, una volta cliccato possiamo vedere

che si apre una piccola finestra con due combo box dove poter

scegliere la velocità di trasmissione e la porta seriale da utilizzare come

in figura 2.

Come possiamo notare si possono scegliere diverse velocità di

trasmissione ma di default ho messo 57600 perché

come avevo descritto prima nell’hardware avevo

preimpostato come velocità questo valore qui.

Una volta selezionata la porta seriale il programma

inizierà ad acquisire valore forniti da Arduino e questi

verranno visualizzati in una label. Per poter iniziare a

salvare le misure all’interno del database prima

dobbiamo creare una tabella al suo interno. Si può

notare che il terzo menù si chiama database come

mostrato in Figura 3, se ci clicchiamo sopra verranno

mostrate 4 opzioni, con la prima opzione andiamo a

creare una tabella all’interno del database così ora

possiamo salvare i test al suo interno, poi si può un

opzione che elimina la tabella dal server, oppure si

possono eliminare tutti i dati dalla tabella ma senza

eliminarla definitivamente, ed infine si può eliminare

anche una sola riga della tabella, necessario se si ha

sbagliato a fare una misura.

Ora prima di iniziare a salvare le misure bisogna compilare lo spazio vuoto sotto “inserire il nome

operatore”, e sotto ancora bisogna inserire il codice della scheda da testare. Una volta inseriti tutti i dati si

può cliccare su start e iniziare a salvare i collaudi all’interno del database. Le misure effettuate potranno

essere anche visualizzate nella tabella che c’è nell’applicazione come quella in figura 4.

Una volta finiti i test si può

cliccare sul tasto “Chiudi

porta seriale” per disattivare

Figura 1

Figura 2

Figura 3

Figura 4

Page 31: Scanu SPEA

31

la porta seriale e quindi interrompere la trasmissione dei dati. Per poter visualizzare i risultati dei collaudi

all’interno di un documento Excel bisogna semplicemente cliccare su un giorno del calendario che c’è

nell’applicazione e verranno visualizzati tutti i test svolti nel giorno selezionato, su un foglio Excel. Per

esempio se si clicca sul 19 aprile 2013 verranno

visualizzati su Excel tutti i test effettuati tale giorno.

Infine se si apre il primo menù “File” si possono

trovare altre due voci, “Esci” che ovviamente fa

uscire dal programma e poi “Visualizza grafico della

temperatura di oggi” come mostrato in figura 5, una

volta aperta questa opzione verrà visualizzato un

grafico con tutte le temperature riportate di quel giorno, se si fa doppio click sul grafico si potrà vederlo in

modalità 3D come nella figura 6.

Figura 6

Come si può vedere nel grafico nell’asse delle ordinate possiamo trovare la temperatura che arriva fino ad

un massimo di 75°C, invece nell’asse delle ascisse troviamo l’IDSchede ovvero le schede testate in giornata

dalla prima all’ultima, di conseguenza la temperatura è come se fosse in funzione del tempo.

Figura 5

Page 32: Scanu SPEA

32

Conclusioni Il progetto alla fine è stato portato a termine, soddisfacendo gli obbiettivi che mi ero prefissato, cioè creare

un progetto con parti hardware e parti software, per quanto riguarda l’hardware non ho avuto molti

problemi nella realizzazione, grazie anche ad Arduino che è piuttosto semplice da usare e programmare,

per quanto riguarda la parte software non è stata una passeggiata siccome parecchie cose non erano nel

programma scolastico come l’utilizzo e la gestione dei database, ma grazie all’aiuto dei professori e alle

informazioni ricavate su internet sono riuscito a concludere anche la parte del software con risultati

secondo me ottimi!