Serial port environmental sensor and signalling unit

From uCtrl
Environmental sensor and signalling unit and Light sensor with LED display

Information

OESU has two analog sensors: temperature (LM35) and light intensity (TSL252R), five colored LEDs for signals and a buzzer. The analog values are reported back in a range from 0 to 999. See formula further down. The values are not automatically sent, they have to be request by Serial Server. By using third part software it's also possible to make graphs. Green, yellow and red LED are set to copy the stack light, while the white and blue can be controlled freely by Serial Server.

Commands

  • Inputs
    1. Value from temperature sensor
    2. Value from light sensor
    3. Switch 1 status
    4. Switch 2 status
  • Outputs
    1. White LED flash on/off
    2. Green LED flash on/off
    3. Yellow LED flash on/off
    4. Red LED flash on/off
    5. Blue LED flash on/off
    6. Buzzer
      • 0 Turn off
      • 1 One long, then two short pulses
      • 2 One long, then two short pulses continues
    7. Mute (no alarms)

I/O

Inputs

  1. PC0 Temperature
  2. PC1 Light intensity
  3. PC2 Switch 1
  4. PC3 Switch 2

Calculations

Temperature
Light intensity

Outputs

  1. PB0 LED white
  2. PB1 LED green
  3. PB2 LED yellow
  4. PB3 LED red
  5. PB4 LED blue
  6. PB5 Buzzer
  7. PD5 Link act.
  8. PD6 Mute LED
  9. PD7 Life LED

Communication

Interfacing is done with RS-232, using MAX232 or MAX202.

Analog inputs:

21:31:51 => 003:i:02:19:176
21:31:50 <= 003:i:02
21:31:46 => 003:i:01:54:174
21:31:45 <= 003:i:01

Serial settings

Baud
9600
Data bits
8
Parity
None
Stop bits
1
Start command
*
Module ID
003

Images

Schematic drawing

Oesu circuit.png

Parts list

Qty. Part
1 AVR ATmega8-16PU, DIL-28, 16 MHz, 23 I/Os
1 Buzzer, 95 dB, panel, 24x18 mm, 10–26 V
5 Capacitor, aluminium electrolytic, 1 µF, 50V
1 Capacitor, aluminium electrolytic, 10 µF, 25V
2 Capacitor, aluminium electrolytic, 47 µF, 25V
2 Capacitor, ceramic, 1 nF, 100V
2 Capacitor, metallized polyester foil, 0.01 µF
1 D-Sub soldering cups, 9 pin female
1 DIL socket, 16-pin, 7.62mm
1 DIL socket, 28-pin, 7.62mm
1 Diode, rectifier, 1 A, 400V, 1N4004
1 Enclosure, plastic (1591 FL), 150x80x50mm, flange
1 Fuse 5x20 mm, 500 mA, fast-acting
1 Fuse holder, open, PCB, 5x20mm
1 Fuse holder, open, PCB, Protective cover
1 Heatsink, 27.3K/W, 19mm, attachable, TO220
1 LED 5mm clear, Blue, 3.4V, 20mA, 7.200mcd, 20°
1 LED 5mm clear, Green, 3.4V, 20mA, 10.000mcd, 25°
1 LED 5mm clear, Red, 2.1V, 20mA, 7.000mcd, 20°
1 LED 5mm clear, White, 2.95V, 20mA, 12.000mcd, 20°
1 LED 5mm clear, Yellow, 2.1V, 20mA, 10.000mcd, 20°
1 LED 5mm, Red/Green, 2.0 2.1V, 10mA, 100 63mcd, 30°
1 LED 5mm, Yellow, 2.0V, 25mA
2 LED holder 5mm, Black plastic
1 LED lens 5mm, CLF 280, Blue
1 LED lens 5mm, CLF 280, Clear
1 LED lens 5mm, CLF 280, Green
1 LED lens 5mm, CLF 280, Red
1 LED lens 5mm, CLF 280, Yellow
1 Light-to-voltage sensor, TSL 252R, 9.4mV / (μW/cm2)
32 cm2 PCB, stripboard, 100x160mm, 160cm2
1 Power jack, panel, 2.1mm, plastic housing
2 Resistor, carbon film, 0.25W, 100 Ω, 5%
1 Resistor, carbon film, 0.25W, 120 Ω, 5%
2 Resistor, carbon film, 0.25W, 150 Ω, 5%
2 Resistor, carbon film, 0.25W, 330 Ω, 5%
3 Resistor, carbon film, 0.25W, 470 Ω, 5%
2 Resistor, carbon film, 0.25W, 4.7 kΩ, 5%
2 Resistor, carbon film, 0.25W, 10 kΩ, 5%
1 RS232 interface, MAX232CPE, dual
1 Rubber boot for toggle switch, O-ring sealing
4 Spacer, round unthreaded, 3mm, Ø6mm, Delrin
33 Straight pin header, female, Single row, 2.54mm
33 Straight pin header, male, Single row, 2.54mm
1 Switch, toggle, 1-pole, micro, (on)-off-(on)
1 Temperature sensor LM35DZ, 0 to +100 °C, +-0,6 °C
1 Transistor, NPN, 800 mA, 45V, 0.625W, BC337-25
1 Voltage regulator +5V, 2 A, L78S05CV

