'WIRE LEGEND for 74HC595 shift register
'8 GND = GND
'16 Vcc = 5V
'14 = D1
'12 = GND
'12 = D2
'11 = D3
'10 = 5V
'QA to QH is connected to relays 7 to 0
Sub Process_Globals
'These global variables will be declared once when the application starts.
'Public variables can be accessed from all modules.
Public Serial1 As Serial
Private AStream As AsyncStreams
Private WiFi As ESP8266WiFi
Private WiFiStr As WiFiSocket
Private MQTT As MqttClient
Private MQTTOpt As MqttConnectOptions
Private MQTTUser As String = "xxxxxxx"
Private MQTTPassword As String = "_xxxxxxx"
Private MQTTHostName As String = "m21.cloudmqtt.com"
Private MQTTPort As Int = 14925
Private DS, STCP, SHCP As Pin
Private Relays As Int = 8
Private Registers(Relays) As Boolean
Private ESPin As D1Pins
End Sub
Private Sub AppStart
Serial1.Initialize(115200)
Delay(1000)
Log("AppStart")
DS.Initialize(ESPin.D1, DS.MODE_OUTPUT) 'Arduino Pin 8, SR Pin 14 Serial In
STCP.Initialize(ESPin.D2, STCP.MODE_OUTPUT) 'Arduino Pin 11, SR Pin 12 RCK
SHCP.Initialize(ESPin.D3, SHCP.MODE_OUTPUT) 'Arduino Pin 12, SR Pin 11 Serial Clock
'Clear Register Values
ClearAllReg
AStream.Initialize(Serial1.Stream, "Astream_NewData", "Astream_Error")
'Connect to local WiFi Access Point
WiFi.Connect2("Access Point", "Access Point Password")
If WiFi.IsConnected Then Log("Connected to WiFi, Local IP ", WiFi.LocalIp) Else Log("Not Connected to WiFi")
'Connect to CloudMQTT broker
Dim ClientId As String = Rnd(0, 999999999) 'create a unique id
MQTT.Initialize2(WiFiStr.stream, MQTTHostName, MQTTPort, ClientId, "MQTT_MessageArrived", "MQTT_Disconnected")
MQTTOpt.Initialize(MQTTUser, MQTTPassword)
MQTT_Connect(0)
End Sub
Sub MQTT_MessageArrived (Topic As String, Payload() As Byte)
Log("Topic = ", Topic, " and Payload = ", Payload)
Dim State As Boolean
Dim BC As ByteConverter
If BC.StringFromBytes(Payload) = "true" Then State = True Else State = False
Select Case Topic
Case "Relay_0"
Registers(0) = Not(State)
Case "Relay_1"
Registers(1) = Not(State)
Case "Relay_2"
Registers(2) = Not(State)
Case "Relay_3"
Registers(3) = Not(State)
Case "Relay_4"
Registers(4) = Not(State)
Case "Relay_5"
Registers(5) = Not(State)
Case "Relay_6"
Registers(6) = Not(State)
Case "Relay_7"
Registers(7) = Not(State)
End Select
WriteToReg
End Sub
Sub MQTT_Connect(Unused As Byte)
If MQTT.Connect = False Then
Log("Trying to connect to broker")
MQTT.Connect2(MQTTOpt)
CallSubPlus("MQTT_Connect", 1000, 0)
Else
Log("Connected to broker")
For i = 0 To Relays - 1
MQTT.Subscribe(JoinStrings(Array As String("Relay_", i)), 0)
Next
End If
End Sub
Sub MQTT_Disconnected
Log("Disconnected")
MQTT.Close
MQTT_Connect(0)
End Sub
Sub Astream_NewData (Buffer() As Byte)
Log("Received: ", Buffer)
End Sub
Sub AStream_Error
Log("error")
End Sub
'Write To Registers
Private Sub WriteToReg()
STCP.DigitalWrite(False)
Dim i As Int = 0
Do While i <= Relays - 1
SHCP.DigitalWrite(False)
DS.DigitalWrite(Registers(i))
SHCP.DigitalWrite(True)
i = i + 1
Loop
STCP.DigitalWrite(True)
End Sub
'Clear All Registers
Private Sub ClearAllReg()
Dim i As Int = Relays - 1
Do While i >= 0
Registers(i) = True 'True = NO
i = i - 1
WriteToReg
Loop
End Sub