import machine, neopixel
from machine import Pin, I2C
#import ssd1306
from network import WLAN, STA_IF
from umqtt.simple import MQTTClient #a umqtt ja faz parte do micropython
from time import sleep_ms
from json import dumps , loads
# topico tem que ser b string?
topico = b'0325/infor/mensagens/gerais/comunic/maria' #mensagens pro lcd que eu publico
topicoM = b'0325/infor/calafate/dwaekki/maria'
topicoV = b'0325/infor/mensagens/gerais/comunic/vinicius' #as tentativas que ele vai mandar
t_inicio = b'0325/infor/mensagens/inicio/comunic/vinicius/maria/aceitar/jogar'
t_cancela = b'0325/infor/mensagens/gerais/comunic/vinicius/maria/cancelar/jogo'
top = b'jogo/senha/maria/vinicius' #envio o R
# precisa criar um tópico de mensagens gerais, um que eu publico e um que o vinícius publica
# criar um objeto do tipo cliente
#definir a função de callback
#conectar
def CanWeGoBack (t,c):
if t == topicoV:
tentaasorte = c.decode() # tentativa do vinicius
senharealoficial = senha.copy() # senha que eu gerei
r = ['','','','']
tas = tentaasorte
sro = senharealoficial
for i in range [4]:
if tas [i] == sro [i]:
r [i] = 0
# o vinícius vai entender como: "np1[i] = listaCor[7]" #'tem e é aqui' / 'luz azul'
elif tas [i] not in sro:
r [i] = 2
#"np1[i] = listaCor[6]" #'existe mas em outro lugar' / 'luz rosinha'
else:
# tem que colocar alguma situação para evitar duplicatas (copiar a senha e substituir elementos)
#copiasenha = senha.copy()
r[i] = 1
#"np1[i] = off" #'errou feio' / 'o led nao acende'
msg = (''.join(r)).encode()
cliente.publish (top, msg)
# publish r
elif topico == t_inicio:
proposta = msg.decode()
if proposta == 1:
oled.fill(0)
oled.text('Convite aceito!', 5, 2)
global estado
estado = 0
elif proposta == 2:
oled.fill(0)
oled.text('Convite para jogar', 5, 2)
elif topico == t_cancela:
desistir = int(msg.decode())
if desistir == 1:
oled.fill(0)
oled.text('Jogador desistiu', 5, 2)
np1[0] and np1[1] and np1[2] and np1[3] == listaCor[6]
estado = 1
'''
js = int(c.decode())
print(js)
if js == 0:
print("Aé")
if js == 1:
print("Ganhou")
'''
elif t == topicoM:
pass
led = neopixel.NeoPixel(machine.Pin(18),4)
B1 = Pin(25, Pin.IN, Pin.PULL_DOWN)
B2 = Pin(26, Pin.IN, Pin.PULL_DOWN)
B3 = Pin(27, Pin.IN, Pin.PULL_DOWN)
B4 = Pin(14, Pin.IN, Pin.PULL_DOWN)
b = [0,0,0,0]
bAnt = [0,0,0,0]
pino = [B1, B2, B3, B4]
senha = [ 0, 0, 0, 0]
Bconfirma = Pin(15, Pin.IN, Pin.PULL_DOWN)
Bcancela = Pin(19, Pin.IN, Pin.PULL_DOWN)
cancelaAnt = 0
confirmaAnt = 0
i2c = I2C(0, scl=Pin(21), sda=Pin(22))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
#antes: criar a lista de cores
vermelho = (255,0,0)
verde = (0,255,0)
azul = (0,0,255)
amarelo = (255,255,0)
rosa = (255,0,73)
laranja = (255,202,86)
r_claro = (255,80,80)
a_claro = (0,0,128)
tuplaCor = (vermelho,verde,azul,amarelo,rosa, laranja, r_claro, a_claro)
#led = NeoPixel (Pin(18, Pin.OUT),4)
led[0] = tuplaCor[0]
led[1] = tuplaCor[0]
led[2] = tuplaCor[0]
led[3] = tuplaCor[0]
#conectar à rede
def conectaWifi (rede, senha):
wifi = WLAN(STA_IF)
wifi.active(True)
if not wifi.isconnected():
#no que ativar o wifi ele vai tentar se conectar no ultimo wifi que se conectou
#se nao conseguiu se conectar, ele vai forçar a ativação
wifi.connect(rede, senha)
tentativas=0
while not wifi.isconnected ():
sleep_ms(1000) # "atrasa" um pouquinho até conseguir conectar
tentativas += 1
return wifi if wifi.isconnected() else None
internet = conectaWifi ('Wokwi-GUEST', '')
if not internet:
machine.reset()
#last will avisar que deu empate
#conectar ao broker
cliente = MQTTClient('ESP32marmax0325','broker.hivemq.com' )#cada um tem que ter o seu, nao pode ter dois com o mesmo client id
# client id / endereço do broker
cliente.set_callback(CanWeGoBack)
# criou o objeto mqqtclient que ta vinculado a esse broker, se quiser mudar o broker tem que criar outro objeto
cliente.connect()
cliente.subscribe(topicoV)
cliente.subscribe(topico)
# inscrever nos canais : cliente.subscribe()
# usar encode e decode para passar e receber
estado = 0 # 0 = modo definir senha 1 = modo jogo
while True:
cliente.check_msg()
msg_0 = "0"
msg_1 = "1"
msg_2 = "2"
b[0] = B1.value()
b[1] = B2.value()
b[2] = B3.value()
b[3] = B4.value()
confirma = Bconfirma.value()
cancela = Bcancela.value()
if estado == 0:
#modo definir senha
for p in range (4):
#b[p] = pino[p].value()
if b[p] != bAnt[p]:
if b[p] == 1:
senha[p]= (senha[p]+1)%6
led[p] = tuplaCor[senha[p]] #indexação de cores
bAnt[p] = b[p]
led.write()
if confirma != confirmaAnt:
if confirma == 1:
cliente.publish(topicoV, msg_0.encode())
confirmaAnt = confirma
if cancela != cancelaAnt:
if cancela == 1:
cliente.publish(topicoV, msg_1.encode())
cancelaAnt = cancela
# quando apertar o botao do ok, estado = 1
#quando apertar ok, pode entrar no: modo jogo
#PUBLICAR AS SENHAS QUE VOU CRIAR:
#msg = mensagem.encode()
#cliente.publish (t, msg)
#modo jogo
if estado == 1:
pass
"""
receber as tentativas, fazer decode delas e aí comparar
tentaasorte = # tentativa do vinicius
senharealoficial = # senha que eu gerei
r = ['','','','']
tas = tentaasorte
sro = senharealoficial
for i in range [4]:
if tas [i] == sro [i]:
r [i] = 'tem e é aqui' / 'luz azul' #np1[i] = listaCor[6]
etc etc .publish "tem e é aqui" e aí o vini coloca esse codigo no dele
elif tas [i] not in sro:
r [i] = 'existe mas em outro lugar' / 'luz rosinha'
else:
# tem que colocar aguma situação para evitar duplicatas
r[i] = 'errou feio' / 'o led nao acende'
"""
if estado == 2:
oled.fill(0)
oled.text('fim de jogo', 15, 5)
oled.show()
#se tentativa>8
# mandar o lcd dizer que game over
#ou se senha quebrada
#mandar o lcd dizer que ganhou
# tentativabruta = "[0,1,2,3]"
# tentativa = json.loads(tentativabruta)
#resultadobruto = json.dumps (resultado)
# resultado vai ser o "preto azul rosa preto"
#colocar o mesmo significado nos dois codigos!!!!!!!!
# como é a estrutura de topico
# b' string'
# qual a sintaxe de subscriber