Ir ao conteúdo
  • Cadastre-se

ESP8266 - A Pequena Maravilha para Comunicação WIFI


aphawk

Posts recomendados

@rodrigocirilo Esse seu supervisório já tem implementado essa parte do server? Ele fica escutando em uma porta como se fosse um webserver?

 

Geralmente com os ESPs costuma-se fazer o contrário, o ESP é quem é o servidor e recebe os comandos de outros sistemas dando a resposta, mas claro, ele(ESP) também pode ser o cliente que se conecta no servidor e checa alguma coisa.

 

 

Link para o comentário
Compartilhar em outros sites

Em 13/04/2017 às 18:16, lucianolcoa disse:

Pelo que eu entendi você quer fazer o arduino "conversar" com algum programa feito em c certo? ou nodemcu ou o que tiver :)

 

Então, a comunicação é sempre serial, sei como fazer em java e em python, agora outras linguagens ficarei devendo. Por mais que arduino seja parecido com C, ele não é C,e PIC também

 

Mas... no python é assim que você faz comunicação serial, no java e relativamente parecido. No C eu não sei mas algum manjão de C deve saber. Ahe depende do que o programa que você fez na linguagem X é capaz de fazer, o que ele faz entendeu....

 

Por exemplo, voltando ao código python que escrevi, você pode fazer uma coisa legal olha:

import serial

import time

tempo=0

comunica=serialSerial('COMX',9600)

arquivo=open("dados.txt",'w')

ler1=[]

ler2=[]

ler= comunica.readline()

 

print(ler)

time.sleep(2)

tempo=tempo+1

if ler1!=ler:

     ler2.append(ler)

     ler1=ler

     ler2.append(tempo)

    arquivo.write(ler2)

if ler== "sua condi":

     comunica.write("o que deseja")

Luciano agradeço a atenção e o codigo exemplo..

 

porém não quero comunicação serial, quero que o nodemcu se conecte na rede wifi e um pc na mesma rede(ou não) contendo o supervisório irá se comunicar via tcpip.

 

Eu achei um video no youtube de um exemplo de um server e client na mesma solution.. e fiz algumas adaptações, consegui fazer comunicar usando um app (android) que faz o papel do client..

 

Enfim.. vou comprar umas apostilas dedicadas ao assunto e ver se me ajuda..

adicionado 3 minutos depois
Em 13/04/2017 às 21:22, ViniciusKruz disse:

@rodrigocirilo Esse seu supervisório já tem implementado essa parte do server? Ele fica escutando em uma porta como se fosse um webserver?

 

Geralmente com os ESPs costuma-se fazer o contrário, o ESP é quem é o servidor e recebe os comandos de outros sistemas dando a resposta, mas claro, ele(ESP) também pode ser o cliente que se conecta no servidor e checa alguma coisa.

 

 

Olá Vinicius, na verdade tenho o codigo pronto para comunicar por serial(que é o que uso atualmente) mas ainda não consegui implementar a parte de TCPIP no C#. Apesar que, conforme respondi ao Luciano, vi um video que ajudou a ter um norte para fazer uns testes..

 

No caso, o supervisório será o server, pois vários client´s (ESP´s) irão se conectar a ele. e sim é indicando um IP e PORTA.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Terminei a minha versão final do programa para fazer a calibração do DS3231 (sincronizo usando uma interrupção pelo DS3231 para conseguir máxima precisão), e mais algumas coisas como acessar um BME280 mostrando o resultado por um LCD I2C 20 x 4. Consigo uma ótima precisão e não mais dependo da serial, a não ser para atualizar o programa, dá para fazer tudo pela página WEB. A página é bem simples mas funciona direito fornecendo todas as informações sobre a operação de sincronismo. O programa é bem didático, e até serve para avaliar a precisão do cristal do ESP8266, no que estou testando está em 6,7ppm (a precisão do DS3231 está em 0,05ppm depois de calibrado), em outra temperatura ambiente provavelmente deve ficar diferente, programei o DS3231 para disparar uma interrupção a cada segundo e a variável micros() é incrementada em exatos 999993,3 microssegundos com precisão cada vez, ela não está sujeita a atrasos ou outros fenômenos.

 

A última versão está abaixo compilado pelo Arduino Ide versão 1.8.1 .

 

 

Agora está na hora de partir para outra coisa, como por exemplo um variador de potência usando triac controlado pela rede wifi (celular e outros), vai dar trabalho e vou ter que aprender sobre estes protocolos que existem de comunicação, que vocês já dominam e eu ainda não entendo.

 

Já estou com um kit com um ESP32 em mãos agora só falta um ambiente para experimentar programar o bicho. E quem sabe eu volte a tentar usar o Atom na programação.

 