Source code

Template:Basic code

'--------------------------------------------------------------
' Thomas Jensen
'--------------------------------------------------------------
' file: AVR_OESU_v.1.0
' date: 22/05/2007
'--------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Config Portb = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portc.2 = Input
Config Portc.3 = Input

Dim W1 As Word , W2 As Word
Dim Lifesignal As Word , Life As Integer , Send As String * 20
Dim Inn(4) As Byte , A As Byte , A2 As String * 1
Dim Serialcharwaiting As Byte , Serialchar As Byte
Dim Comminput As String * 15 , Input_nr As String * 3
Dim Input_com As String * 1 , Input_ut As String * 2
Dim Input_stat As String * 1 , Led As Byte , Ut(7) As Byte
Dim Ut_t(6) As Word , B As Byte

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Const Id = "003"
Life = 1000

Waitms 5000

Top:
Serialcharwaiting = Ischarwaiting()

If Serialcharwaiting = 1 Then
   Serialchar = Inkey()
      Goto Myroutine
   End If

Goto Main

Myroutine:
Select Case Serialchar
Case 42 '*
Goto Set_value
End Select

Main:
'input send off signal
For A = 3 To 4
   If Inn(a) = 1 Then
      Led = 103
      A2 = Str(a)
      If Len(a2) < 2 Then A2 = "0" + A2
      Send = Id + ":i:" + A2 + ":0:"
      Print Send ; Checksum(send)
      End If
Next A

'input send on signal
If Inn(1) = 1 Then 'input 1
   W1 = Getadc(0)
   If W1 > 999 Then W1 = 999
   Led = 103
   Send = Id + ":i:01:" + Str(w1) + ":"
   Print Send ; Checksum(send)
   Inn(1) = 0
   End If

If Inn(2) = 1 Then 'input 2
   W2 = Getadc(1)
   If W2 > 999 Then W2 = 999
   Led = 103
   Send = Id + ":i:02:" + Str(w2) + ":"
   Print Send ; Checksum(send)
   Inn(2) = 0
End If

If Pinc.2 = 0 Then 'input 3
   If Inn(3) = 0 Then
   Led = 103
   Send = Id + ":i:03:1:"
   Print Send ; Checksum(send)
   End If
   Inn(3) = 250
End If

If Pinc.3 = 0 Then 'input 4
   If Inn(4) = 0 Then
   Led = 103
   Send = Id + ":i:04:1:"
   Print Send ; Checksum(send)
   End If
   Inn(4) = 250
End If

'set input counters
For A = 3 To 4
   If Inn(a) > 0 Then Decr Inn(a)
Next A

'set output counters
For B = 1 To 6
   If Ut_t(b) > 0 Then Decr Ut_t(b)
Next B

'handle outputs
For B = 1 To 5
If Ut(b) = 1 And Ut_t(b) = 0 Then Ut_t(b) = 667
Next B
If Ut(6) = 2 And Ut_t(6) = 0 Then Ut_t(6) = 5001
If Ut(6) = 1 Then
   Ut_t(6) = 1201
   Ut(6) = 0
   Send = Id + ":o:06:" + Str(ut(6)) + ":"
   Print Send ; Checksum(send)
   End If

If Ut_t(1) = 334 And Ut(7) = 0 Then Portb.0 = 1
If Ut_t(1) = 1 Then Portb.0 = 0

If Ut_t(2) = 334 And Ut(7) = 0 Then Portb.1 = 1
If Ut_t(2) = 1 Then Portb.1 = 0

