Ir ao conteúdo

Posts recomendados

Postado

@ViniciusKruz ,

 

Opa, ficou bem legal a montagem !

Gostei da sua ideia de um soquete para plugar direto o conversor usb/serial !

 

Só agora reparei numa coisa : a antena do ESP8266 ficou debaixo de duas baitas trilhas de cobre, sendo que uma é o gnd.

Se tiver dificuldade com a recepção / transmissão do sinal, use a placa com o ESP para cima mesmo !

 

Paulo

  • Curtir 2
Postado
6 minutos atrás, aphawk disse:

Só agora reparei numa coisa : a antena do ESP8266 ficou debaixo de duas baitas trilhas de cobre, sendo que uma é o gnd.

Se tiver dificuldade com a recepção / transmissão do sinal, use a placa com o ESP para cima mesmo !

 

Paulo, bem provável que eu passe a navalha nessa anteninha, eliminando-a e vou colocar uma externa. Caso contrário, você tem toda razão, pode prejudicar a recepção mesmo e ainda mais, a antena original, como está aí muito próxima do GND, poderá até mesmo interferir no sistema, por isto coloquei capacitores de filtro pra todo lado. Mas isto não me preocupa pelo motivo de usar uma externa.

 

Abraço.

  • Curtir 1
Postado

Senhores,

 

Adaptei a biblioteca para o BME280 (primeira tentativa), está dando diversos erros, entre eles logo na linha 36. Como é que eu passo dados para um subrotina em basic ?

 

os erros são :

Error at line 36: Gosub Label not found:[BME280_begin](sda, sck)
Error at line 46: Failed to reach end of input expression, likely malformed input
Error at line 47: Failed to reach end of input expression, likely malformed input
Error at line 48: Failed to reach end of input expression, likely malformed input
Sun Sep 04 14:48:05 2016 
Error at line 51: Failed to reach end of input expression, likely malformed input

error

 

Abaixo o programa:

BME280_ADDRESS = 118 ' 0x76
dim data[32] as integer
dig_T1 = 0
dig_T2 = 0
dig_T3 = 0
dig_P1 = 0
dig_P2 = 0
dig_P3 = 0
dig_P4 = 0
dig_P5 = 0
dig_P6 = 0
dig_P7 = 0
dig_P8 = 0
dig_P9 = 0
dig_H1 = 0
dig_H2 = 0
dig_H3 = 0
dig_H4 = 0
dig_H5 = 0
dig_H6 = 0

' Returns temperature in DegC, resolution is 0.01 DegC. Output value of 5123 equals 51.23 DegC.
' t_fine carries fine temperature as global value
t_fine = 0



'========================================================================================
sda = 0
scl = 2
contador = 0

io(po,2,0) ' acende o led no ESP-1

gosub [BME280_begin](sda, sck)
timesetup(-3,0)
timer 1000, [imprime]

wait

' =======================================================================================


[imprime]
  temperatura = gosub [BME280_readTemperature]
  umidade = gosub [BME280_readHumidity]
  pressao = gosub [BME280_readPressure]
  'gcls
  print time()
  print " Temperatura = " + temperatura + " Umidade = " + umidade + " Pressão = " pressao
  io(po,2,contador & 1) 'pisca o led a cada 2 segundos no ESP-1
  contador = contador + 1
  
end sub


[BME280_writeReg](reg_address as byte, data as byte)
  i2c.begin(BME280_ADDRESS)
  i2c.write(reg_address)
  i2c.write(data)
  i2c.end()
end sub


[BME280_readTrim]
  temp_raw as unsigned long
  var1 as signed long
  var2 as signed long 

  i as int
  data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(0x88)
  i2c.end()
  i2c.requestfrom(BME280_ADDRESS,24)
  if i2c.available() then
    do
      data[i] = i2c.read()
      i = i + 1
    loop while i2c.available()
  end if

  i2c.begin(BME280_ADDRESS)
  i2c.write(0xA1)
  i2c.end()
  i2c.requestfrom(BME280_ADDRESS,1)
  data[i] = i2c.read()
  i = i + 1

  i2c.begin(BME280_ADDRESS)
  i2c.write(0xE1)
  i2c.end()
  i2c.requestfrom(BME280_ADDRESS,7)
  if i2c.available() then
    do
      data[i] = i2c.read()
      i = i + 1
    loop while i2c.available()
  end if

  dig_T1 = (data[1] << 8) Or data[0]
  dig_T2 = (data[3] << 8) Or data[2]
  dig_T3 = (data[5] << 8) Or data[4]
  dig_P1 = (data[7] << 8) Or data[6]
  dig_P2 = (data[9] << 8) Or data[8]
  dig_P3 = (data[11]<< 8) Or data[10]
  dig_P4 = (data[13]<< 8) Or data[12]
  dig_P5 = (data[15]<< 8) Or data[14]
  dig_P6 = (data[17]<< 8) Or data[16]
  dig_P7 = (data[19]<< 8) Or data[18]
  dig_P8 = (data[21]<< 8) Or data[20]
  dig_P9 = (data[23]<< 8) Or data[22]
  dig_H1 = data[24]
  dig_H2 = (data[26]<< 8) Or data[25]
  dig_H3 = data[27]
  dig_H4 = (data[28]<< 4) Or (0x0F And data[29])
  dig_H5 = (data[30] << 4) Or ((data[29] >> 4) And 0x0F)
  dig_H6 = data[31]   