Não tive nenhum problema em colocar uma variável signed char (ou byte) na EEPROM e ler ela corretamente mesmo com números negativos, sem precisar de gambiarras.

 

Teste3.zip

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@rodrigocirilo  Pelo que pude experimentar do ESP como cliente, eu não achei muito satisfatório, no meu caso eu fiz o teste assim: o ESP se conectava ao meu site(www.meusite.com.br/pagina.php) e enviava certos dados ou lia certas variáveis, até aí tudo bem caso o servidor esteja online e respondendo rápido, o problema é o tempo gasto, se acontecer do servidor não estar respondendo no momento(offline) por padrão o ESP fica travado nesta espera por cerca de 4 segundos ou seja, se tiver alguma função esperando pode ficar prejudicada. Eu consegui configurar essa espera em 1 segundo, se o servidor não responder, encerra a comunicação. Se esse tempo for um problema para você, talvez a solução seja diferente: colocar o ESP como server e conectado a uma rede wifi qualquer, sempre executando as tarefas corriqueiras dele e sempre escutando uma porta qualquer,  daí seu supervisório simplesmente envia o pacote ao ESP que responderá de imediato. Isto te resolveria além do problema do delay da espera como ainda facilitaria para você alterar seu supervisório, ao invés deste ficar sempre aguardando um ESP para dar um comando, ele já envia de imediato este tal comando que será interpretado rapidamente também seria mais viável porque é muito mais fácil implementar no seu supervisório uma rotina onde ele envia dados para um servidor qualquer(ESP) que criar uma rotina para fazer dele um servidor. 

 

Isto que estou te propondo tem muito pouca diferença do que imagino que seu supervisório faça hoje de modo serial, imagina a cena, seu supervisório precisa saber um valor de uma variável em um dispositivo serial, o que ele faz? envia a este dispositivo o pedido deste valor e recebe a resposta, ou então, seu supervisório precisa ligar um led em um dispositivo serial: ele simplesmente manda o comando e pronto, o dispositivo responde com o led. Então! com o ESP como servidor é o mesmo princípio, o que muda é só que ao invés de seu supervisório dizer "serial.escreva(dado)" vai dizer "servidor.escreva(dado)".

 

 

adicionado 6 minutos depois

@Intrudera6 Parabéns pelo empenho/dedicação.

 

Já fizemos alguns tutoriais aqui como é de seu conhecimento, faça um explicando o uso desse sistema que você criou, o que acha?

 

Esses dias até entrei em contato com o moderados deste fórum para que ele encontrasse uma forma de aproveitar mais esses tutoriais porque nem os meus eu não estou mais conseguindo encontrar, estão todos se perdendo e ele me disse que era pra fazer uma lista que ele iria colocar eles em uma pasta nomeada de tópicos importantes. Publica o seu em forma de tutorial para que possa ficar tudo guardado. Ou se não quiser criar um tutorial, pelo menos divulga ele aqui no fórum(Programação de microcontroladores), já resolveria.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
12 horas atrás, ViniciusKruz disse:

Eu consegui configurar essa espera em 1 segundo, se o servidor não responder, encerra a comunicação.

 

Como?

 

12 horas atrás, ViniciusKruz disse:

uma forma de aproveitar mais esses tutoriais porque nem os meus eu não estou mais conseguindo encontrar, estão todos se perdendo

 

Um tópico listando todos? Poderia ser todos mesmo, não apenas os seus.

Link para o comentário
Compartilhar em outros sites

13 horas atrás, ViniciusKruz disse:

@rodrigocirilo  Pelo que pude experimentar do ESP como cliente, eu não achei muito satisfatório, no meu caso eu fiz o teste assim: o ESP se conectava ao meu site(www.meusite.com.br/pagina.php) e enviava certos dados ou lia certas variáveis, até aí tudo bem caso o servidor esteja online e respondendo rápido, o problema é o tempo gasto, se acontecer do servidor não estar respondendo no momento(offline) por padrão o ESP fica travado nesta espera por cerca de 4 segundos ou seja, se tiver alguma função esperando pode ficar prejudicada. Eu consegui configurar essa espera em 1 segundo, se o servidor não responder, encerra a comunicação. Se esse tempo for um problema para você, talvez a solução seja diferente: colocar o ESP como server e conectado a uma rede wifi qualquer, sempre executando as tarefas corriqueiras dele e sempre escutando uma porta qualquer,  daí seu supervisório simplesmente envia o pacote ao ESP que responderá de imediato. Isto te resolveria além do problema do delay da espera como ainda facilitaria para você alterar seu supervisório, ao invés deste ficar sempre aguardando um ESP para dar um comando, ele já envia de imediato este tal comando que será interpretado rapidamente também seria mais viável porque é muito mais fácil implementar no seu supervisório uma rotina onde ele envia dados para um servidor qualquer(ESP) que criar uma rotina para fazer dele um servidor. 

 