If Ut_t(3) = 334 And Ut(7) = 0 Then Portb.2 = 1
If Ut_t(3) = 1 Then Portb.2 = 0

If Ut_t(4) = 334 And Ut(7) = 0 Then Portb.3 = 1
If Ut_t(4) = 1 Then Portb.3 = 0

If Ut_t(5) = 334 And Ut(7) = 0 Then Portb.4 = 1
If Ut_t(5) = 1 Then Portb.4 = 0

If Ut_t(6) = 1101 And Ut(7) = 0 Then Portb.5 = 1
If Ut_t(6) = 701 Then Portb.5 = 0
If Ut_t(6) = 301 And Ut(7) = 0 Then Portb.5 = 1
If Ut_t(6) = 201 Then Portb.5 = 0
If Ut_t(6) = 101 And Ut(7) = 0 Then Portb.5 = 1
If Ut_t(6) = 1 Then Portb.5 = 0

'led timer
If Led > 0 Then Decr Led
If Led = 100 Then Portd.5 = 1
If Led = 0 Then Portd.5 = 0

'lifestring
If Life > 0 Then Decr Life
If Life = 0 Then
   Led = 103
   Send = Id + ":s:01:1:"
   Print Send ; Checksum(send)
   Life = 20000
   End If

'lifesignal
If Lifesignal > 0 Then Decr Lifesignal
If Lifesignal = 500 Then
   If Ut(7) = 1 Then Portd.6 = 1
   If Ut(7) = 0 Then Portd.7 = 1
   End If
If Lifesignal = 0 Then
   Portd.6 = 0
   Portd.7 = 0
   Lifesignal = 2100
   End If

Waitms 1
Goto Top
End

Set_value:
Input Comminput Noecho 'read serialport

Input_nr = Left(comminput , 3) 'id check
Input_com = Mid(comminput , 5 , 1) 'command check
Input_ut = Mid(comminput , 7 , 2) 'output nr check
Input_stat = Mid(comminput , 10 , 1) 'output stat check

'output
If Input_nr = Id Then

If Input_com = "o" Then
Led = 103
Select Case Input_ut

Case "01" 'output 1
If Input_stat = "1" Then Ut(1) = 1
If Input_stat = "0" Then Ut(1) = 0
Send = Id + ":o:01:" + Str(ut(1)) + ":"
Print Send ; Checksum(send)

Case "02" 'output 2
If Input_stat = "1" Then Ut(2) = 1
If Input_stat = "0" Then Ut(2) = 0
Send = Id + ":o:02:" + Str(ut(2)) + ":"
Print Send ; Checksum(send)

Case "03" 'output 3
If Input_stat = "1" Then Ut(3) = 1
If Input_stat = "0" Then Ut(3) = 0
Send = Id + ":o:03:" + Str(ut(3)) + ":"
Print Send ; Checksum(send)

Case "04" 'output 4
If Input_stat = "1" Then Ut(4) = 1
If Input_stat = "0" Then Ut(4) = 0
Send = Id + ":o:04:" + Str(ut(4)) + ":"
Print Send ; Checksum(send)

Case "05" 'output 5
If Input_stat = "1" Then Ut(5) = 1
If Input_stat = "0" Then Ut(5) = 0
Send = Id + ":o:05:" + Str(ut(5)) + ":"
Print Send ; Checksum(send)

Case "06"
If Input_stat = "2" Then Ut(6) = 2 'output 6
If Input_stat = "1" Then Ut(6) = 1
If Input_stat = "0" Then Ut(6) = 0
Send = Id + ":o:06:" + Str(ut(6)) + ":"
Print Send ; Checksum(send)

Case "07" 'output 7
If Input_stat = "1" Then Ut(7) = 1
If Input_stat = "0" Then Ut(7) = 0
Send = Id + ":o:07:" + Str(ut(7)) + ":"
Print Send ; Checksum(send)

End Select
End If

If Input_com = "i" Then
Select Case Input_ut

Case "01"
If Inn(1) = 0 Then Inn(1) = 1 'status input 1
Case "02"
If Inn(2) = 0 Then Inn(2) = 1 'status input 2
Case "03"
If Inn(3) = 0 Then Inn(3) = 2 'status input 3
Case "04"
If Inn(4) = 0 Then Inn(4) = 2 'status input 4

End Select
End If

End If
Goto Main
End