end sub


[BME280_begin](sda as byte, sck as byte)
  'osrs_t as byte
  'osrs_p as byte
  'osrs_h as byte
  'mode as byte
  't_sb as byte
  'filter as byte
  'spi3w_en as byte
  
  'ctrl_meas_reg as byte
  'config_reg as byte
  'ctrl_hum_reg as byte
  
  
  osrs_t = 1             'Temperature oversampling x 1
  osrs_p = 1             'Pressure oversampling x 1
  osrs_h = 1             'Humidity oversampling x 1
  mode = 3               'Normal mode
  t_sb = 5               'Tstandby 1000ms
  filter = 0             'Filter off 
  spi3w_en = 0           '3-wire SPI Disable

  'ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode
  'config_reg    = (t_sb << 5) | (filter << 2) | spi3w_en
  'ctrl_hum_reg  = osrs_h
  
  ctrl_meas_reg = (osrs_t << 5) Or (osrs_p << 2) Or mode
  config_reg    = (t_sb << 5) Or (filter << 2) Or spi3w_en
  ctrl_hum_reg  = osrs_h

  i2c.setup(sda, sck)

  gosub [BME280_writeReg](0xF2,ctrl_hum_reg)
  gosub [BME280_writeReg](0xF4,ctrl_meas_reg)
  gosub [BME280_writeReg](0xF5,config_reg)
  gosub [BME280_readTrim]
end sub


[BME280_compensate_T_int32](adc_T as long) 'retorna signed long
  var1 as long
  var2 as long
  T as long
  
  var1 = ((((adc_T>>3)  (dig_T1<<1))) * dig_T2) >> 11
  var2 = (((((adc_T>>4)  dig_T1) * ((adc_T>>4)  dig_T1)) >> 12) * dig_T3) >> 14
  t_fine = var1 + var2
  T = (t_fine * 5 + 128) >> 8
  BME280_compensate_T_int32 = T
  return
end sub


' Returns pressure in Pa as unsigned 32 bit integer. Output value of 96386 equals 96386 Pa = 963.86 hPa
[BME280_compensate_P_int32](adc_P as long) 'retorna unsigned long
  var1 as long
  var2 as long
  p as unsigned long
  
  var1 = (t_fine>>1)  64000
  var2 = (((var1>>2) * (var1>>2)) >> 11 ) * dig_P6
  var2 = var2 + ((var1*(dig_P5))<<1)
  var2 = (var2>>2)+(dig_P4<<16)
  var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((dig_P2 * var1)>>1))>>18
  var1 =((32768+var1) * (dig_P1))>>15
  if var1 = 0 then
    BME280_compensate_P_int32 = 0
    return ' avoid exception caused by division by zero
  end if
  p = ((1048576 - adc_P) - (var2>>12)) * 3125
  if p < 0x80000000 then
    p = (p << 1) / (var1)
  else
    p = p / var1 * 2
  end if
  var1 = (dig_P9 * ((((p>>3) * (p>>3))>>13)))>>12
  var2 = (((p>>2)) * dig_P8)>>13
  p = p + (var1 + var2 + dig_P7) >> 4
  BME280_compensate_P_int32 = P
  return
end sub