Isto que estou te propondo tem muito pouca diferença do que imagino que seu supervisório faça hoje de modo serial, imagina a cena, seu supervisório precisa saber um valor de uma variável em um dispositivo serial, o que ele faz? envia a este dispositivo o pedido deste valor e recebe a resposta, ou então, seu supervisório precisa ligar um led em um dispositivo serial: ele simplesmente manda o comando e pronto, o dispositivo responde com o led. Então! com o ESP como servidor é o mesmo princípio, o que muda é só que ao invés de seu supervisório dizer "serial.escreva(dado)" vai dizer "servidor.escreva(dado)".

 

 

Manolo você tem algum código de atualização de hora via json? algo assim. Tava querendo implementar isso no esp ,nodemcu :P

Link para o comentário
Compartilhar em outros sites

9 minutos atrás, lucianolcoa disse:

tava querendo que o esp funcionasse como um timer pra desligar um rele numa hora especifica.

Eu cheguei a fazer algo parecido em LUA (antes de me desiludir com o LUA no ESP8266), se eu procurar talvez eu consiga achar alguma coisa, só não vou poder fazer isso agora, talvez a noite, se for isso que você precisa. Mas em C (IDE Arduino) ou Espbasic é só fazer um simples timer usando alguma variável incrementada por interrupção e acertando por servidor SNTP (já estou bem maceteado nisso).

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

55 minutos atrás, Intrudera6 disse:

Eu cheguei a fazer algo parecido em LUA (antes de me desiludir com o LUA no ESP8266), se eu procurar talvez eu consiga achar alguma coisa, só não vou poder fazer isso agora, talvez a noite, se for isso que você precisa. Mas em C (IDE Arduino) ou Espbasic é só fazer um simples timer usando alguma variável incrementada por interrupção e acertando por servidor SNTP (já estou bem maceteado nisso).

Essa é a parte que eu queria, acertar a hora por SNTP, queria um código de exemplo.

Link para o comentário
Compartilhar em outros sites

@lucianolcoa

 

Tenho este código (ntp.lua).

 

return({
	hour=0,
	minute=0,
	second=0,
	lastsync=0,
	--***
	microsec="",
	--***
	ustamp=0,
	tz=-3,
	udptimer=2,
	udptimeout=1000,
	--ntpserver="194.109.22.18",
	ntpserver="139.82.34.44", -- servidor SNTP ntp.puc-rio.br
	--***
	--sai_payload="",
	
	--***
	sk=nil,
	sync=function(self,callback)
		local request=string.char( 227, 0, 6, 236, 0,0,0,0,0,0,0,0, 49, 78, 49, 52,
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		)
		self.sk=net.createConnection(net.UDP, 0)
		self.sk:on("receive",function(sck,payload) 
			sck:close()
			self.lastsync=self:calc_stamp(payload:sub(41,44))
			--***
			self.microsec=payload:sub(45,48)
			--self.sai_payload = payload
			--***
			self:set_time()
			if callback and type(callback) == "function" then 
				callback(self)
			end
			collectgarbage() collectgarbage()
		end)
		self.sk:connect(123,self.ntpserver)
		tmr.alarm(self.udptimer,self.udptimeout,0,function() self.sk:close() end)
		self.sk:send(request)
	end,
	calc_stamp=function(self,bytes)
		local highw,loww,ntpstamp
		highw = bytes:byte(1) * 256 + bytes:byte(2)
		loww = bytes:byte(3) * 256 + bytes:byte(4)
		ntpstamp=( highw * 65536 + loww ) + ( self.tz * 3600)	-- NTP-stamp, seconds since 1.1.1900
		self.ustamp=ntpstamp - 2208988800 		-- UNIX-timestamp, seconds since 1.1.1970
		return(self.ustamp)
	end,
	set_time=function(self)
		self.hour = self.ustamp % 86400 / 3600
		self.minute = self.ustamp % 3600 / 60
		self.second = self.ustamp % 60
	end,
	show_time=function(self)
		return(string.format("%02u:%02u:%02u",self.hour,self.minute,self.second))
	end,
	run=function(self,t,uinterval,sinterval,server)
		if server then self.ntpserver = server end
		self.lastsync = sinterval * 2 * -1	-- force sync on first run
		tmr.alarm(t,uinterval * 1000,1,function()
			self.ustamp = self.ustamp + uinterval
			self:set_time()
			if self.lastsync + sinterval < self.ustamp then
				self:sync()
			end
		end)
	end
})

ntp-run.lua

