Leírás


A projectben azt vizsgáltam, hogy a szenzor által mért értékeket hogyan tudom egy Arduino-tól független asztali appban feldolgozni. A szükséges anyagok:



Áramkőr összeállítás


A szenzor VCC-re 3.3V-ot, a GND-re 0V-ot kell kötni. A mért adatok a DQ PIN-en érhetőek el, amit az alaplap valamelyik GPIO PIN-jére kell csatlakoztatni, én a 2. PIN-t használtam.


Kódok

                            
#include 
#include 

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);	

DallasTemperature sensors(&oneWire);

void setup(void)
{
  sensors.begin();	// Start up the library
  Serial.begin(9600);
}

void loop(void)
{ 
  // Send the command to get temperatures
  sensors.requestTemperatures(); 

  //print the temperature in Celsius
  Serial.println(sensors.getTempCByIndex(0));
  
  delay(500);
}
                            
                        

                            
using System.IO;
using System.IO.Ports;
using System.Text;
using System.Windows;

namespace IndoorThermometer.Classes
{
    public class ThermoMeter
    {
        private SerialPort _serialPort;
        static StringBuilder _buffer = new StringBuilder();
        public double temperature { get; set; }

        public ThermoMeter(string portName, int speed)
        {
            _serialPort = new SerialPort(portName, speed);
            _serialPort.DataReceived += SerialPort_DataReceived;
            _serialPort.Open();
        }

        public void ClosePort() { _serialPort.Close(); }

        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int count = 0;
            try
            {
                SerialPort sp = (SerialPort)sender;
                string data = sp.ReadExisting(); 
                _buffer.Append(data);

                // Soronként dolgozzuk fel
                string content = _buffer.ToString();
                int index;
                while ((index = content.IndexOf('\n')) >= 0)
                {
                    string line = content.Substring(0, index).Trim();
                    if (!string.IsNullOrEmpty(line))
                    {
                         if (double.TryParse(line, 
                            System.Globalization.NumberStyles.Any, 
                            System.Globalization.CultureInfo.InvariantCulture, 
                            out double tempValue))
                        {
                            temperature = tempValue;
                            count++;
                        }

                    }
                    
                    content = content.Substring(index + 1);

                }
                
                _buffer.Clear();
                if (content.Length > 500) { content = content.Substring(0, 500); }
                _buffer.Append(content);
            }
            catch (IOException ioEx)
            {
                MessageBox.Show(ioEx.Message, "I/O Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            catch (InvalidOperationException invEx)
            {
                MessageBox.Show(invEx.Message, "Port is not available!", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}
                            
                        

Magyarázat


Soros porton érkező hőmérséklet-adatok feldolgozása

A bemutatott kódrészlet egy soros porton érkező adatok valós idejű feldolgozását valósítja meg. Tipikusan ilyen megoldást alkalmazunk például mikrovezérlőkkel (pl. Arduino) kommunikáló asztali alkalmazásokban, ahol az eszköz folyamatosan küld mérési adatokat.

Eseményalapú működés

A SerialPort_DataReceived metódus akkor fut le, amikor a soros porton új adat érkezik. Az eseménykezelő automatikusan meghívódik, így az alkalmazás folyamatosan, megszakítás nélkül képes feldolgozni a bejövő adatfolyamot.

Adatok beolvasása és pufferelése

A soros porton érkező adatok nem feltétlenül teljes sorokban érkeznek meg, ezért a kód egy belső pufferben (_buffer) gyűjti őket:

Soronkénti feldolgozás

A feldolgozás sorhatároló (\n) alapján történik: Ez a megközelítés lehetővé teszi, hogy az adatküldő eszköz soronként küldje a mért értékeket.

Numerikus érték értelmezése

Minden feldolgozott sor esetén a program megpróbálja: Sikeres konverzió esetén: Ez különösen fontos nemzetközi környezetben vagy különböző lokalizációjú rendszerek esetén.

Puffer karbantartása

A feldolgozott sorok eltávolítása után:

Hibakezelés

A kód két gyakori hibát kezel le: Mindkét esetben felhasználóbarát hibaüzenet jelenik meg.

Összegzés

Ez a megoldás: Ideális választás valós idejű szenzoradatok (például hőmérséklet) feldolgozására soros porton keresztül.


C# Project letöltés


Letöltés

Teszt video