[BME280_readTemperature] 'retorna double 
  temp_raw as unsigned long
  var1 as signed long
  var2 as signed long 

  i as int
  data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(0xfa)
  i2c.end()
  i2c.requestfrom(BME280_ADDRESS,3)
  if i2c.available() then
    do
      data[i] = i2c.read()
      i++
    loop while i2c.available()
  end if
  temp_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)

  var1 = ((((temp_raw >> 3) - (dig_T1<<1))) * (dig_T2)) >> 11
  var2 = (((((temp_raw >> 4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14

  t_fine = var1 + var2

  BME280_readTemperature = ((t_fine * 5 + 128) >> 8) / 100.0
  return
end sub


[BME280_readPressure]'retorna double
  temp_raw as unsigned long
  var1 as signed long
  var2 as signed long 

  i as int
  data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(0xf7)
  i2c.end()
  i2c.requestfrom(BME280_ADDRESS,3)
  if i2c.available() then
    do
      data[i] = i2c.read()
      i++
    loop while i2c.available()
  end if
  pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)

  var1 = ((t_fine)>>1) - 64000
  var2 = (((var1>>2) * (var1>>2)) >> 11) * (dig_P6)
  var2 = var2 + ((var1*(dig_P5))<<1)
  var2 = (var2>>2)+((dig_P4)<<16)
  var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + (((dig_P2) * var1)>>1))>>18
  var1 = ((((32768+var1))*(dig_P1))>>15)
  if var1 = 0 then
    BME280_readPressure = 0
    return
  end if    
  P = ((((1048576)-pres_raw)-(var2>>12)))*3125
  if P < 0x80000000 then
    P = (P << 1) / (var1)   
  else
    P = P / var1 * 2    
  end if
  var1 = ((dig_P9) * ((((P>>3) * (P>>3))>>13)))>>12
  var2 = (((P>>2)) * (dig_P8))>>13
  P = P + ((var1 + var2 + dig_P7) >> 4)
  BME280_readPressure = P / 100.0
  return
end sub


[BME280_readHumidity] 'retorna double
  temp_raw as unsigned long
  var1 as signed long
  var2 as signed long 

  i as int
  data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(0xfd)
  i2c.end()
  i2c.requestfrom(BME280_ADDRESS,3)
  if i2c.available() then
    do
      data[i] = i2c.read()
      i = i + 1
    loop while i2c.available()
  end if
  hum_raw  = (data[0] << 8) | data[1]

  v_x1 = (t_fine - (76800))
  v_x1 = (((((hum_raw << 14) -((dig_H4) << 20) - ((dig_H5) * v_x1)) + 
    (16384)) >> 15) * (((((((v_x1 * (dig_H6)) >> 10) * 
    (((v_x1 * (dig_H3)) >> 11) + (32768))) >> 10) + (2097152)) * 
    (dig_H2) + 8192) >> 14))
  v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (dig_H1)) >> 4))
  if (v_x1 < 0) then
    v_x1 = 0
  end if
  if v_x1 > 419430400 then
    v_x1 = 419430400
  end if
  BME280_readHumidity = (v_x1 >> 12) / 1024.0
  return
end sub

 

  • Membro VIP
Postado

@ViniciusKruz , qual método de impressão em PCB você usa?

adicionado 7 minutos depois
10 horas atrás, ViniciusKruz disse:

[a anteninha do jeito que está, por cima das trilhas da PCB] pode prejudicar a recepção mesmo [...] até mesmo interferir no sistema, por isto coloquei capacitores de filtro pra todo lado

 

Uma plaquinha colada na outra me faz imaginar curtos-circuitos. Não há esse risco?

Postado
7 minutos atrás, alexandre.mbm disse:

qual método de impressão em PCB você usa?

 

Impressão a laser em papel fotográfico, depois é só colocar ele sobre a placa virgem e aquecer sob pressão, no meu caso eu tenho uma prensa térmica dessas de fazer camisetas, eu deixo por 2 minutos a 190º, mas tem muita gente que usa um simples ferro de passar e conseguem resultados muito bons, Nassa minha placa aí, eu fiz somente trilhas grossas, mas dá pra fazer trilhas 0,25mm sem problemas, a qualidade depende diretamente do papel fotográfico, até encontrar o adequado, tem que comprar em várias papelarias diferentes e ir testando até encontrar um que seja bom, ai, sempre que precisar, vai nessa mesma papelaria rsrs

  • Curtir 1
  • Membro VIP
Postado

@ViniciusKruz , agora fiquei animado! Tenho dois tipos de papel fotográfico aqui. A multifuncional a jato-de-tinta está condenada e eu pensei que ia perder até os papéis. Eu sei que ainda precisarei testar se o papel presta para a função, mas pode ser que sim. Tenho de um bem brilhante, escolhido a dedo.  Desse é melhor para o transfer, não é?!

Postado

@alexandre.mbm

Tem que testar, quando o papel é bom, você pode simplesmente  retirar ele com cuidado após esfriar, mas mesmo o papel sendo ruim, tem uma outra técnica pra retirar, só que é mais trabalhoso, você leva a placa com o papel ainda grudado em uma torneira e vai molhando até o papel sair todo. O ideal é encontrar o papel bom. Tem muito vídeo na internete mostrando o processo com ferro de passar, dá uma pesquisada pra você ver.

  • Curtir 1
Postado
3 horas atrás, ViniciusKruz disse:

 

Impressão a laser em papel fotográfico, depois é só colocar ele sobre a placa virgem e aquecer sob pressão, no meu caso eu tenho uma prensa térmica dessas de fazer camisetas, eu deixo por 2 minutos a 190º, mas tem muita gente que usa um simples ferro de passar e conseguem resultados muito bons, Nassa minha placa aí, eu fiz somente trilhas grossas, mas dá pra fazer trilhas 0,25mm sem problemas, a qualidade depende diretamente do papel fotográfico, até encontrar o adequado, tem que comprar em várias papelarias diferentes e ir testando até encontrar um que seja bom, ai, sempre que precisar, vai nessa mesma papelaria rsrs

 

Papel vegetal também resolve, dizem que fica muito bom, mas eu nunca testei.

  • Membro VIP
Postado
18 minutos atrás, Intrudera6 disse:

Papel vegetal também resolve, dizem que fica muito bom, mas eu nunca testei.

 