-- ntp-run.lua
hora = 0
min = 0
seg = 0
cent = 0

dia = 1
mes = 1
ano = 2015
dsem = 1
lastsync = 0
ustamp = 0
ustamp_ant = 0
inicio = 0

function sincroniza()
  inicio = tmr.now()
  loadfile("ntp.lc")():sync(function(TIME)
    --***
    cent = math.floor(string.byte(TIME.microsec,1) / 2.56)
    --***
    print("hora = ".. TIME:show_time().. ",".. string.format("%02d", cent))
    hora = math.floor(TIME.hour)
    min = math.floor(TIME.minute)
    seg = TIME.second
    --cent = 0
    lastsync = TIME.lastsync
    ustamp = TIME.ustamp
    --sai_payload = TIME.sai_payload
    print(string.format("Tempo decorrido = %6f seg",(tmr.now() - inicio) / 1e6))
    --print("Tamanho Payload = ".. string.len(sai_payload))
    --**print("sai_payload (".. sai_payload.. ")")
    --file.open("arqpayload.txt","w+")
    --file.write(sai_payload)
    --file.flush()
    --file.close()
    TIME=nil
    package.loaded["ntp.lc"]=nil
    collectgarbage() collectgarbage()
    print((collectgarbage("count") * 1024).. "bytes node.heap() = ".. tostring(node.heap()))
  end)
end

sincroniza()
-- Relógio

tmr.alarm(4, 10, 1, function()
  if ustamp_ant ~= ustamp then
    if calend == nil then
      require("calend")
    end
    hora, min, seg, dsem, dia, mes, ano = calend.ustamp_dh(ustamp)
    ustamp_ant = ustamp
  end
  if cent < 99 then
    cent = cent + 1
  else
    cent = 0
    if seg < 59 then
      seg = seg + 1
      if seg % 10 == 0 then sincroniza() end
    else
      seg = 0
      if min < 59 then
        min =  min + 1
      else
        min = 0
        if hora < 23 then
          hora =  hora + 1
        else
          hora = 0
          dia, mes, ano = calend.incdia(1, dia, mes, ano)
          if dsem < 7 then
            dsem = dsem + 1
          else
            dsem = 1
          end
          --sincroniza() -- sincroniza às 0:00:00
        end
      end
    end
  end    
end)

tmr.alarm(5, 10, 1, function()
  if cent == 0 then
    tmr.stop(5)
    tmr.alarm(5, 1000, 1, function()
      if hora ~= "" then
        print(string.format("%02d:%02d:%02d,%02d     ",hora, min, seg, cent)..
          calend.dsemana[dsem].. string.format(", %02d/%02d/%04d", dia, mes, ano))
        if cent < 10 then
          print("lastsync = ".. tostring(lastsync).. "  ustamp = ".. tostring(ustamp)
            .. " ".. (collectgarbage("count") * 1024).. "bytes  node.heap() = ".. tostring(node.heap()))
        end
      end
    end)
  end
end)

TIME=nil
package.loaded["ntp.lc"]=nil

calend = nil
package.loaded["calend"]=nil

calend.lua

--------------------------------------------------------------------------------
-- calend.lua
--------------------------------------------------------------------------------
local moduleName = ...
local M = {}
_G[moduleName] = M

M.meses = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
M.ndias = { 0, 31, 59, 90,120,151,181,212,243,273,304,334}
M.dsemana = {"domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"}
M.nomemes = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho"
  , "agosto", "setembro", "outubro", "novembro", "dezembro"}

-- é dia bissexto ?
function M.bissexto(ent_ano)
  if (ent_ano % 4 == 0) and (ent_ano % 100 ~= 0 or ent_ano % 400 == 0) then
    return 1
  else
    return 0
  end
end

local function mes_bissexto(ent_mes, ent_ano)
  if ent_mes > 2 then
    return M.bissexto(ent_ano)
  else
    return 0
  end
end

-- numero de dias de 01/01/0001 ate a data informada
function M.numdias(ent_dia, ent_mes, ent_ano)
  ent_ano = ent_ano - 1
  return math.floor(ent_ano / 4) - math.floor(ent_ano / 100) 
    + math.floor(ent_ano / 400) + ent_ano * 365 + M.ndias[ent_mes]
    + mes_bissexto(ent_mes, ent_ano + 1) + ent_dia
end

-- diferenca entre datas (1. data - 2. data)
function M.DiasEntreDatas(ent_dia1,ent_mes1,ent_ano1, ent_dia2,ent_mes2,ent_ano2)
  return M.numdias(ent_dia1, ent_mes1, ent_ano1) - M.numdias(ent_dia2, ent_mes2, ent_ano2)
end

