#Region Project Notes
#End Region
#Region Project Attributes
#AutoFlushLogs: True
#CheckArrayBounds: True
#StackBufferSize: 400
#End Region
Sub Process_Globals
Public Serial1 As Serial
Public Serial2 As SoftwareSerial
Private bc As ByteConverter
Private wifi As ESP8266WiFi
Private WiFiStr As WiFiSocket
Private server As WiFiServerSocket
Private astream1 As AsyncStreams
Private astream2 As AsyncStreams
Public connected(2) As Boolean
Private ser As B4RSerializator
Public id As String = "1000"
Private ssid As String = "OBS_Ozone"
Private pwd As String = "oxyzone1"
Private D1 As D1Pins
Private led As Pin
Private t1 As Timer
Private mqtt As MqttClient
Private MqttTopicOzone As String = "ozone"
Private MqttTopicAlarm As String = "alarm"
Private mqttTopicRaw As String = "raw"
Public ppm As Double
Private alarm As Pin
Private serverIP() As Byte = Array As Byte(192, 168, 10, 128 )
Private const ServerPort As UInt = 1883
End Sub
Private Sub AppStart
Serial1.Initialize(115200)
Log("AppStart")
t1.Initialize("t1_Tick",1000)
led.Initialize(D1.D4,led.MODE_OUTPUT)
t1.Enabled = True
If wifi.Connect2(ssid,pwd) Then
Log("Connected to wireless network.")
Log("My ip: ", wifi.LocalIp)
t1.Enabled = False
led.DigitalWrite(False)
Else
Log("Failed to connect.")
t1.Enabled = True
Return
End If
server.Initialize(51042, "server_NewConnection")
server.Listen
Serial2.Initialize(9600,12,13)
astream2.Initialize(Serial2.Stream, "astream2_NewData", "astream2_Error")
mqtt.Initialize(WiFiStr.Stream, serverIP, ServerPort, id, "Mqtt_MessageArrived", "Mqtt_Disconnected")
alarm.Initialize(D1.D3,alarm.MODE_INPUT_PULLUP)
MQTTConnect(0)
alarm.AddListener("alarm_StateChanged")
End Sub
Sub alarm_StateChanged (state As Boolean)
If state = False Then
Dim o As String = "True"
Dim s As String = JoinStrings(Array As String(id,",", o))
mqtt.Publish(MqttTopicAlarm,s.GetBytes)
Else
Dim o As String = "False"
Dim s As String = JoinStrings(Array As String(id,",", o))
mqtt.Publish(MqttTopicAlarm,s.GetBytes)
End If
End Sub
Sub Server_NewConnection (NewSocket As WiFiSocket)
Log("Client connected")
astream1.Initialize(NewSocket.Stream, "astream1_NewData", "astream1_Error")
End Sub
Sub AStream1_NewData (Buffer() As Byte)
Dim be(10) As Object
Dim data() As Object = ser.ConvertBytesToArray(Buffer, be)
Log("Received:")
For Each o As Object In data
Log(o)
Next
End Sub
Sub AStream1_Error
Log("Error")
server.Listen
End Sub
#Region MQTT
Sub MQTTConnect(unused As Byte)
If mqtt.Connect = False Then
Log("MQTT: trying to connect again")
CallSubPlus("MQTTConnect", 1000, 0)
Return
End If
Log("MQTT: Connected to the broker")
mqtt.Subscribe(MqttTopicOzone, 0)
End Sub
Sub Mqtt_MessageArrived (Topic As String, Payload() As Byte)
Log("MQTT: Message arrived. Topic=", Topic, " Payload: ", Payload)
End Sub
Sub Mqtt_Publish(aa As String)
Dim s As String = NumberFormat(ppm,0,2)
Dim k As String = JoinStrings(Array As String(id,",",s,",",aa))
mqtt.Publish(MqttTopicOzone,k.GetBytes)
End Sub
Sub Mqtt_Disconnected
Log("MQTT: Disconnected")
mqtt.Close
MQTTConnect(0)
End Sub
#End Region
Sub astream2_newData (Buffer() As Byte)
Dim a As String = bc.HexFromBytes(Buffer)
mqtt.Publish(mqttTopicRaw,a)
Log("a = ",a)
Log("buffer len = ",Buffer.Length)
Log (bc.SubString2(a,4,12))
Dim s(1) As Byte
bc.ArrayCopy2(Buffer,12,s,0,1)
Dim res(8) As Byte
ByteToBinary(s(0), res)
Dim sen As String = bc.StringFromBytes(res)
Dim z() As Byte = bc.SubString(sen,6)
Log("sensor status = ",z)
Dim t As String = bc.StringFromBytes(z)
Dim b(4) As Byte
bc.ArrayCopy2(Buffer, 2, b, 0, 4)
Dim d() As Double = bc.DoublesFromBytes(b)
Log("ppm = ",d(0))
ppm = d(0)
Mqtt_Publish(t)
End Sub
Sub astream2_Error
Log("Serial 2 - No Connection")
mqtt.Publish(mqttTopicRaw,"Astream2 error")
End Sub
Sub ByteToBinary (Number As Byte, Result() As Byte)
For i = 0 To 7
If Bit.Get(Number, 7 - i) = 1 Then
Result(i) = Asc("1")
Else
Result(i) = Asc("0")
End If
Next
End Sub
Sub t1_tick
Dim currentState As Boolean = led.DigitalRead
Dim NewState As Boolean = Not(currentState)
led.DigitalWrite(NewState)
End Sub