Na verdade, por que não um "papel transfer laser"?

Parece-me agora, na minha memória falha, que os tutoriais que conheci eram com ele!

  • Curtir 1
Postado
9 minutos atrás, alexandre.mbm disse:

Na verdade, por que não um "papel transfer laser"?

Parece-me agora, na minha memória falha, que os tutoriais que conheci eram com ele!

 

Já testei com tudo o que o que você possa imaginar, nada superou o papel fotográfico, e como te disse antes, nem são todos que dão uma boa transferência. Pra você ter uma ideia, antes do papel fotográfico, o melhor que eu encontrei, foi o o papel adesivo, a gente descarta o lado com a cola e aproveita a parte que normalmente se joga fora, este também deu um resultado ruinzinho, mas superou os outros, inclusive o papel transfer (laser e jato de tinta). Tudo é uma questão de aperfeiçoamento da técnica, a melhor forma que já consegui até hoje foi esta que estou usando, e já testei exaustivamente até chegar aqui, mas valeu a pena, depois vou procurar uma placa que fiz e vou postar a foto dela, trilhas super finas e perfeitas.

Postado
5 minutos atrás, alexandre.mbm disse:

eu nunca entendi o porquê da corrosão não invadir por baixo da pintura.

 

A pintura forma uma camada impermeabilizante, aliás, qualquer coisa pode formar esta camada, até mesmo u rastro de um dedo na placa já prejudica o processo, a placa tem que estar bem limpinha.

 

7 minutos atrás, alexandre.mbm disse:

Uma curiosidade: quando não dava certo, você conseguia reciclar a placa antes de corroê-la errado? Como?

 

Depois de corroído já era, só dá pra reciclar antes da corrosão, no processo de transferência do toner para a placa, se não der certo, se der muita falha nas trilhas, dá pra limpar tudo e recomeçar.

 

  • Curtir 1
Postado
4 minutos atrás, alexandre.mbm disse:

No caso de uma trilha fina, não sei porque a corrosão não acontece por baixo-lateral da pintura

 

Na verdade corroer, corrói, depende da técnica usada, eu uso o percloreto de ferro pra fazer a corrosão e quando ele ta novinho em folha ele corrói muito rápido aí tem que ficar atendo, tem um processo com soda cáustica (eu nunca usei), dizem que a corrosão acontece em questão de segundos, se demorar um pouquinho a mais dizem que a placa sai sem cobre nenhum. O processo com percloreto de ferro é mais lento, quando ele está novinho, leva uns 5 minutos, mas no caso do meu que já está bem usado e precisando trocar, está levando pelo menos meia hora.

 

9 minutos atrás, alexandre.mbm disse:

limpar com o que? Água e detergente? Álcool?

 

Qualquer coisa que consiga diluir o toner, eu uso tiner, mas até com um bombril seco dá pra limpar, mas usando solventes sai rapidinho.

 

  • Curtir 1
Postado

Caramba, to apanhando pra comunicar com p PCF8583, já fiz de tudo e não to entendendo mais nada, no meu projeto, coloquei a comunicação i2c dele ligados nos GPIO 4 e 5, porque nas leituras que fiz, concluí que eram estes dois pinos, mas como não se comunicavam de forma alguma, pesquisei direito e descobri que no meu ESP(12F) a porta i2c está é em GPIO2 (pino 17) e SCLK (pino 14), pois bem, mudei as ligações para estes pinos, eu poderia ter somente reendereçado mas preferi usar o hardware mesmo para evitar confusão, mesmo assim não se comunica de jeito nenhum, como se não bastasse, clock do PCF8583 é de 100khz e não encontrei na documentação do Basic uma função para setar a frequência corretamente e tem ainda a questão do endereço, no datasheet diz que o endereço de gravação é 0xA0 (160) e leitura é 0xA1 (161), e eu fiz um scaner com o arduíno e ele detectou o PCF no endereço 0x50(80) mas não dá certo de jeito nenhum. Segue abaixo o código que estou usando, talvez olhando fica mais fácil de entender onde estou errando:

 

msgbranch [mybranch]
print "Mensagens ativas"

let addressRead = 80  '160 
let addressWrite = 81 '161 


delay 10

wait


[mybranch]

i2c.begin(addressRead) 'start another transaction
i2c.write(0) 'point to the seconds address location
i2c.write(128)
i2c.write(0)
i2c.write(0)
i2c.write(82) '0x52
i2c.write(21) '0x15 
i2c.write(48) '0x30
i2c.write(8)  '0x08

i2c.end() ' Finish the write transaction

i2c.begin(addressRead) 'start another transaction
i2c.write(0) 'point to the seconds address location
i2c.write(0) 'start conunt

i2c.end() ' Finish the write transaction


i2c.requestfrom(addressWrite,7) 'start a transaction to read 7 bytes

nsecs = i2c.read() 'read the seconds
nmins = i2c.read() 'read the minutes
nhrs = i2c.read() 'read the hours
nday = i2c.read() 'read the day of the week
ndate = i2c.read() 'read the day of the month
nmonth = i2c.read() 'read the month
nyear = i2c.read() 'read the year

