Visual Basic Thermometer

Introduction

This page is concerned with reading the value of a sensor connected to the Arduino and displaying that output interestingly in Visual Basic.

You Will Need

  • 1 x TMP36 Temperature Sensor
  • Jumper Wires

The TMP36 is helpfully almost exactly like a transistor, a part you absolutely don't want to use in this circuit. If you look very carefully at the part, you should see the letters TMP on the front side. If you do accidentally plug in the transistor in its place, it will get hot. Common sense tells you to remove the USB cable, wait for it to cool and then try harder to put the correct part in.

Making The Circuit

Arduino Circuit Diagram

Programming The Arduino

All we need the Arduino to do is to read the temperature and send it to the serial port at regular intervals. The following basic code is sufficient for that purpose,

int tempPin = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  float voltage;
  float degreesC;
  voltage = analogRead(tempPin) * (5.0/1024.0);
  degreesC = (voltage - 0.5) * 100.0;
  Serial.println(degreesC);
  delay(500);
}

You can test that the circuit is supplying plausible values by using the Serial monitor.

Making The Visual Basic Program

Create a Visual Basic Windows Forms project and add a PictureBox and 2 buttons to the form.

VB Thermometer

  • The PictureBox should be named picTherm and be 100 by 600 pixels in size.
  • The buttons are called btnConnect and btnDisconnect.

You need the following Imports at the top of the code window,

Imports System.Drawing.Drawing2D
Imports System.IO.Ports

You will need the following global variables,

Dim bmp As Bitmap = New Bitmap(100, 600)
Dim temperature As Double = 10

Now you need to click on the PictureBox, look for the events list in the Properties window and find the Paint event. Double click the space next to it. This should bring up some headers for our event handler which will be used to draw our thermometer.

Private Sub picTherm_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles picTherm.Paint
   Dim g As Graphics = Graphics.FromImage(bmp)
   g.Clear(Color.White)
   ' fill temperature
   If temperature > 100 Then temperature = 100
   If temperature < 0 Then temperature = 0
   g.FillRectangle(Brushes.Red, 48, 550 - CInt(temperature * 5), 4, CInt(temperature * 5))
   'draw scale
   g.DrawLine(Pens.Black, 45, 550, 45, 50)
   ' minor ticks
   For i As Integer = 50 To 550 Step 5
      g.DrawLine(Pens.Black, 45, i, 48, i)
   Next
   'major ticks
   Dim f As Font = New Font("Verdana", 8, FontStyle.Regular)
   Dim scale As Integer
   For i As Integer = 550 To 50 Step -25
      g.DrawLine(Pens.Black, 45, i, 55, i)
      scale = (550 - i) / 5
      g.DrawString(Str(scale), f, Brushes.Black, 10, i - 8)
   Next
   picTherm.Image = bmp
End Sub

You can test the program at this stage. It should display the value of the temperature that was hard-coded in the global variable declaration. If you change this value and run the program again, the reading on the scale should change.

Arduino Connection Code

Add the following to the list of global variables,

Dim WithEvents sp As New SerialPort

Now go to the properties for the Disconnect button and set the visible property to false.

Double click on the Connect button and write the event handler for it. You will need to change the COM port so that it matches the one your Arduino connects on.

Private Sub btnConnect_Click(sender As System.Object, e As System.EventArgs) Handles btnConnect.Click
   Try
      sp.BaudRate = "9600"
      sp.PortName = "COM3"
      sp.Open()
      If sp.IsOpen Then
         btnConnect.Visible = False
         btnDisconnect.Visible = True
      End If
   Catch
      sp.Close()
   End Try
End Sub

Double click on the disconnect button and write the event handler for it,

Private Sub btnDisconnect_Click(sender As System.Object, e As System.EventArgs) Handles btnDisconnect.Click
   Try
      sp.Close()
      btnConnect.Visible = True
      btnDisconnect.Visible = False
      Exit Sub
   Catch
      MessageBox.Show("Some kind of problem.")
   End Try
End Sub

We also need to make sure that a disconnection is made before the program is closed. Go to the properties window for the form. Click on the lightning symbol to find the list of events. Double click in the box next to Form_Closing and add the following code,

Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
   If sp.IsOpen() Then
      MessageBox.Show("Disconnect before closing")
      e.Cancel = True
   End If
End Sub

Finally, we can add the code we need to read the value from the serial port and display it in our PictureBox,

Delegate Sub myMethodDelegate(ByVal [text] As String)
Dim myDelegate As New myMethodDelegate(AddressOf ProcessReading)

Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
   Dim str As String = sp.ReadLine()
   Invoke(myDelegate, str)
End Sub

Sub ProcessReading(input As String)
   If IsNumeric(input) Then
      temperature = CDbl(input)
      picTherm.Refresh()
   End If
End Sub

Assuming that the Arduino is running and connected to the PC, the program should now display the temperature reading on the scale. It updates once every 500 milliseconds and you should see a little bit of movement. If you hold the temperature sensor or bring something warm near to it, you will see the reading climb.

Challenge

Adapt the program so that readings of the temperature are taken at regular intervals. The reading and the time index should be stored. You can output these values into a CSV file and then use the data in Excel to produce a graph of the temperature variations over a period of time.