-- dia da semana (1 para domingo)
function M.diasemana(ent_dia, ent_mes, ent_ano)
  -- 04/01/1970 é domingo
  local saida = (M.DiasEntreDatas(ent_dia, ent_mes, ent_ano, 4, 1, 1970) ) % 7
  if saida < 0 then
    saida = saida + 8
  else
    saida = saida + 1
  end
  return saida
end

-- incrementa uns poucos dias e calcula nova data
function M.incdia(inc, ent_dia, ent_mes, ent_ano)
  ent_dia = ent_dia + inc
  local bissexto_aux = 0
  if ent_mes == 2 then
    bissexto_aux = M.bissexto(ent_ano)
  end
  if ent_dia < 1 or ent_dia > M.meses[ent_mes] + bissexto_aux then
    if ent_dia < 1 then
      if ent_mes > 1 then
        ent_mes = ent_mes - 1
        bissexto_aux = 0
        if ent_mes == 2 then
          bissexto_aux = M.bissexto(ent_ano)
        end
        end_dia = M.meses[ent_mes] + bissexto_aux + ent_dia
      else
        ent_mes = 12
        ent_ano = ent_ano - 1
        ent_dia = M.meses[ent_mes] + ent_dia
      end
    else
      if ent_mes < 12 then
        ent_dia = ent_dia - (M.meses[ent_mes] + bissexto_aux)
        ent_mes = ent_mes + 1
      else
        ent_ano = ent_ano + 1
        ent_dia = ent_dia - M.meses[ent_mes]
        ent_mes = 1
      end
    end
  end
  return ent_dia, ent_mes, ent_ano
end

-- converte ustamp (data de servidor SNTP da Internet) para data e hora
function M.ustamp_dh(ent_ustamp)
  local num_dias = math.floor(ent_ustamp / 86400)
  
  local hora = math.floor(ent_ustamp % 86400 / 3600)
  local minuto = math.floor(ent_ustamp % 3600 / 60)
  local segundo = ent_ustamp % 60
  
  local ano = math.floor(1970 + num_dias / 365.25)
  
  local mes = math.floor(math.floor(num_dias - (ano - 1970) * 365.25) / 30 + 1)
  if mes < 1 then
    mes = 12
    ano = ano - 1
  elseif mes > 12 then
    mes = 1
    ano = ano + 1
  end
  local dia = math.floor(num_dias - (ano - 1970) * 365.25 - M.ndias[mes] + 1)
    - mes_bissexto(mes, ano)
  if dia < 1 then
    mes = mes - 1
    if mes < 1 then
      mes = 12
      ano = ano - 1
    end
    dia = M.meses[mes]
    if mes == 2 then
      dia = dia + M.bissexto(ano)
    end
  elseif (dia > M.meses[mes] and (mes ~= 2 or M.bissexto(ano) == 0))
    or ((dia > M.meses[mes] + 1) and (mes == 2 and M.bissexto(ano) > 0)) then
    mes = mes + 1
    if mes > 12 then
      mes = 1
      ano = ano + 1
    end
    dia = 1
  end
  
  local num_dias2 = M.DiasEntreDatas(dia,mes,ano,1,1,1970) -- diferença de data e 01/01/1970
  if num_dias ~= num_dias2 then
    dia, mes, ano = M.incdia(num_dias - num_dias2, dia, mes, ano)
  end
  
  return hora, minuto, segundo, M.diasemana(dia,mes,ano), dia, mes, ano
end

return M

 

main.lua

-- main.lua --


-- Connect 
print('\nAll About Circuits main.lua\n')
tmr.alarm(0, 1000, 1, function()
   if wifi.sta.getip() == nil then
      print("Connecting to AP...\n")
   else
      ip, nm, gw=wifi.sta.getip()
      print("IP Info: \nIP Address: ",ip)
      print("Netmask: ",nm)
      print("Gateway Addr: ",gw,'\n')
      tmr.stop(0)
   end
end)

function pisca_led()      
  lighton=0
  pin=4
  gpio.mode(pin,gpio.OUTPUT)
  repeat 
    if cont == 100 then
      cont = 0
      tmr.wdclr() -- reset system watchdog counter.
    else
      cont = cont + 1
    end
  until (wifi.sta.getip() ~= nil) -- testa se conectou

  tmr.alarm(1,500,1,function()
    if lighton==0 then
      lighton=1
      gpio.write(pin,gpio.HIGH)
    else
      lighton=0
      gpio.write(pin,gpio.LOW)
    end
  end)
end