d = nhrs
gosub [bcd]
tm = f & ":"
d = nmins
gosub [bcd]
tm = tm & f
tm = tm & ":"
d = nsecs
gosub [bcd]
tm = tm & f

d = ndate
gosub [bcd]
da = f
da = da & "/"
d = nmonth
gosub [bcd]
da = da & f
da = da & "/"
d = nyear
gosub [bcd]
da = da & f
tm = tm & chr(32)
tm = tm & da
print tm


MyReturnMsg = "Nenhum comando valido foi recebido"
pinNo = val(msgget("pin"))
pinStatus = val(msgget("stat"))
pinAction = msgget("action")

if pinAction == "po" then
   io(po,pinNo,pinStatus)
   if pinStatus == 0 then
      MyReturnMsg = "Desligado"
      print "Desligado"
   end if
   if pinStatus == 1 then
      MyReturnMsg = "Ligado"
      print "Ligado"
   end if

end if
if pinAction == "pi" then
   MyReturnMsg = io(pi,pinNo)
end if
if pinAction == "pwo" then
   io(pwo,pinNo,pinStatus)
   MyReturnMsg = "good"
end if
if pinAction == "pwi" then 
   MyReturnMsg = io(pwi,pinNo)
end if
if pinAction == "ai" then 
   MyReturnMsg = io(ai)
end if

msgreturn MyReturnMsg
wait


[bcd]
a = d / 16
a = int(a)
a = a + 48
c = a * 16
b = d - c
b = b + 48
e = chr(a)
f = chr(b)
f = e & f
return

 

Datasheet do PCF:

 

http://www.nxp.com/documents/data_sheet/PCF8583.pdf

 

 

 

 

 

 

 

 

 

 

Postado

@Intrudera6 ,

 

Sobre o programa que você postou :

 

No ESP8266Basic ainda não foi implementado o conceito de passar ou receber parâmetros de uma sub-rotina, semelhante à uma função.

 

Não adianta declarar variáveis no início de um label de sub-rotina; também não adianta querer declarar o conteúdo de uma variável com um valor qualquer passado no retorno de uma sub-rotina, tipo A = GOSUB (TESTE)  .

 

Pelo que vi, agora está faltando pouco !

 

 

adicionado 7 minutos depois

@ViniciusKruz

 

Primeiro você tem de ter certeza sobre o hardware. Rode o programa abaixo, ele vai te mostrar os endereços corretos. Enquanto isto aqui não funcionar direitinho, nem se preocupe com o resto.....

 

Ah, modifique o primeiro comando para conferir com os pinos que você está usando, ok ?

 

Sobre a frequência do I2C, o padrão é de 100 Khz mesmo.

 

i2c.setup(4,5)

for address = 1 to 127
 i2c.begin(address)
 stat = i2c.end()

 if stat < 1 then
  'print stat
  wprint "Found I2C device at address: 0x" & hex(address)
  wprint " - > " & address
  wprint " <br>"
 endif

next

wait

 

Paulo

 

  • Curtir 3
Postado
1 hora atrás, aphawk disse:

Primeiro você tem de ter certeza sobre o hardware. Rode o programa abaixo, ele vai te mostrar os endereços corretos. Enquanto isto aqui não funcionar direitinho, nem se preocupe com o resto

 

Paulo, agora sim, deu sinal de vida!! Recebendo as informações de forma desorganizada, mas isso é o de menos, só de ver que tem dados sendo retornados já fico mais tranquilo. Seu programa retornou a porta 0x50 também, como o do arduíno, eu devo ter feito confusão com a conversão de hexadecimal para decimal. 

 

Obrigado pela ajuda.

 

Postado

@ViniciusKruz ,

 

Que bom que deu certo !!!

 

Eu fico doido com essas coisas que acontecem na IDE do Arduíno ( o pior é que o interpretador ESP8266Basic é totalmente escrito na IDE do Arduíno !!!!! ) , de o hardware definir um endereço no datasheet, e no Arduíno funcionar em outro que é a metade .... é um problema que no Bascom nunca acontece.

 

No Fórum do ESP8266Basic tem um exemplo chamado I2C TOOLS ... o cara fez um programa que permite você ler ou enviar os dados que você quiser via I2C, vai mostrando os retornos,  justamente para ir acertando o seu programa.

 

Ah, aproveitando, vai sair uma nova versão do firmware amanhã ou logo depois, que vai ter incluído umas melhorias na função Time() . Dentre elas, uma que eu sugeri, que é a possibilidade de acertar a data e hora diretamente de um servidor NTP, vai facilitar muito e na minha opinião substitui um RTC em muitos casos

 

Paulo.

  • Curtir 2
Postado
8 minutos atrás, aphawk disse:

Ah, aproveitando, vai sair uma nova versão do firmware amanhã ou logo depois

 

