7503_Degilevich_Isakov
.pdfМИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра БТС
ОТЧЕТ по индивидуальному домашнему заданию
по дисциплине «Измерительные медицинские терминалы» ТЕМА: Интерфейс для передачи данных с датчика температуры
Студент гр. 7503 |
|
Дегилевич А.А. |
|
Студент гр. 7503 |
|
Исаков А.О. |
|
|
|||
Преподаватель |
|
Болсунов К.Н. |
|
|
|||
|
|
|
|
Санкт-Петербург
2022
ОПИСАНИЕ РАБОТЫ
В рамках работы был разработан программно-аппаратный комплекс для считывания и передачи данных температуры.
Температура считывается датчик температуры DS18B20,
подключенным к плате Arduino UNO по схеме, представленной на рисунке 1.
Рисунок 1 – Схема подключения датчика
Данная плата прошита программой разработанной в системе
Arduino IDE представленной ниже:
#include <OneWire.h>
OneWire ds(2);
char target[] = "GetTemperature";
int temperature = 0;
long lastUpdateTime = 0;
const int TEMP_UPDATE_TIME = 1000;
void setup(){ Serial.begin(9600);
2
}
void loop(){
if (Serial.available() > 0) {
if (Serial.find(target)){ detectTemperature();
String myString = String(temperature); Serial.println("Temp"+myString);
}
}
}
int detectTemperature(){
byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44);
if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)
{
lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE);
data[0] = ds.read(); data[1] = ds.read();
temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4;
}
}
Плата подключается к ПК через провод Micro USB и эмулирует виртуальный COM порт. Для управления разработанным интерфейсом была разработана программа на языке C#, представленная на рисунке 2.
Рисунок 2 – Интерфейс разработанной программы
3
При включении компьютера программа автоматически выполняет поиск COM порта, к которому подключена плата, в случае нахождения выполняет автоматическое сопряжение.
Если COM порт был выбран не верно, или пользователь хочет в ручную выбрать нужный порт, предусмотрена возможность ручного выбора
COM-портов системы. Для обновления списка при подключении новых устройств используется соответственная кнопка.
При успешном подключении к плате активируется кнопка,
посылающая сигнал на плату, заставляющая ее зарегистрировать текущее значение температуры. Это значение передается по COM порту и отображается на экране.
Код программы представлен ниже:
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Diagnostics; using System.Drawing; using System.IO.Ports; using System.Linq;
using System.Text; using System.Threading;
using System.Threading.Tasks; using System.Windows.Forms; using System.Management;
namespace TempDetect
{
public partial class Form1 : Form
{
bool portOpened = false; bool autoPort = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.BaudRate = 9600; serialPort1.Parity = Parity.None; serialPort1.StopBits = StopBits.One; serialPort1.DataBits = 8; serialPort1.Handshake = Handshake.None; serialPort1.RtsEnable = true;
4
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
string[] ports = SerialPort.GetPortNames(); btnRecieve.Enabled = false;
if (ports.Length != 0)
{
cboPort.Items.AddRange(ports); cboPort.SelectedIndex = 0; AutoDetect(ports);
}
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (cboPort.Text != "")
{
if (portOpened)
{
btnOpen.Text = "Open"; btnRecieve.Enabled = false; btnRefresh.Enabled = true; cboPort.Enabled = true; portOpened = false;
try
{
serialPort1.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
btnOpen.Text = "Close"; txtRecieve.Text = null; btnRecieve.Enabled = true; btnRefresh.Enabled = false; cboPort.Enabled = false; portOpened = true;
try
{
serialPort1.PortName = cboPort.Text; serialPort1.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
5
private void btnRecieve_Click(object sender, EventArgs e)
{
try
{
if (serialPort1.IsOpen)
{
serialPort1.WriteLine("GetTemperature");
Thread.Sleep(100); txtRecieve.Text = "No signal";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen) serialPort1.Close();
}
private void DataReceivedHandler( object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender; string indata = sp.ReadLine();
if (indata.Contains("Temp")) autoPort = true;
indata = indata.Remove(0, 4);
this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] {
indata });
}
private delegate void SetTextDeleg(string text);
private void si_DataReceived(string data) { txtRecieve.Text = data.Trim(); }
private void btnRefresh_Click(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames(); cboPort.Items.Clear();
if (ports.Length != 0)
{
cboPort.Items.AddRange(ports); cboPort.SelectedIndex = 0; AutoDetect(ports);
}
}
private void AutoDetect(string[] ports)
{
autoPort = false; int i = 0;
6
foreach (string port in ports)
{
try
{
serialPort1.PortName = port; Console.WriteLine(port); serialPort1.Open(); serialPort1.WriteLine("GetTemperature"); Thread.Sleep(100);
if (autoPort)
{
cboPort.SelectedIndex = i; btnOpen.Text = "Close"; btnRecieve.Enabled = true; btnRefresh.Enabled = false; cboPort.Enabled = false; portOpened = true;
break;
}
else
{
serialPort1.Close();
i++;
}
}
catch
{
}
}
}
}
}
7