Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Сегодняшнее пятничное аппаратное сообщение посвящено работающему примеру использования Visual Basic в проекте с Nenduino.
Мониторинг температуры с помощью VB.Net, Microframework и Netduino
...
Это произошло в тот момент, когда я увидел небольшое устройство, называемое Netduino, которое работало под управлением чего-то, называемого .Net Microframework. Это было именно то, что я искал. Микроконтроллер, который можно соединить с готовыми электронными блоками, продающимися в магазине, и написать .NET код на языке, который я выбрал (VB) для реализации основной функциональности.
Так что следующим вопросом стало, чему бы посвятить первый классный проект?
Моя жена учится на сомелье, а это означает, что у нас в доме всегда есть несколько бутылок вина. Иногда мы открываем одну, и оказывается, что оно испортилось. Есть множество причин, почему вино может испортиться, и неправильное хранение лишь одна из них. Вино крайне темпераментно и лучше всего его хранить в прохладном темном месте с постоянными условиями, которые не меняются в зависимости от сезона, вот почему погреба или пещеры так подходят для хранения, но, к сожалению, в современных домах пещеры или винные погреба не предусмотрены. Поэтому мы используем кладовую для хранения вина.
Имея это в виду, я захотел узнать, действительно ли условия кладовой существенно меняются. Итак, я получил проект, но с чего начать? Простой прибор для контроля винного погреба (или кладовой!!!) и выдающий предупреждения при слишком высокой или низкой температуре
...
Приложение должно выполнять ряд задач
- Считывать информацию с датчиков
- Записывать данные на SD-карту
- Определять условия предупреждения по температуре
- Обеспечивать наглядную индикацию работы и выдачи предупреждений
- Обеспечивать возможность перезагрузки
Мой подход состоял в том, чтобы взять каждую задачу и создать изменяющуюся систему. Так что первым делом было подсоединить датчики и светодиоды. Использование макетной платы делает эту задачу действительно простой и сводящейся к созданию соединений с помощью проводов.
Конструкция следующая. Она выглядит слегка безумной в прототипе, но я приведу ее в порядок перед тем, как помещу в кладовую и получу обеспокоенную жену, которая придет рассказать мне о загадочном устройстве с проводами, появившемся в кладовке.
...
...
Чтение с датчиков
Код приложения – это простое консольное приложение, работающее в бесконечном цикле. Как только я подключу законченное устройство к 9-вольтовой батарее, я хочу, чтобы работа считалась завершенной, но также хочу быть уверен, что батареи хватит надолго. Поэтому я буду считывать данные каждые 10 мин, а это означает, что большую часть времени устройство спит.
Существуют аналоговые и цифровые температурные датчики. Мой датчик – простой термистор (резистор, чье сопротивление зависит от температуры). Используя аналоговые порты Netduino вместе с ним, можно измерять температуру. Существует две версии Netduino (Rev A и Rev B). Главным различием между ними является наличие опорного сигнала и необходимость дополнительного провода между выводом 3,3 В и выводом Aref0 – без него значения, прочитанные из аналогового порта будут неверными. К счастью, подавляющее большинство плат на рынке относятся к Rev B, в которой уже существует внутреннее соединение на плате, и об этом можно забыть.
Формула для вычисления температуры следующая…
Imports Microsoft.SPOT
Imports Microsoft.SPOT.Hardware
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino
Public Module Module1
Dim PollingDelay As Integer = 2
Dim tempSensor As New AnalogInput(Pins.GPIO_PIN_A5)
Dim CurrentTemperature As Double = 0
Public Sub Main()
Dim Temperature As Double = 0
'//Setup Event Handlers
PollingTemperatureMethod()
'//Get the initial temperature
CurrentTemperature = GetAverageTemperatureReading()
While True
Thread.Sleep(Timeout.Infinite)
End While
End Sub
Function GetCurrentTemperature() As Double
''Read the raw sensor value
Return tempSensor.Read()
End Function
'Get the average temperature of 101 readings over a second
Function GetAverageTemperatureReading() As Double
Dim totalTemp As Double
Dim averagetemp As Double = 0
For i = 0 To 99
totalTemp += GetCurrentTemperature()
Thread.Sleep(10)
Next
averagetemp = totalTemp / 100
Dim Kelvin As Double = (((averagetemp / 1023) * 3.3) * 100)
Dim Celsius As Double = (Kelvin - 273) - 17.8
Dim Fahrenheit = (Celsius) * (9 / 5) + 32
Debug.Print(WarningStatus.ToString & " " & averagetemp.ToString() & " " & Fahrenheit.ToString & " / " & Celsius.ToString & " ")
Return Celsius
End Function
Private PollingTimer As Timer
Private Sub PollingTemperatureMethod()
Dim PollingDelegate As New TimerCallback(AddressOf PollForTemperature)
PollingTimer = New Timer(PollingDelegate, Nothing, 1000, PollingDelay * 1000)
End Sub
Public Sub PollForTemperature(stateInfo As Object)
Module1.CurrentTemperature = GetAverageTemperatureReading()
End Sub
End Module
Определение условий генерации предупреждения
Мне бы хотелось, чтобы определялись условия возникновения предупреждений о слишком высокой и слишком низкой температуре, поскольку они обе могут вызывать проблемы при хранении вина. Во время разработки я хотел установить узкий интервал температур, который можно было бы легко переключать, но затем выбрал чтение этих параметров в приложение из файла на SD-карте, чтобы сделать процесс более гибким. Такое решение позволяет изменять настройки без необходимости перезагрузки приложения в контроллер. Задав эти максимальное и минимальное значения, я могу использовать их для определения того, выходят ли считанные датчиком значения из определенного диапазона, и если да, то включить один из светодиодных индикаторов, показывающих, что произошло событие выхода температуры за установленные пределы.
Dim HiWarningLED As New OutputPort(Pins.GPIO_PIN_D9, False)
Dim LowWarningLED As New OutputPort(Pins.GPIO_PIN_D11, False)
Public Enum LevelCheck
LowTemp
HiTemp
End Enum
Dim LowWarningStatus As Boolean = False
Dim WarningStatus As Boolean = False
Dim MinTemp As Single = 20
Dim MaxTemp As Single = 26
Function CheckTemperatureForWarning(Temp As Double, Optional Level As LevelCheck = LevelCheck.HiTemp) As Boolean
Dim WarnStateOccured As Boolean = False
If Level = LevelCheck.LowTemp Then
'Is Temperature Exceeding MaxTemp
If Temp <= MinTemp Then
Debug.Print("Low Warning Triggered")
Debug.Print("Temp: " & Temp.ToString)
Debug.Print("maxTemp: " & MaxTemp.ToString)
Debug.Print("minTemp: " & MinTemp.ToString)
WarnStateOccured = True
End If
ElseIf Level = LevelCheck.HiTemp Then
'Is Temperature Exceeding MaxTemp
If Temp >= MaxTemp Then
Debug.Print("Hi Warning Triggered")
Debug.Print("Temp: " & Temp.ToString)
Debug.Print("maxTemp: " & MaxTemp.ToString)
Debug.Print("minTemp: " & MinTemp.ToString)
WarnStateOccured = True
End If
End If
Return WarnStateOccured
End Function
Sub WarningStatusLight(State As Boolean, Optional Level As LevelCheck = LevelCheck.HiTemp)
'Code to turn on/off LED
If Level = LevelCheck.LowTemp Then LowWarningLED.Write(State)
If Level = LevelCheck.HiTemp Then HiWarningLED.Write(State)
End Sub
Public Sub PollForTemperature(stateInfo As Object)
Module1.CurrentTemperature = GetAverageTemperatureReading()
'If the warning status light is off and a warning temperature occurs then
'set Warning Light State to True and don't bother checking any more as the
'alarm condition has been met
If LowWarningStatus = False AndAlso CheckTemperatureForWarning(CurrentTemperature, LevelCheck.LowTemp) = True Then
LowWarningStatus = True
WarningStatusLight(LowWarningStatus, LevelCheck.LowTemp)
End If
If WarningStatus = False AndAlso CheckTemperatureForWarning(CurrentTemperature, LevelCheck.HiTemp) = True Then
WarningStatus = True
WarningStatusLight(WarningStatus, LevelCheck.HiTemp)
End If
End Sub
Заключение
Теперь у меня есть датчик с основной функциональностью, который можно использовать для определения температуры в моем винном погребке и который даст мне наглядное представление возникновение условий повреждения вина. Я описал создание схемы, чтение данных датчика, использование таймеров для опроса датчиков, включение/выключение светодиодов для индикации, взаимодействие с устройством с помощью кнопки и запись данных на карту MicroSD. Это основные функции, которые могут быть использованы снова во многих различных приложениях.
Основная идея заключается в том, что не так сложно начать работать с Netduino и если вы знаете C# или VB, .Net Micro Framework говорит на вашем языке.
Вот несколько ссылок, которые могут оказаться интересными:
- .Net Micro Framework v4.2 RTW's
- Netduino открывается для более широкой аудитории с выходом .NET Micro Framework v4.2
- Плавное введение в Netduino
- Нет контроллера Netduino? Используйте виртуальный. Виртуальная макетная плата предоставляет (некоторую) поддержку Netduino
- Быстрая разработка на основе Netduino
- Журнал MAKE: Как сделать: Гейгеровски счетчик с выходом в твиттер
- Netduino
- Шесть мест, где можно купить Netduino и другие электронные компоненты
- netduino Helpers
- Новое в магазине Maker Shed: Netduino, электронная платформа с открытым кодом, управляемая .NET