Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

7503_Degilevich_Isakov

.pdf
Скачиваний:
1
Добавлен:
04.09.2023
Размер:
625.78 Кб
Скачать

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

Кафедра БТС

ОТЧЕТ по индивидуальному домашнему заданию

по дисциплине «Измерительные медицинские терминалы» ТЕМА: Интерфейс для передачи данных с датчика температуры

Студент гр. 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