Program your own Finite State Machine using a SPLat Controller for only $29.00.
The EC1 "EasyOne", a 32-bit fully featured SPLat Controller with USB and true multi-tasking is a easy way to learn and a cheap way to build your project.
VB.NET - Full program listing
Here is the full program source code in a form that you can copy and paste straight into VB.NET
Public Class Form1 Dim State As Integer 'Global state number Dim TimerCount As Integer 'Counts down timer ticks '**************************************************** '********** Event handlers ************************** '**************************************************** Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Various bits of initialization code go in the form_load event SetState(0) Timer1.Interval = 100 'mS Timer1.Enabled = True Label1.Text = "Heater" Label3.Text = "°C" OvalShape1.BackStyle = PowerPacks.BackStyle.Transparent OvalShape1.BackColor = Color.Red Button1.Text = "Alarm reset" Button1.AutoSize = True End Sub Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged 'Simulated temperature reading Select Case NumericUpDown1.Value Case Is < 84 Select Case State Case 0 SetState(1) End Select Case Is > 85 Select Case State Case 1 SetState(0) End Select End Select End Sub Private Sub TimeOut() Select Case State Case 1 SetState(2) End Select End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Alarm reset button Select Case State Case 2 SetState(0) End Select End Sub '**************************************************** '********** Outputs ******************************** '**************************************************** Private Sub HeaterOut(ByVal Output As Boolean) 'Simulate the heater with a colored label Select Case Output Case True Label1.BackColor = Color.Red Case False Label1.BackColor = Color.Blue End Select End Sub Private Sub AlarmOut(ByVal Output As Boolean) 'Simulate the alarm output with a colored label Select Case Output Case True OvalShape1.BackStyle = PowerPacks.BackStyle.Opaque Case False OvalShape1.BackStyle = PowerPacks.BackStyle.Transparent End Select End Sub '**************************************************** '********** State transitions *********************** '**************************************************** Private Sub SetState(ByVal NewState As Integer) 'Switch to a nominated state, doing all the entry action stuff State = NewState 'Update the global state number Label2.Text = "State = " & State 'Diagnostic display Select Case State 'Actions depend on the state we are entering Case 0 HeaterOut(False) AlarmOut(False) Case 1 HeaterOut(True) StartTiming(60) Case 2 HeaterOut(False) AlarmOut(True) End Select End Sub '**************************************************** '********** Timer management ************************ '**************************************************** Private Sub StartTiming(ByVal Duration As Integer) TimerCount = Duration 'Just set the global counter value End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 'Time out timer. Uses a 100mS tick, counts down an integer interval If TimerCount > 0 Then TimerCount = TimerCount - 1 Label4.Text = "Timer = " & TimerCount If TimerCount <= 0 Then ' <= is defensive ... just = would do TimeOut() End If End If End Sub End Class