A que instalei no ESP que estou usando agora eu baixei novinha, e pra falar a verdade notei uma estabilidade beeem maior, vou aproveitar pra colocar esta nova versão aí assim que sair.

 

10 minutos atrás, aphawk disse:

Que bom que deu certo !!!

 

Alegria de pobre dura pouco!!!, não está comunicando mais... Mas pelo menos agora eu sei que vou ter que mexer no hardware, amanhã vou fazer uma nova bateria de testes pra ver se pode de repente estar havendo alguma interferência e também vou testar com a ferramenta que sugeriu. Mais uma vez, obrigado.

 

  • Curtir 1
Postado
2 horas atrás, aphawk disse:

@Intrudera6 ,

 

Sobre o programa que você postou :

 

No ESP8266Basic ainda não foi implementado o conceito de passar ou receber parâmetros de uma sub-rotina, semelhante à uma função.

 

Não adianta declarar variáveis no início de um label de sub-rotina; também não adianta querer declarar o conteúdo de uma variável com um valor qualquer passado no retorno de uma sub-rotina, tipo A = GOSUB (TESTE)  .

 

Pelo que vi, agora está faltando pouco !

 

Paulo

 

 

Como você já deve ter observado, eu acabei adaptando do datasheet do BME280 e da biblioteca do BME280 que uso no Arduino IDE (aprendi um pouco com isso, mas está sendo um inferno).

 

Descobri a duras penas que a implementação de functions e procedures é meia boca (tosca na minha opinião), mas tem como contornar (as rotinas ficaram cheias de gambiarras mas ainda são uteis).

 

Reescrevi a rotina (antes de você me enviar a resposta e já estava testando desse jeito), mas ainda não está funcionando direito, acho que vou ter ainda muita dor de cabeça com ela até que funcione.

O que eu não gostava do LUA, era entre outras coisas, é não poder controlar as variáveis (escolher inteira, float, long e etc., e agora estou com este mesmo problema no Basic). Agora os erros que estão dando eu sei o que é mais não sei porque a minha rotina não está trazendo os dados corretamente do BME380 (isto vai se arrastar bastante), vou colocar o programa abaixo.

 

Eu tenho algumas perguntas para você que já vem experimentando este Basic há algum tempo.

 

Tem como eu escrever as constantes em hexa como por exemplo 0xA6 ? É chato ter que ficar convertendo para decimal, e muitas vezes para legibilidade do código é bom que os valores possam ficar em Hexadecimal. Acho que este Basic no ESP8266 ainda tem muito que melhorar, mas tem futuro (quem sabe fica bom algum dia), mas com estas limitações atualmente eu me sinto bem desconfortável com ele.

 

Tem como carregar um programa em Basic dentro do outro, como uma especie de macro ?

 


BME280_ADDRESS = 118 ' 0x76
dim data[32) as integer
dig_T1 = 0
dig_T2 = 0
dig_T3 = 0
dig_P1 = 0
dig_P2 = 0
dig_P3 = 0
dig_P4 = 0
dig_P5 = 0
dig_P6 = 0
dig_P7 = 0
dig_P8 = 0
dig_P9 = 0
dig_H1 = 0
dig_H2 = 0
dig_H3 = 0
dig_H4 = 0
dig_H5 = 0
dig_H6 = 0


' Returns temperature in DegC, resolution is 0.01 DegC. Output value of 5123 equals 51.23 DegC.
' t_fine carries fine temperature as global value
t_fine = 0

reg_address = 0
dados = 0
temperatura = 0
umidade = 0
pressao = 0



'========================================================================================
sda = 0  ' ESP-1
scl = 2  ' ESP-1
contador = 0

io(po,2,0) ' acende o led no ESP-1

gosub [BME280_begin]
timesetup(-3,0) ' -3 horas GMT
timer 10000, [imprime]  'executa a cada 5000 ms

wait

' =======================================================================================


[imprime]
  gosub [BME280_readTemperature]
  gosub [BME280_readHumidity]
  gosub [BME280_readPressure]
  'gcls
  print time()
  print " Temperatura = " + temperatura + " Umidade = " + umidade + " Pressão = " pressao
  io(po,2,contador & 1) 'pisca o led a cada 2 segundos no ESP-1
  contador = contador + 1
return



[BME280_writeReg]
  i2c.begin(BME280_ADDRESS)
  i2c.write(reg_address)
  i2c.write(dados)
  stat = i2c.end()
return