function modula_led()
  duty = 1023 -- LED apagado
  incr = -8 -- tem que ser divisor de 1000 para frenquência de 1Hz, 500 para 2Hz, 250 para 4Hz
  frequencia_led = 1 -- em Hz
  incr_2 = incr / (frequencia_led * 2)
  ciclo = math.abs(incr_2) -- período da interrupção em milesegundos (menor valor é 1 mseg)
  maximo = 1023
  minimo = 23
  frequencia = 1000
  pin=4
  pwm.setup(pin, frequencia, duty)
  pwm.start(pin)
  tmr.alarm(1,ciclo,1, function()
    if (duty >= maximo and incr > 0) or (duty <= minimo and incr < 0) then
      incr = 0 - incr
      incr_2 = 0 - incr_2
    else
      duty = duty + incr
    end
    pwm.setduty(pin, duty)
  end)
end

function testa_rtc()
  tmr.alarm(2,10,1, function()
    contador = contador + 1
    if cont == 99 then
      cont = 0
      print(string.format("RTC = %.6f  Contador = %.2f",((tmr.now()-tini)/1e6),contador/1e2))
    else
      cont = cont + 1
    end
  end)
end

modula_led()
--pisca_led()

contador = 0
cont = 0
tini = tmr.now()
testa_rtc()

 

init.lua

-- init.lua --



function sincroniza()
  tini = tmr.now()
  --if rtctime.get() == 0 then
    sntp.sync(servidor_sntp,
      function(ustamp,usec,server)
        hora, min, seg, dsem, dia, mes, ano = calend.ustamp_dh(ustamp - 10800)
        print('sync '.. string.format("%02d:%02d:%02d,%06d ", hora, min, seg, usec)..
        calend.dsemana[dsem].. string.format(", %02d/%02d/%04d  SNTP = (", dia, mes, ano)..
        server.. ")")
        print(string.format("Tempo decorrido = %6f Seg  Tamanho ocupado = ",(tmr.now() - tini) / 1e6)..
          (collectgarbage("count") * 1024).. " bytes node.heap() = ".. tostring(node.heap()))
      end,
      function()
        print('failed!')
      end
    )
  --end
end


-- Global Variables (Modify for your network)
servidor_sntp = "139.82.34.44" -- servidor SNTP ntp.puc-rio.br
ssid = "seu_WIFI"
pass = "sua_Senha"

-- Configure serial
uart.setup( 0, 115200, 8, 0, 1, 1 )

-- Configure Wireless Internet
print('\nAll About Circuits init.lua\n')
wifi.setmode(wifi.STATION)
print('set mode=STATION (mode='..wifi.getmode()..')\n')
print('MAC Address: ',wifi.sta.getmac())
print('Chip ID: ',node.chipid())
print('Heap Size: ',node.heap(),'\n')
-- wifi config start
wifi.sta.config(ssid,pass)
-- wifi config end

if calend == nil then
  require("calend")
end

tmr.alarm(0,10,1,function()
  if wifi.sta.getip() ~= nil then
    sincroniza()
    tmr.stop(0)
  end
end)
--calend = nil
--package.loaded["calend"]=nil


-- Run the main file
--dofile("main.lua")

 

Estou um pouco enferrujado em lua (faz muito tempo que não programo nada), espero que tenha passado todos os programas (e bibliotecas) que faziam a consulta ao servidor NTP e implementavam um relógio no EDP8266 em lua.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

2 minutos atrás, lucianolcoa disse:

valeu mano. vou da uma olhada, na linguagem ide do arduino você tem algo?: haha não querendo abusar da sua boa vontade. e que iria implementar no código de web server que eu já tenho pronto :D

 

 

O meu programa (passado a poucas linhas atrás) faz algo bem parecido, usando um DS3231, mas tem muitas rotinas úteis de cálculo de data e hora (para Arduino IDE) usando servidor NTP (no meu padrão de precisão). Tenho outras coisas que funcionam sem o RTC DS3231, mas para isso eu teria que procurar, e identificar o programa, o que eu não tenho tempo de fazer agora. No programa exemplo tenho todas as rotinas necessárias e testadas, (por exemplo, captura de data hora em servidor NTP com resolução em microssegundo).

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

4 horas atrás, lucianolcoa disse:

Mano, te amo. valeu mesmo. De coração^^

Isto que você está querendo seria bastante fácil para mim, tenho todas as rotinas necessárias no meu programa de calibração do DS3231, mas neste caso acho que você deveria fazer alguma coisa e escrever algum código. Você tem todas as rotinas auxiliares que eu tive muito trabalho para criar e depurar, agora fica tudo muito mais fácil para você ou qualquer um que queira fazer um programa de relógio ou timer com o ESP8266. E nem precisa de um RTC real, o próprio ESP8266 pode funcionar como um, com um contador 32 bits sem sinal incrementado por interrupção a cada segundo (por exemplo), que no caso do ESP8266 é bastante precisa (ele não perde interrupção nem quando está tentando conectar no WIFI). O cristal meu ESP de teste está com uma precisão de 6,7ppm. E caso falte energia ou ele seja desligado é só fazer uma consulta na Internet usando a rotina de acesso para um servidor NTP para atualizar a hora.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@lucianolcoa

 

