My washing machine project worked 100%
I want to share with you
I want to share with you
B4R:
#Region Project Attributes
#AutoFlushLogs: True
#CheckArrayBounds: True
#StackBufferSize: 600
#End Region
'Ctrl+Click to open the C code folder: ide://run?File=%WINDIR%\System32\explorer.exe&Args=%PROJECT%\Objects\Src
Sub Process_Globals
Public Serial1 As Serial
Private wifi As ESP8266WiFi
Private server As WiFiServerSocket
Private astream As AsyncStreams
Private Timer1 As Timer
Private Timer2 As Timer
Private Timer3 As Timer
Private Timer4 As Timer
Private ssd As AdafruitSSD1306
Private ESPin As D1Pins
Private Relays As Int = 9
Private Registers(Relays) As Boolean
Private DS,STCP,SHCP As Pin
Private bc As ByteConverter
Private ssd As AdafruitSSD1306
Dim Sensor_Pres As Pin
Dim Start As Pin
Dim Set_Sensor As Pin
Dim EncoderPinA As Pin
Dim EncoderPinB As Pin
Private LastStateTime As Long = 0'Enconder
Private Counter As Int = 1 ' Enconder
Private lastButtonState As Boolean = True ' O estado anterior do botão, assume que começa não pressionado.
End Sub
Private Sub AppStart
Serial1.Initialize(115200)
Log("AppStart")
' Inicializa os pinos como entrada do enconder
EncoderPinA.Initialize(13, EncoderPinA.MODE_INPUT_PULLUP)'Inicializa o botão 1 com pull-up interno
EncoderPinB.Initialize(10, EncoderPinB.MODE_INPUT_PULLUP)'Inicializa o botão 2 com pull-up interno
EncoderPinA.AddListener("EncoderPinA_Changed")'Enconder de 3 pinos
Sensor_Pres.Initialize(ESPin.D4,Sensor_Pres.MODE_INPUT_PULLUP) 'Inicializa o botão 3 com pull-up interno
Start.Initialize(ESPin.D3,Start.MODE_INPUT_PULLUP) 'Inicializa o botão 4 com pull-up interno
Set_Sensor.Initialize(ESPin.D8,Set_Sensor.MODE_INPUT) 'Inicializa o botão 4 com pull-up interno
Set_Sensor.AddListener("Liga_Desligar")'Ligar e Desligar Maquina
Timer1.Initialize("Menu",500) 'Menu de função aguardar 500 ms
'Timer1.Enabled = False
Timer2.Initialize("Start_Ente",200) 'Botão Start Enter
Timer3.Initialize("Enchimento",300) 'Botão Start Valvola Enchimento
Timer4.Initialize("Molho_Longo",400) 'Botão Start Valvola Molho
DS.Initialize(ESPin.D0,DS.MODE_OUTPUT) 'HS Pin 11 Serial In ESP D6 GPIO 12
STCP.Initialize(ESPin.D5,STCP.MODE_OUTPUT) 'HS Pin 12 RCK ESP D5 GPIO 14
SHCP.Initialize(ESPin.D6,SHCP.MODE_OUTPUT) 'HS Pin 14 Serial Clock ESP D7 GPIO 16
'Clear Register Values
ClearAllReg
ssd.InitializeI2C(ESPin.D6,0x3C) 'initialise SSD1306 0x78
ssd.ClearDisplay
ssd.GFX.SetCursor(0, 0)
ssd.GFX.ConfigureText(1, ssd.WHITE, False)
ssd.GFX.DrawText("Inicializando...").DrawText(CRLF).DrawText(CRLF)
ssd.Display
'example of connecting to a local network
If wifi.Connect2("Help-Info Central Tec 2.4G","Pp1c2s3m4") Then
Log(wifi.LocalIp)
ssd.ClearDisplay
ssd.GFX.SetCursor(0,0)
ssd.GFX.ConfigureText(1, ssd.WHITE, False)
ssd.GFX.DrawText("Conectado Wifi").DrawText(CRLF).DrawText(CRLF)
ssd.Display
Delay(2000)
ssd.ClearDisplay
ssd.GFX.SetCursor(1,0)
ssd.GFX.ConfigureText(1,ssd.WHITE,False)
ssd.GFX.DrawText("IP: ")
ssd.GFX.DrawText(wifi.LocalIp)
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText(" DESLIGADO")
ssd.Display
Registers(7) = True'Ligar o Led Internet
WriteToReg
Else
Log("Falha ao se Conectatr.")
Registers(7) = False'Desligar o Led Internet
WriteToReg
Return
End If
Registers(5) = True'Ligar o Buzzer
WriteToReg
Delay(60)
Registers(5) = False'Ligar o Buzzer
WriteToReg
server.Initialize(80, "server_NewConnection")
server.Listen
End Sub
Private Sub Server_NewConnection (NewSocket As WiFiSocket)
Log("Cliente Conectado")
astream.Initialize(NewSocket.Stream, "astream_NewData", "astream_Error")
End Sub
Sub astreamCom_Error
Log("error")
End Sub
Sub Astream_NewData (Buffer() As Byte)
Log(Buffer)
Dim value As String = bc.StringFromBytes(Buffer)
Select value
Case "CMDA"
Log("OI BONITÃO")
End Select
WriteToReg
End Sub
Sub AStream_Error
Log("Desconectado")
server.Socket.Close
server.Listen
End Sub
' Método chamado quando o pino A do encoder muda de estado
Sub EncoderPinA_Changed (State As Boolean)
Dim StateTime As Long = Millis()
If StateTime - LastStateTime > 1000 Then 'Execute apenas se o intervalo de disparo da mudança de estado for maior que 50 ms, ajuste para se adequar
If EncoderPinB.DigitalRead Then
Counter = Counter - 1
Else
Counter = Counter + 1
End If
Counter = Min(7, Max(1, Counter)) 'Limit the counter between 0 and 4
LastStateTime = StateTime 'Armazenar a hora do último estado
Log("Position: ", Counter)
End If
End Sub
Sub Menu'Ligar O Menu Timer 1
Select (Counter)
Case 1
Log("Menu 1")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PESADO")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True 'Botão Start Enter
End If
Case 2
Log("Menu 2")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("NORMAL")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True 'Botão Start Enter
End If
Case 3
Log("Menu 3")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("RAPIDO")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True 'Botão Start Enter
End If
Case 4
Log("Menu 4")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("DIA A DIA")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True'Botão Start Enter
End If
Case 5
Log("Menu 5")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("ENCHAGUAR")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True'Botão Start Enter
Timer3.Enabled = True'Start Enchimento
End If
Case 6
Log("Menu 6")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("CENTRIFUGAR")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True'Botão Start Enter
Centrifugar
End If
Case 7
Log("Menu 7")
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PROGRAMA:")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("MOLHO LONGO")
ssd.Display
If Start.DigitalRead = False Then ' Botão pressionado (leitura é LOW devido ao pull-up)
Timer2.Enabled = True 'Botão Start Enter
Timer4.Enabled = True 'Botao Start Molho Longo
End If
End Select
End Sub
Sub Liga_Desligar (State As Boolean)
Dim currentState As Boolean = Set_Sensor.DigitalRead
If currentState = False And lastButtonState = True Then ' Detecta borda de descida (botão pressionado)
Timer1.Enabled = Not(Timer1.Enabled) ' Alterna o estado do timer
Log("Timer State: ", Timer1.Enabled)
If Timer1.Enabled Then
ssd.ClearDisplay
ssd.GFX.SetCursor(2,18)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText(" LIGADO")
ssd.Display
Registers(6) = True'Ligar o Led do Painel
WriteToReg
Registers(5) = True'Ligar o Buzzer
WriteToReg
Delay(60)
Registers(5) = False'Ligar o Buzzer
WriteToReg
Else
Registers(6) = False'Ligar o Led do Painel
WriteToReg
ssd.ClearDisplay
ssd.GFX.SetCursor(2,18)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText(" DESLIGADO")
ssd.Display
End If
End If
lastButtonState = currentState ' Atualiza o estado anterior do botão
End Sub
Sub Start_Ente'Start Enter Timer 2
Timer1.Enabled = False'Menu
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("LAVANDO ")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("PESADO ")
ssd.Display
Delay(300)
Registers(4) = True 'Abrir Valvola de Água
WriteToReg
If Sensor_Pres.DigitalRead = False Then 'Esperando encher de agual
Registers(4) = False'Fechar Valvola de água
WriteToReg
Lavagem_Normal
End If
End Sub
'
Private Sub Lavagem_Normal()
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("LAVANDO ")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
For i = 0 To 20'20 PASSOS
Registers(1) = True 'Ligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(1) = False 'Desligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = True 'Ligar Motor esquerdo
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = False'Desligar Motor esquerdo
WriteToReg
Delay (200) 'Dele de 2 segundo
Next
Delay(10000)'PAUSA DE 1 SEGUNDO
For i = 0 To 20 '20 PASSOS
Registers(1) = True 'Ligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(1) = False 'Desligar Motor direito
WriteToReg
Delay(200) 'Delei de 2 Mile Segundos
Registers(2) = True 'Ligar Motor esquerdo
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = False'Desligar Motor esquerdo
WriteToReg
Delay (200) 'Dele de 2 segundo
Next
Dreno_1
End Sub
Private Sub Dreno_1 () 'DRENANDO A ÁGUA
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("DRENANDO 1")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
For i = 0 To 60 'Aguardar 1 Minito
Registers(3) = True 'Ligar Motor do dreno Esperar água baixar
WriteToReg
Delay(600)
Next
For i = 0 To 60'Aguardar 1 Minito
Registers(1) = True 'Ligar Motor esquerdo para exaguar
WriteToReg
Delay(600)
Next
Registers(3) = False 'Desligar Motor do dreno Esperar água baixar
WriteToReg
Registers(1) = False 'Desligar Motor esquerdo para exaguar
WriteToReg
Timer3.Enabled = True'Start Enchimento
End Sub
Private Sub Enchimento() ' Enchendo de água
Timer1.Enabled = False 'Desligar Start Enter
Timer2.Enabled = False 'Desligar Enchimento
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("ENCHENDO ")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
Delay(300)
Registers(4) = True 'Abrir Valvola de Água
WriteToReg
If Sensor_Pres.DigitalRead = False Then 'Esperando encher de agual
Registers(4) = False 'Abrir Valvola de Água
WriteToReg
ENXAGUAR
End If
End Sub
Private Sub ENXAGUAR
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("ENCHAGUAR")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
For i = 0 To 20'20 PASSOS
Registers(1) = True 'Ligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(1) = False 'Desligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = True 'Ligar Motor esquerdo
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = False'Desligar Motor esquerdo
WriteToReg
Delay (200) 'Dele de 2 segundo
Next
Delay(10000) 'PAUSA DE 1 SEGUNDO
For i = 0 To 20'20 PASSOS
Registers(1) = True 'Ligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(1) = False 'Desligar Motor direito
WriteToReg
Delay(200) 'Delei de 2 Mile Segundos
Registers(2) = True 'Ligar Motor esquerdo
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = False'Desligar Motor esquerdo
WriteToReg
Delay (200) 'Dele de 2 segundo
Next
Registers(8)= True ' Abrir Valvola do Amaciante
WriteToReg
Registers(3) = False 'Desligar Motor do dreno Esperar água baixar
WriteToReg
Registers(1) = False 'Desligar Motor esquerdo para exaguar
WriteToReg
Dreno_2
End Sub
Private Sub Dreno_2
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("DRENANDO 2")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
For i = 0 To 60
Registers(3) = True 'Ligar Motor do dreno Esperar água baixar
WriteToReg
Delay(600)
Next
For i = 0 To 60
Registers(1) = True 'Ligar Motor esquerdo para exaguar
WriteToReg
Delay(600)
Next
Registers(8) = False ' Desligar Valvola do Amaciante
WriteToReg
Registers(3) = False 'Ligar Motor do dreno
WriteToReg
Registers(1) = False 'Ligar Motor esquerdo
WriteToReg
Centrifugar
End Sub
Private Sub Centrifugar()
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("CENTRIGUGAR")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
For i = 0 To 60'60 PASSOS
Registers(3) = True 'Ligar Motor do dreno Esperar água baixar
WriteToReg
Delay(600)
Next
For i = 0 To 60'60 PASSOS
Registers(1) = True 'Ligar Motor esquerdo para exaguar
WriteToReg
Delay(600)
Next
Registers(1) = False 'Desligar Motor direito
WriteToReg
Registers(3) = False 'Desligar Motor dreno
WriteToReg
Registers(3) = False 'Desligar Motor esquerdo
WriteToReg
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("TERMINDAO")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("A TE LOGO..")
ssd.Display
For I = 0 To 5 'LIGAR O BUZZER DEPOIS DE TERMINA A LAVANGEM
Registers(5) = True'Ligar o Buzzer
WriteToReg
Delay(100)
Registers(5) = False'Ligar o Buzzer
WriteToReg
Delay(100)
Next
Delay(6000) 'Aguandar 1 minito
Timer1.Enabled = True 'Voltar para o menu
Timer2.Enabled = False 'Desligar Start Enter
Timer3.Enabled = False 'Desligar Enchimento
Timer4.Enabled = False 'Desligar Dreno
End Sub
Sub Molho_Longo' Botão Start Valvola Molho
Timer1.Enabled = False 'Desligar Start Enter
Timer2.Enabled = False 'Desligar Enchimento
Timer3.Enabled = False 'Desligar Dreno
ssd.ClearDisplay
ssd.GFX.SetCursor(2,0)
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("MOLHO LONGO")
ssd.GFX.SetCursor(2,18)'18
ssd.GFX.ConfigureText(2,ssd.WHITE,False)
ssd.GFX.DrawText("AGUARDE...")
ssd.Display
Delay(300)
Registers(4) = True 'Abrir Valvola de Água
WriteToReg
If Sensor_Pres.DigitalRead = False Then 'Esperando encher de agual
Registers(4) = False 'Abrir Valvola de Água
WriteToReg
MOLHO
End If
End Sub
Private Sub MOLHO()
For i = 0 To 20'20 PASSOS
Registers(1) = True 'Ligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(1) = False 'Desligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = True 'Ligar Motor esquerdo
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = False'Desligar Motor esquerdo
WriteToReg
Delay (200) 'Dele de 2 segundo
Next
Delay(10000) 'PAUSA DE 1 SEGUNDO
For i = 0 To 20'20 PASSOS
Registers(1) = True 'Ligar Motor direito
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(1) = False 'Desligar Motor direito
WriteToReg
Delay(200) 'Delei de 2 Mile Segundos
Registers(2) = True 'Ligar Motor esquerdo
WriteToReg
Delay (200) 'Delei de 2 Mile Segundos
Registers(2) = False'Desligar Motor esquerdo
WriteToReg
Delay (200) 'Dele de 2 segundo
Next
For I = 0 To 60
Delay(600)
Delay(600)
Next
Timer4.Enabled = False 'Botão Start Valvola Molho
Lavagem_Normal
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) = False 'True = NO
i = i - 1
WriteToReg
Loop
End Sub