[BME280_readTrim]
  temp_raw = 0
  var1 = 0
  var2 = 0

  ind = 0
  'data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(136) ' 0x88
  stat = i2c.end()
  i2c.requestfrom(BME280_ADDRESS,24)
  if i2c.available() > 0 then
    for i = 1 to i2c.available()
      data[ind] = i2c.read()
      ind = ind + 1
    next
  end if

  i2c.begin(BME280_ADDRESS)
  i2c.write(161) ' 0xa1
  stat = i2c.end()
  i2c.requestfrom(BME280_ADDRESS,1)
  data[ind] = i2c.read()
  ind = ind + 1

  i2c.begin(BME280_ADDRESS)
  i2c.write(225) ' 0xe1
  stat = i2c.end()
  i2c.requestfrom(BME280_ADDRESS,7)
  
  if i2c.available() > 0 then
    for i = 1 to i2c.available()
      data[ind] = i2c.read()
      ind = ind + 1
    next
  end if

  dig_T1 = (data[1] << 8) or data[0]
  dig_T2 = (data[3] << 8) or data[2]
  dig_T3 = (data[5] << 8) or data[4]
  dig_P1 = (data[7] << 8) or data[6]
  dig_P2 = (data[9] << 8) or data[8]
  dig_P3 = (data[11]<< 8) or data[10]
  dig_P4 = (data[13]<< 8) or data[12]
  dig_P5 = (data[15]<< 8) or data[14]
  dig_P6 = (data[17]<< 8) or data[16]
  dig_P7 = (data[19]<< 8) or data[18]
  dig_P8 = (data[21]<< 8) or data[20]
  dig_P9 = (data[23]<< 8) or data[22]
  dig_H1 = data[24]
  dig_H2 = (data[26]<< 8) or data[25]
  dig_H3 = data[27]
  dig_H4 = (data[28]<< 4) or (15 and data[29]) 'dig_H4 = (data[28]<< 4) or (0x0f and data[29])
  dig_H5 = (data[30] << 4) or ((data[29] >> 4) and 15) 'dig_H5 = (data[30] << 4) or ((data[29) >> 4) and 0x0f)
  dig_H6 = data[31]
return


[BME280_begin]
  osrs_t = 1             'Temperature oversampling x 1
  osrs_p = 1             'Pressure oversampling x 1
  osrs_h = 1             'Humidity oversampling x 1
  mode = 3               'Normal mode
  't_sb = 5               'Tstandby 1000ms
  t_sb = 3               'Tstandby 250ms
  '0 = 0,5ms; 1 = 62,5ms; 2 = 125ms; 3 = 250ms; 4 = 500ms; 5 = 1000ms; 6 = 10ms; 7 20ms
  filter = 0             'Filter off 
  spi3w_en = 0           '3-wire SPI Disable

  ctrl_meas_reg = (osrs_t << 5) or (osrs_p << 2) or mode
  config_reg    = (t_sb << 5) or (filter << 2) or spi3w_en
  ctrl_hum_reg  = osrs_h

  i2c.setup(sda, scl)

  reg_address = 242 ' 0xF2
  dados = ctrl_hum_reg
  gosub [BME280_writeReg]
  reg_address = 244 ' 0xF4
  dados = ctrl_meas_reg
  gosub [BME280_writeReg]
  reg_address = 245 ' 0xF5
  dados = config_reg
  gosub [BME280_writeReg]
  gosub [BME280_readTrim]
return


[BME280_readTemperature] 'retorna double 
  temp_raw = 0
  var1 = 0
  var2 = 0

  i = 0
  'data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(250) ' 0xfa
  stat = i2c.end()
  i2c.requestfrom(BME280_ADDRESS,3)
  if i2c.available() > 0 then
    for i = 0 to i2c.available() - 1
      data[i] = i2c.read()
    next
  end if
  temp_raw = (data[0] << 12) or (data[1] << 4) or (data[2] >> 4)

  var1 = ((((temp_raw >> 3) - (dig_T1<<1))) * dig_T2) >> 11
  var2 = (((((temp_raw >> 4) - dig_T1) * ((temp_raw>>4) - dig_T1)) >> 12) * dig_T3) >> 14

  t_fine = var1 + var2

  temperatura = ((t_fine * 5 + 128) >> 8) / 100.0
return


[BME280_readPressure]'retorna double
  temp_raw = 0
  var1 = 0
  var2 = 0

  i = 0
  'data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(247) ' 0xf7
  stat = i2c.end()
  i2c.requestfrom(BME280_ADDRESS,3)
  if i2c.available() > 0 then
    for i = 0 to i2c.available() - 1
      data[i] = i2c.read()
    next
  end if
  pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)

  var1 = (t_fine>>1) - 64000
  var2 = (((var1>>2) * (var1>>2)) >> 11) * dig_P6
  var2 = var2 + ((var1*dig_P5)<<1)
  var2 = (var2>>2)+(dig_P4<<16)
  var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((dig_P2 * var1)>>1))>>18
  var1 = (((32768+var1)*dig_P1)>>15)
  if var1 = 0 then
    pressao = 0
    return
  end if    
  P = ((1048576-pres_raw)-(var2>>12))*3125
  if P < 2147483648 then ' P < 0x80000000
    P = (P << 1) / var1   
  else
    P = P / var1 * 2    
  end if
  var1 = (dig_P9 * ((((P>>3) * (P>>3))>>13)))>>12
  var2 = ((P>>2) * dig_P8)>>13
  P = P + ((var1 + var2 + dig_P7) >> 4)
  pressao = P / 100.0