Tem várias formas, abaixo tem um exemplo.

 

miles() serve para mostrar um contador que é incrementado a cada milissegundo, ele não gera interrupção.


Para definir uma interrupção por tempo usando a biblioteca Ticker.h (por exemplo)

// Rotina bem básica

#include <Ticker.h> // biblioteca de timers
extern "C" {
#include "user_interface.h"
}
  
uint32_t contador = 0; // contador de segundos (32 bits sem sinal)
boolean flag = false;

Ticker Alarme; // define timer
  
void rotina() {
  contador++; // incrementa 1 no contador de segundos
  flag = true; // sinaliza interrupção
}

void Setup() {
  Serial.begin(115200);  // define serial em 115200 bps
  Alarme.attach_ms(1000, rotina); // define interrupção e executa a cada 1000 milessegundos.
}
  
void loop() {
  if (flag) {
    Serial.println(String(contador));
    flag = false;
  }
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Em 18/04/2017 às 21:29, ViniciusKruz disse:

@rodrigocirilo  Pelo que pude experimentar do ESP como cliente, eu não achei muito satisfatório, no meu caso eu fiz o teste assim: o ESP se conectava ao meu site(www.meusite.com.br/pagina.php) e enviava certos dados ou lia certas variáveis, até aí tudo bem caso o servidor esteja online e respondendo rápido, o problema é o tempo gasto, se acontecer do servidor não estar respondendo no momento(offline) por padrão o ESP fica travado nesta espera por cerca de 4 segundos ou seja, se tiver alguma função esperando pode ficar prejudicada. Eu consegui configurar essa espera em 1 segundo, se o servidor não responder, encerra a comunicação. Se esse tempo for um problema para você, talvez a solução seja diferente: colocar o ESP como server e conectado a uma rede wifi qualquer, sempre executando as tarefas corriqueiras dele e sempre escutando uma porta qualquer,  daí seu supervisório simplesmente envia o pacote ao ESP que responderá de imediato. Isto te resolveria além do problema do delay da espera como ainda facilitaria para você alterar seu supervisório, ao invés deste ficar sempre aguardando um ESP para dar um comando, ele já envia de imediato este tal comando que será interpretado rapidamente também seria mais viável porque é muito mais fácil implementar no seu supervisório uma rotina onde ele envia dados para um servidor qualquer(ESP) que criar uma rotina para fazer dele um servidor. 

 

Isto que estou te propondo tem muito pouca diferença do que imagino que seu supervisório faça hoje de modo serial, imagina a cena, seu supervisório precisa saber um valor de uma variável em um dispositivo serial, o que ele faz? envia a este dispositivo o pedido deste valor e recebe a resposta, ou então, seu supervisório precisa ligar um led em um dispositivo serial: ele simplesmente manda o comando e pronto, o dispositivo responde com o led. Então! com o ESP como servidor é o mesmo princípio, o que muda é só que ao invés de seu supervisório dizer "serial.escreva(dado)" vai dizer "servidor.escreva(dado)".

 

 

Ok, estou esperando algumas apostilas chegarem.. quando tiver algo pronto e se enroscar ai dou mais detalhes.. mas suas dicas foram muito boas.. vou deixar anotado aqui..

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Pessoal, preciso de um help. Criei esse código pra manipular um robô via acess point. Ele a funcionando xuxu beleza.

Mas por algum motivo a senha do wi-fi não está funcionando, ele está ligando como acesso livre. Algum help???

#include <EEPROM.h>

#include <ESP8266WebServer.h>
  // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>






boolean invalida=false;
int in1 =D4; //LED do nodeMCU

int in2=D5;
int in3=D0;
int in4=D1;



int botao3=D3;

//Situação do Relê
boolean ligado1 = false;
boolean ligado2=false;
boolean ligado3=false;
boolean ligado4=false;
boolean controle=false;
boolean luzautomatica=false;
boolean internet=false;

int valor=A0;
int valor1=0;

// Estrutura de configuração da EEPROM

const char *password= "teste";
ESP8266WebServer server(80);




void handleRoot()
{
  String state = server.arg("funcao");
  if (state == "car") {
    digitalWrite(in1,HIGH);
    digitalWrite(in2,LOW);
    digitalWrite(in3,HIGH);
    digitalWrite(in4,LOW);
    delay(500);
    digitalWrite(in1,LOW);
    digitalWrite(in2,LOW);
    digitalWrite(in3,LOW);
    digitalWrite(in4,LOW);

   
  }
  if (state=="cart"){
    digitalWrite(in2,HIGH);
    digitalWrite(in1,LOW);
    digitalWrite(in4,HIGH);
    digitalWrite(in3,LOW);
    delay(500);
    digitalWrite(in1,LOW);
    digitalWrite(in2,LOW);
    digitalWrite(in3,LOW);
    digitalWrite(in4,LOW);

    
  }
  if (state=="care"){
    digitalWrite(in1,HIGH);
    digitalWrite(in2,LOW);
    digitalWrite(in3,LOW);
    digitalWrite(in4,HIGH);
    delay(500);
    digitalWrite(in1,LOW);
    digitalWrite(in2,LOW);
    digitalWrite(in3,LOW);
    digitalWrite(in4,LOW);

    
  }
  if(state=="card"){
    digitalWrite(in1,LOW);
    digitalWrite(in2,HIGH);
    digitalWrite(in3,HIGH);
    digitalWrite(in4,LOW);
    delay(500);
    digitalWrite(in1,LOW);
    digitalWrite(in2,LOW);
    digitalWrite(in3,LOW);
    digitalWrite(in4,LOW);

    
  }
  // HTML da pagina principal
  String html = "<html><meta charset='UTF-8' language='pt-br'><title>Eletrônica e utilidades</title><body><center>";
  html+="<style type='text/css' media='all'>body{background-color:#D3D3D3;color:#2F4F4F;width: 90%;}";
  html+=".btn{background-color:#00008B;color:white;font-size:20px;font-family:Arial,Verdana}tn:hover{background-color:white;color:#00008B;font-size:23px}";
  html+=".btn1{background-color:#B0C4DE;color:blue;font-size:20px;font-family:Arial,Verdana}tn1:hover{background-color:#000080;color:white;font-size:23px}";
  html+="</style><h1>Eletrônica e utilidades</h1><div style='background-color:#D3D3D3;color:#00008B;;font-size:23px'><p>carrinho de controle</p>";
  html+="</div><div style='background-color:#191970;color:#191970;width:50%;height:6%;font-size:23px'>";
  html+="</div>";
html+="<div style='background-color:#00008B;color:white;height:60%;width:50%'>";
html +="<div style='background-color:#B0C4DE;color:#F8F8FF;height:60%;width:70%;margin: auto'><br><br><a href='/?funcao=car' class='btn1'>frente</a>";
html+="<br><br><a href='/?funcao=cart' class='btn1'>trás</a>";
 html +="<br><br><a href='/?funcao=care' class='btn1'>esquerda</a><br><br><a href='/?funcao=card' class='btn1'>direita</a>"; 
  
   html +="</div></div></center></body></html>";



  ;
  //Script JS para não abrir uma nova página Bootstrap
  html += "<script language='JavaScript' type='text/javascript'>";
  html += "var a=document.getElementsByTagName('a');";
  html += "for(var i=0;i<a.length;i++)";
  html += "{";
  html += "a[i].onclick=function()";
  html += "{";
  html += "window.location=this.getAttribute('href');";
  html += "return false";
  html += "}";
  html += "}";
  html += "</script>";
  //Fim da instrução
  html += "</center></div>";

  html += "</body></html>";
  // Enviando HTML para o servidor
  server.send(200, "text/html", html);
}



void setup()
{
  pinMode(in1,OUTPUT);
  pinMode(in2,OUTPUT);
  pinMode(botao3,INPUT);
  pinMode(in3,OUTPUT);
  pinMode(in4,OUTPUT);

  

  // Iniciando Serial
  Serial.begin(9600);

   

  // Iniciando EEPROM
  EEPROM.begin(512);


     
  


    
    WiFi.softAP("carrinho",password);//nome da rede e senha do AP
    IPAddress myIP = WiFi.softAPIP();


  // Apresenta dados da conexão
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println("192.168.4.1");
  Serial.print("IP address: ");
  



  // Atribuindo urls para funções
  // Quando não especificado método, uma função trata todos
  server.on("/", handleRoot);
  
  
  server.begin();
  Serial.println("HTTP server started");
  // Apenas informando que servidor iniciou
  Serial.println("HTTP server started");
}

void loop()
{// No loop só precisa dessa função
 server.handleClient();
  }

 

Link para o comentário
Compartilhar em outros sites

 

Eu errei na sintaxe do comando millis(), que é uma variável de 32 bits contadora de milissegundos, eu errei e escrevi miles() , mas não consigo mais editar o meu post anterior (já passou muito tempo). Será que um moderador não poderia editar o meu texto corrigindo isso para que não fique esta informação errada no Fórum ?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...