return


[BME280_readHumidity] 'retorna double
  temp_raw = 0
  var1 = 0
  var2 = 0

  i = 0
  'data[8] as unsigned long
  
  i2c.begin(BME280_ADDRESS)
  i2c.write(253) ' 0xfd
  stat = i2c.end()
  i2c.requestfrom(BME280_ADDRESS,3)
  if i2c.available() > 0 then
    for i = 0 to i2c.available() - 1
      data[i] = i2c.read()
    next
  end if
  hum_raw  = (data[0] << 8) | data[1]

  v_x1 = (t_fine - (76800))
  v_x1 = (((((hum_raw << 14) -(dig_H4 << 20) - dig_H5 * v_x1) + 
    (16384)) >> 15) * (((((((v_x1 * dig_H6) >> 10) * 
    (((v_x1 * dig_H3) >> 11) + 32768)) >> 10) + 2097152) * 
    (dig_H2) + 8192) >> 14))
  v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * dig_H1) >> 4))
  if (v_x1 < 0) then
    v_x1 = 0
  end if
  if v_x1 > 419430400 then
    v_x1 = 419430400
  end if
  umidade = (v_x1 >> 12) / 1024.0
return

 

  • Curtir 1
Postado

@Intrudera6 ,

 

Até o momento, só podemos usar base decimal nos números.

 

E não existe suporte para essas "macros"... rodar programas dentro de programas é querer muito no momento !

 

Este Basic é interpretado, e não tem o objetivo de ser um Basic Full-featured , além de tudo é grátis .... acho que temos de conviver com essas limitações.

 

Talvez se o autor resolver fazer um produto profissional, cobrar por isso, até daria para fazer um baita sistema. Mas para isso ele teria de abandonar tudo o que fez usando a IDE do Arduíno. Teria de fazer do zero, usando C ou Asm mesmo. Não vejo nenhuma viabilidade disso, pois logo vai surgir um novo produto substituindo o ESP8266, e teria de reescrever o programa para um novo microprocessador, coisas desse tipo. Ainda mais de graça !

 

Fui ver o programa do Bascom para esse chip BME280, e é bem complicadinho mesmo, tem parte de cálculo que complica muito mesmo usando os recursos enormes de linguagem do Bascom. Imagina fazer essas contas aqui no ESP8266Basic ......  vai ter de quebrar em muitas partes esse cálculo.

 

Para te ajudar nas constantes, você pode declarar elas em hexa como strings, e converter nas contas usando hex() .

 

Eu deixei uma mensagem no Fórum vendo a possibilidade de criarem as funções prontas para o BME280, da mesma maneira que criaram para os DHT . Quem sabe o desenvolvedor topa .....

 

Se eu programasse na IDE do Arduíno, eu mesmo criaria essas funções no ESP8266Basic.... já que o código é Open e existem várias implementações de funções que vieram de libs do Arduíno.

 

 

Paulo

  • Curtir 1
Postado

Teno tido muitas dificuldades pra entender o Basic também, depois de acostumar com a estruturação do C fica complicado ir pra um sistema que não segue um padrão pelo menos parecido, pior é que dentre o que já testei até agora, o que mais deu certo foi o Basic. Até tem C para ESP, mas tudo gira em torno do Linux e tem muito pouca ajuda. Vou terminar de colocar este projeto que está em andamento no Basic pra funcionar e depois que estiver rodando vou fazer una testes com a IDE do arduíno, a estrutura deles é muito parecida com o C ao qual já estou mais familiarizado. Minhas dificuldades com o Basic são como tentei aprender Mickro C para PICs, as funções vem prontas e são imutáveis ao programador. 

  • Curtir 1
Postado

 

@aphawk ,

 

Esta ferramenta I2C TOOLS, tem para rodar em Basic no ESP8266? Não estou conseguindo encontrar. E quando vai sair a nova versão do Basic ? Estou ansioso para testar. Eu também andei tentando criar a minha própria rotina de RTC usando NTP e os timers do ESP8266 (com resolução de microssegundo), mas estou tendo muita dor de cabeça para fazer funcionar direito (sem dar pau), apesar de ter rodado corretamente no Arduino IDE (sem estabilidade e muitos problemas).

 

Eu estou sofrendo com umas travadas quando tento fazer o upload de arquivos .bas, às vezes tenho que desligar e ligar. A estabilidade ainda tem que melhorar um pouco, eu estou me estranhando muito com o interpretador Basic (Alpha 3.0 branch).

 

Acho que talvez acabe ficando mais fácil criar uma versão do basic utilizando a biblioteca do BME280 que uso no IDE Arduino em C. Acho que para mim deve ser também um pouco difícil, ainda sou bem verde, mas deve funcionar com bastante eficiência se eu conseguir, e talvez eles até gostem e repliquem no Basic oficial. Mesmo assim, é um desafio, e tenho também muito interesse em fazer em Basic (acho isto meio masoquista, mas ao funcionar o prazer é maior).

 

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!