# AQUARIOFILIA MARINHA > DIY - Faça Você Mesmo >  Arduino - o Desafio

## Nuno Prazeres

Ora bem...

Como alguns saberão estou em processo de construção duma calha mista de leds e T5.

Uma das enormes vantagens dos leds é permitirem a regulação de intensidade luminosa por via electrónica de forma relativamente simples e controlável.

Claro que esta possibilidade surge logo que se faz um projecto destes.

O Arduino é um equipamento electrónico que naturalmente surge associado a este controlo ao permitir uma programação de alcance praticamente ilimitado com entradas e saídas de várias formas e feitios.

Se a versatilidade é inquestionável, o preço então torna-o incontornável.

Por isso, apesar de avisos do tipo: "nem imaginas onde te estás a meter porque isso é um vício sem retorno bem pior do que o dos aquários" parece que vou ter que atacar essa frente...  :yb663:  :yb663:  :yb663: 

Depois de alguma investigação muito superficial chego então à fase de orçamento. Não fazendo a mais pequena ideia sobre onde adqueirir equipamento* vinha então pedir ajuda aos peritos.*
Inicialmente estou a pensar em coisa simples como temporização, controlo de temperatura e regulação de intensidade dos leds brancos.

Penso que necessito de:

1 - Arduino (quero a versão mega por ser a mais expansível e adiferença de preço não ser dramática)

2 - Real-time clock (RTC com pilha própria para o caso de haver falha de luz)

3 - Display LCD e teclado (o teclado pode ser básico mas o display, já que me estou a meter nisto, convinha que fosse o de 4 linhas - ouvi dizer é que os ecrans tapam uma quantidade generosa de pinos por isso há que comprar um shield de adaptação)

4 - Jumpers em quantidade

5 - Uma régua de tomadas/relays 220/230V (são controláveis por TTL??? - dúvida de ignorante)

6 - Transdutores de temperatura (queria 4: aquário, dissipador, interior do móvel e temperatura exterior)

Breadboard já tenho.

Pergunta 1:
Esta lista de compras está correcta? Falta ou tem a mais alguma coisa?

Pergunta 2:
Onde se arranja disto? Ebay?

Pergunta 3:
Li que há clones de Arduino mais baratos e com qualidade comprovada, faz sentido seguir essa via tipo AMD vs Intel ou dada a diferença de preço de poucos eur não merece a pena?

Pergunta 4:
Estou-me mesmo a meter num molho de bróculos que me levará à ruina e a um divórcio litigioso (seguramente por ordem inversa)?

Não têm que responder a tudo. Uma dica aqui e outra ali já ajudava muito.
 :Pracima: 
Obrigado

----------


## AntonioSilva

Bem vindo ao grupo dos automatismos

Eu a semana passada mandei vir um RTc e um freearduino.

O RTC ja chegou e o Arduino com display deve chegar esta semana.

Vou fazer um controlador para reef que encontrei na net e posso colocar aqui o link do programa se quiserem.

Controla as luzes ph e temperatura (resistência e ventiladores e se for necessário até desliga as luzes)

Um abraço

PS: O arduino é uma plantaforma livre e podem ser copiados por isso mesmo é so uma questão de marca a meu ver.

----------


## Nuno Prazeres

> Bem vindo ao grupo dos automatismos
> 
> Eu a semana passada mandei vir um RTc e um freearduino.
> 
> O RTC ja chegou e o Arduino com display deve chegar esta semana.
> 
> Vou fazer um controlador para reef que encontrei na net e posso colocar aqui o link do programa se quiserem.
> 
> Controla as luzes ph e temperatura (resistência e ventiladores e se for necessário até desliga as luzes)
> ...


Obrigado!
Podes colocar aqui o link, claro!
Já agora posso perguntar onde adquiriste o material?
Abraço

----------


## Pedro Ferrer

Boa tarde




> 1 - Arduino (quero a versão mega por ser a mais expansível e a diferença de preço não ser dramática)


Sim, a versão Mega é a melhor... tens a versão 2560.




> 3 - Display LCD e teclado (o teclado pode ser básico mas o display, já que me estou a meter nisto, convinha que fosse o de 4 linhas - ouvi dizer é que os ecrãs tapam uma quantidade generosa de pinos por isso há que comprar um shield de adaptação)


Há LCD's que já são eles uns shield.




> 4 - Jumpers em quantidade


Há jumpers macho e fêmea. Mas sem dúvida que em quantidade.




> 5 - Uma régua de tomadas/relays 220/230V (são controláveis por TTL??? - dúvida de ignorante)


Relés 12VDC chegam-te... pois permitem passar até 300W.




> Pergunta 2:
> Onde se arranja disto? Ebay?


No Ebay... inmotion.pt ...




> Pergunta 3:
> Li que há clones de Arduino mais baratos e com qualidade comprovada


Os clones de Arduino custam sensivelmente 50% menos que o Arduino.
Os criadores do Arduino, apenas obrigam que os seus clones tenham 'duino' no nome.
A nível de qualidade é a mesma...




> Pergunta 4:
> Estou-me mesmo a meter num molho de bróculos que me levará à ruina e a um divórcio litigioso (seguramente por ordem inversa)?


Nada disso... alguns lamentos sim... mas o resto é exagerado.
Eu para trabalhar em algo, apenas o posso fazer (por causa do pequenito...) após as 22h... ou antes das 9h... ou seja, ao fim-de-semana, levanto-me praticamente à mesma hora como se fosse trabalhar...

Abraço
Pedro Ferrer

----------


## Bruno Morais

nacional e a preços bastante acessiveis 
Arduino Shields

----------


## AntonioSilva

Boas

Aqui tens o link

http://code.google.c...ium-controller/

É livre portanto não ha problema.

----------


## Bruno Morais

Antonio, o link nao tá bom...

----------


## Hugo Figueiredo

Mais um! BOA!!!  :SbOk: 

Eu mandei vir este kit: Arduino Mega Kit 128X64 LCD IR SD Funny Starter Kit | eBay UK

...e mais uma película touch screen para o LCD!

Estou em pulgas para que chegue...  :yb665: 
e ja ando em simuladores a "montar" circuitos!

Quando chegar isto, mando vir isto: 16-Channel 5V Relay Module for Arduino PIC ARM AVR DSP | eBay UK

 :Admirado:

----------


## Carlos Dias

> Mais um! BOA!!! 
> 
> Eu mandei vir este kit: Arduino Mega Kit 128X64 LCD IR SD Funny Starter Kit | eBay UK
> 
> ...e mais uma película touch screen para o LCD!
> 
> Estou em pulgas para que chegue... 
> e ja ando em simuladores a "montar" circuitos!
> 
> Quando chegar isto, mando vir isto: 16-Channel 5V Relay Module for Arduino PIC ARM AVR DSP | eBay UK


Boas

Bem tou a ficar entusiasmado com a coisa  :SbSourire2: .

Hugo isso que estás a mandar vir chega para ligar, uma calha t5, controlar uma calha de leds, ligar e desligar umas 3 ou 4 bombas, ou será necessário comprar mais alguma coisa?

----------


## Hugo Figueiredo

> Boas
> 
> Bem tou a ficar entusiasmado com a coisa .
> 
> Hugo isso que estás a mandar vir chega para ligar, uma calha t5, controlar uma calha de leds, ligar e desligar umas 3 ou 4 bombas, ou será necessário comprar mais alguma coisa?


Estás a falar com um gajo que percebe puto de electrónica!  :Coradoeolhos: 

O que me motiva mais no arduino é a parte de programação. é disso que gosto!

Ainda assim eu diria que sim, para o que referiste, necessitas basicamente do que comprei! Claro está que é preciso isto conseguires controlar, depois depende dos aparelhos em si. Por exemplo dos balastros das lampadas, etc...

Mas para permitir controlar o que dizes é essencialmente isto. Podem só faltar depois umas resistências ou uns fusíveis mas isso compras em qualquer casa de electrónica por 1/2 dúzia de centimos ou poucos euros!

----------


## AntonioSilva

Peço desculpa...aqui esta o link completo

arduino-aquarium-controller - Create an aquarium controller - Google Project Hosting

Para quem fizer este ou outro controlador eu ofereço-me a ajudar nos drivers de potencia para quem entender pouco de electrónica e que seja da zona do Porto.

Cumprimentos

----------


## AntonioSilva

Peço mais um vez desculpa.

O codigo acima é para aquarios de agua doce, deixem ver se encontro o codigo do que vi para reefs.

As minhas desculpa mais uma vez pelo engano

----------


## JoaoCAlves

Olha... mais um!!!  :yb624: 

Bem vindo ao mundo dos malucos!!!  :Palmas:

----------


## JoaoCAlves

> Boas
> 
> Bem tou a ficar entusiasmado com a coisa .
> 
> Hugo isso que estás a mandar vir chega para ligar, uma calha t5, controlar uma calha de leds, ligar e desligar umas 3 ou 4 bombas, ou será necessário comprar mais alguma coisa?


Boas.

Se queres dizer, ligar e desligar uma calha T5, sim!

Controlar a intensidade, tens que ter balastros dimaveis e meter um circuito no meio!  :SbOk2:

----------


## JoaoCAlves

> Peço mais um vez desculpa.
> 
> O codigo acima é para aquarios de agua doce, deixem ver se encontro o codigo do que vi para reefs.
> 
> As minhas desculpa mais uma vez pelo engano


Será este que queres dizer?

Arduarium Controller | Practical Maker

----------


## Rui Manuel Gaspar

Boas,

Ainda não encomendei o Arduíno ... Está quase, mas entretanto mandei vir este:



O do Video é o de 2,4" mas o que encomendei é o de 3.2" touch

O Shield para Arduíno Mega tem já RTC e SD card reader, e a julgar pelas reviews e pelo vídeo as libraries estão muito boas.

O preço é que é apelativo: cerca de 40$ já com portes ...

Mandei vir também dois Shields com 4x 5v Relay.

Agora ando à procura do Arduíno Mega 2560 baratinho ...

Faz assim tanta diferença do 2560 para o 1280? Os programas que a malta usa precisam mesmo da memória adicional?

Abraços,

----------


## Hugo Figueiredo

> Boas,
> 
> Ainda não encomendei o Arduíno ... Está quase, mas entretanto mandei vir este:
> 
> 
> 
> O do Video é o de 2,4" mas o que encomendei é o de 3.2" touch
> 
> O Shield para Arduíno Mega tem já RTC e SD card reader, e a julgar pelas reviews e pelo vídeo as libraries estão muito boas.
> ...


Shields de relays para o arduino? onde há disso?

Quanto à memoria interna do bicho para fazerem um programa com mais de um mega tens de escrever muita linha de código... Mas mesmo muita! Quantas linhas tens de colocar num txt para atingir 1 mega?... :Coradoeolhos:

----------


## Pedro Ferrer

Bom dia Rui




> Faz assim tanta diferença do 2560 para o 1280? Os programas que a malta usa precisam mesmo da memória adicional?


O '1280' chega-te perfeitamente.

Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Hugo, vê aqui.

Mas o que acham do screen? Para além de tudo gostei do facto de já vir com RTC!

Abraços,

----------


## Pedro Ferrer

Bom dia

Comparações 
Arduino Mega 1280 - Arduino - ArduinoBoardMega
Arduino Mega 2560 - Arduino - ArduinoBoardMega2560

Abraço
Pedro Ferrer

----------


## JoaoCAlves

> Boas,
> 
> Ainda não encomendei o Arduíno ... Está quase, mas entretanto mandei vir este:
> 
> 
> 
> O do Video é o de 2,4" mas o que encomendei é o de 3.2" touch
> 
> O Shield para Arduíno Mega tem já RTC e SD card reader, e a julgar pelas reviews e pelo vídeo as libraries estão muito boas.
> ...



Tens o link de onde mandas-te vir?

Eu tenho um parecido, de 3.6", mas as livrarias não são bem para ele. Tvz o código desse dê para adaptar mais facilmente ao meu.

128k é mt programa, mas se encontrares o 256k (2560) a bom preço, manda vir antes o 2560, não perdes nada. 

O programa em si não ocupa mt espaço, mas se quiseres ter varias fontes de texto disponiveis, isso começa a ocupar.

----------


## Hugo Figueiredo

> Boas ,
> 
> Hugo, vê aqui.
> 
> Mas o que acham do screen? Para além de tudo gostei do facto de já vir com RTC!
> 
> Abraços,


Isto???

Não é um shield é apenas um modulo e arranja-se ao mesmo preço para 16 entradas no ebay...

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Isto???
> 
> Não é um shield é apenas um modulo e arranja-se ao mesmo preço para 16 entradas no ebay...


Essa do ao mesmo preço  :Coradoeolhos: !

Claro que o do eBay compensa sempre são 16 contra apenas 4, mas para o que eu quero 4 chegam perfeitamente.

Tinha o Aquatrónica e só estava a usar quatro tomadas.

João, Vê no meu post das 10:38! tens lá depois os links para as Libraries.

Abraços,

----------


## JoaoCAlves

Já vi, já vi, obrigado!  :SbOk5:

----------


## Hugo Figueiredo

Tens razão, não é o mesmo preço!  :Coradoeolhos: 

7,5 libras os de 4 entradas.
e 26 libras os de 16 entradas!

Eu aho que 16 entradas nunca vou utilizar, mas pelas minhas onas 4 também é pouco!

Se calhar fico-me pelo meio e mando vir um de 8 entradas!  :SbOk: 


Pensas depois fazer uma box com tomadas? há links disso para se ve exemplos? Isso é que era! :yb665:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Tens razão, não é o mesmo preço! 
> 
> 7,5 libras os de 4 entradas.
> e 26 libras os de 16 entradas!
> 
> Eu aho que 16 entradas nunca vou utilizar, mas pelas minhas onas 4 também é pouco!
> 
> Se calhar fico-me pelo meio e mando vir um de 8 entradas! 
> 
> ...


 
Não te esqueças dos portes ... Estou a pagar 5$ de portes.

Realmente se quiseres ligar tudo 4 entradas é pouco. Como quero ligar tudo mandei vir 2x.

Mas controláveis em termos de tomadas tens iluminação e temperatura (eu no meu caso) e para isso 4 no Aquatrónica chegavam.

Sim, quero mais tarde fazer uma caixa sim. Estou em processo de construção de uma máquina de CNC caseira para outro hobby meu ... brinquedos de madeira ... e vou aproveitá-la depois para fazer uma caixa em acrílico, mas não gosto do sistema da aquatrónica com réguas separadas pelo que quero fazer tudo junto.

Mas até isso acontecer não me doa a cabeça ... só lá para o ano que vem. Tenho muito pouco tempo e outras prioridades  :Coradoeolhos: .

Abraços,

----------


## Rui Manuel Gaspar

Boas  :Olá:  mais uma vez ...

Descobri agora no eBay um Arduíno Mega 2560 por 23 Libras com proviniência de Inglaterra.

Estou à espera de resposta de portes mas parece-me um bom preço.

Abraços,

----------


## Hugo Figueiredo

> Boas  mais uma vez ...
> 
> Descobri agora no eBay um Arduíno Mega 2560 por 23 Libras com proviniência de Inglaterra.
> 
> Estou à espera de resposta de portes mas parece-me um bom preço.
> 
> Abraços,


Chega-te! está bom preço! Portes no ebay? aparecem logo, se escolheres portugal como destino!  :SbSourire2:

----------


## Rui Manuel Gaspar

> Chega-te! está bom preço! Portes no ebay? aparecem logo, se escolheres portugal como destino!


Pois ... Este não tem. Pede para contactar o vendedor para saber portes.

Outro link engraçado que encontrei no ebay foi para quem quiser um display igual ao que mandei vir + o shield para o display com RTC + Arduíno 1280 por 31£.

Fica a informação!

Abraços,

----------


## JoaoCAlves

> Tens razão, não é o mesmo preço! 
> 
> 7,5 libras os de 4 entradas.
> e 26 libras os de 16 entradas!
> 
> Eu aho que 16 entradas nunca vou utilizar, mas pelas minhas onas 4 também é pouco!
> 
> Se calhar fico-me pelo meio e mando vir um de 8 entradas! 
> 
> ...


Podes fazer um painel semelhante ao meu. No lugar do atc-800, metes o arduino e todo o hardware!  :Wink: 

Gasta-se umas coroas, mas é mt facil fazer!  :Wink:

----------


## Hugo Figueiredo

e há planos/imangens disso na net?

----------


## JoaoCAlves

> e há planos/imangens disso na net?


Não, planos, só na minha cabeça!  :Coradoeolhos: 

Tens aqui fotos que tinha posto noutro post.

http://www.reefforum.net/177347-post10.html

----------


## Nuno Prazeres

> Boas  mais uma vez ...
> 
> Descobri agora no eBay um Arduíno Mega 2560 por 23 Libras com proviniência de Inglaterra.
> 
> Estou à espera de resposta de portes mas parece-me um bom preço.
> 
> Abraços,


Link?

Se estiveres interessado em rachar os portes e se houver por lá o que eu quero, podemos ter negócio!  :SbOk5:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Link?
> 
> Se estiveres interessado em rachar os portes e se houver por lá o que eu quero, podemos ter negócio!


 
Aqui!


Abraço,

----------


## Nuno Prazeres

> Boas ,
> 
> 
> 
> 
> Aqui!
> 
> 
> Abraço,


Obrigado

Parece que só têm mesmo o Arduino e o shield de ethernet. Precisava de mais coisas. De qualquer modo vou comparar preços. 

Abraço

----------


## Nuno Prazeres

Como o meu material nunca mais chega, ando a ocupar o tempo a ver se começo a pescar alguma coisa de programação de arduino.

O contexto do código abaixo é simples: trata-se de fazer um temporizador para os 4 canais da calha de iluminação que queria fazer. Cada pino de cada canal irá ligar a um relay de 5V.

Será que funciona?

/*
* Temporizacao da calha de leds
*/
*
int Hora /* hora do relógio */
int Tcinco = 13 /* número da saída que regula T5 */
int Royal = 14 /* número da saída que regula os leds royal-blue */
int Blue = 15 /* número da saída que regula os leds blue */
int White = 16 /* número da saída que regula os leds brancos */
*
void setup()
{
/* NAO SEI QUAL A INSTRUCAO PARA INICIALIZAR O RELOGIO POR ISSO VOU FAZER EU MESMO UM COM O OSCILADOR INTERNO DO ARDUINO E COM A FUNCAO DELAY. VOU TAMBEM PRESSUPOR QUE FACO O UPLOAD PARA O ARDUINO AS 10:00 PARA SIMPLIFICAR */
Hora = 10
/* inicializa a saída das T5 */
pinMode(Tcinco, OUTPUT);
digitalWrite(Tcinco, LOW);
/* inicializa a saída dos leds royal-blue */
pinMode(Royal, OUTPUT);
digitalWrite(Royal, LOW);
/* inicializa a saída dos leds blue */
pinMode(Blue, OUTPUT);
digitalWrite(Blue, LOW);
/* inicializa a saída dos leds brancos */
pinMode(White, OUTPUT);
digitalWrite(White, LOW);
}
*
void loop()
{
/* liga T5 as 11:00 e desliga as 23:00 */
if ((Hora >= 11) AND (Hora <= 23)
{
digitalWrite(Tcinco, HIGH);
}
else
{
digitalWrite(Tcinco, LOW);
}
/* liga royal blue as 12:00 e desliga as 22:00 */
if ((Hora >= 12) AND (Hora <= 22)
{
digitalWrite(Royal, HIGH);
}
else
{
digitalWrite(Royal, LOW);
}
/* liga blue as 13:00 e desliga as 21:00 */
if ((Hora >= 13) AND (Hora <= 21)
{
digitalWrite(Blue, HIGH);
}
else
{
digitalWrite(Blue, LOW);
}
/* liga white as 14:00 e desliga as 20:00 */
if ((Hora >= 14) AND (Hora <= 20)
{
digitalWrite(White, HIGH);
}
else
{
digitalWrite(White, LOW);
}
/* interrompe o ciclo durante uma hora e depois avanca a variavel temporal gerindo a passagem da meia noite  a funcao delay aceita parametros em milisegundos */
*
delay(3600000);
*
if (Hora = 23)
{
Hora = 0;
}
else
{
Hora = Hora + 1;
}
*
}
*

----------


## Pedro Ferrer

Bom dia




> Cada pino de cada canal irá ligar a um relay de 5V.


Os relés de 5V não aguentam muita potência...
Já viste quantos Watts vais usar em cada um dos canais?

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

Tirando aí alguns pormenores no código (por exemplo terminar todas as linhas com ";"), não vejo porque não possa funcionar!

Contudo, em termos de arduino/relay/balastro, não sei o que acontece por tentar ligar uma coisa que já está ligada, que é o que vai acontecer todas as horas dentro de cada ciclo... Mas se houver problema também se resolve validando para lá da hora se o pin já está ligado ou não.

Se não houver problema nenhum, nem precisas de um RTC, assim funciona perfeitamente (pelo menos do que me parece em termos de código...).

----------


## Nuno Prazeres

> Bom dia
> 
> 
> 
> Os relés de 5V não aguentam muita potência...
> Já viste quantos Watts vais usar em cada um dos canais?
> 
> Abraço
> Pedro Ferrer


Obrigado!

T5 - 108watts
Royal - 20watts
Blue - 20watts
White - 150watts

Será demasiado?

O datasheet fala em 220/230V, 10 A.

O switch faz-se com apenas 20mA. 

Por estar a escrever no smartphone não consigo colocar o link para o Ebay mas um search com "4-channel 5V relay" deve logo dar aquilo de que falo. 

Penso que o Hugo mandou vir algo parecido.

----------


## Nuno Prazeres

> Tirando aí alguns pormenores no código (por exemplo terminar todas as linhas com ";"), não vejo porque não possa funcionar!
> 
> Contudo, em termos de arduino/relay/balastro, não sei o que acontece por tentar ligar uma coisa que já está ligada, que é o que vai acontecer todas as horas dentro de cada ciclo... Mas se houver problema também se resolve validando para lá da hora se o pin já está ligado ou não.
> 
> Se não houver problema nenhum, nem precisas de um RTC, assim funciona perfeitamente (pelo menos do que me parece em termos de código...).


Obrigado!
Sinceramente também pensei nesse tema de ligar o que já estava ligado mas só testando.

Um outro tema é que se o arduino arranca com os pinos lógicos todos "LOW" o que faz todo o sentido, nem tenho que ter o trabalho de os inicializar e o código fica mais curtinho na parte declarativa.

Finalmente, admito que necessite dum RTC ou então duma bateria de 9V a servir de back-up porque se faltar a luz, suspeito que o Arduino ao acordar de novo irá "pensar" que são 10 da manhã.

Será que consigo fazer a coisa desse modo?

Ligo a pilha ao Vcc in do bicho mas via um relay de 9V puxado pela fonte de alimentação DC. Sem corrente o relay liga a pilha, com corrente a pilha sai de cena. Se calhar tem é que ser um mosfet porque preciso dum swith time muito rápido. Um condensador granjolo em paralelo pode ajudar a alisar o problema.

Será muito estúpido fazer a coisa assim poupando para já o RTC ( que tanto quanto sei trás uma pilha de lítio)?

Já agora, se tiver um medidor de temperatura na calha, basta meter uma variável "Temperatura" e no "if" dos leds brancos colocar um "AND Temperatura < 45". Na pior das hipóteses os leds brancos funcionam apenas uma hora seguida se por exemplo a ventoinha de arrefecimento queimar (algo que já me aconteceu).

----------


## Hugo Figueiredo

Pois do funcionamento do arduino e de electronica já não pesco nada!  :yb665: 

De qualquer modo, se o arduino tem memória interna, não dará para ires gravando para lá uma variável? assim quando ia a baixo e reinicializava, pegava nesse valor...

Não sei se o arduino faz isto... :Admirado:

----------


## Pedro Ferrer

Boa tarde




> Será muito estúpido fazer a coisa assim poupando para já o RTC ( que tanto quanto sei trás uma pilha de lítio)?


Acho que o preço de um *R*eal *T*ime *C*lock, não justifica a ginástica necessária para se ter um relógio via programação...

Não há qualquer problema em ligar o que já está ligado...  :Smile:  toda a automação funciona assim... em ciclos...

Abraço
Pedro Ferrer

----------


## Bruno Morais

Real Time Clock aki RTC - Real Time Clock Module - Loja LusoRobtica 15 aerius ;P

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Fui eu que mandei vir os Relay de 5V e dizem que à saída poderás ter 220V / 10A por isso não me parece que vás ter problemas em ligar lá os balastos.

Além disso podem sempre mandar vir um shield com LCD Touch já com o RTC incluído.

E só para ti Hugo que perguntavas por um shield de Relés ... aqui tens:

Multi-channel Relay Shield For Arduino : IS Shield v1.0 [SHD008] - $22.00 : iStore, Make Innovation Easier

Abraços,

----------


## Pedro Ferrer

Boa tarde

Normalmente os relés de 5V consomem mais do que 20mA para serem actuados e queimariam o PLC (Arduino)... mas parece que não é esse o caso...

Se suportam 220V 10A, então podem puxá-los até aos 2200-2500W.

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

E se quiseres brincar mais um pouco, podes adaptar este código para controlar a intensidade do pin 11 (neste exemplo que fiz):

int v_pin = 11;
int v_led;
int v_perc = 50;// percentagem de intensidade. 0% corresponde a led desligado e 100% corresponde a led no máximo

void setup()
{
  pinMode(v_pin, OUTPUT);           
}
void loop()
{
  v_led = int(255*((v_perc)*0.01));
  analogWrite(v_pin,v_led);
}

Mudando a variável v_perc para 75, por exemplo, ficamos com uma intensidade de 75% no pin 11.

___________________

Rui entretanto já encontrei esse e outros shields, mas são carotes... Contudo, dá-me ideia que este tem possibilidade xbee, o que faz com que se possamos ter um relé a comunicar por IR 433mhz com o arduino. Interessante!  :yb665:  :SbOk:

----------


## JoaoCAlves

Boas.

Atenção aqui:

"
if (Hora = 23)
{
Hora = 0;
}
else
{
Hora = Hora + 1;
}
*
}
* 
"

Deves querer escrever Hora igual a 24, e não 23.

Senão todos os dias tens uma hora a menos resultando num desfazamento de 1h pordia no ciclo.

----------


## Pedro Miguel Peres

Pedro,

Normalmente usa-se um transistor para permitir mais corente para actuar o relé, podes ver este exemplo. Neste caso o relé precisa de 200ma, ou seja 10x mais corrente  :Admirado:  para potências até 60w.

Atentamente,
Pedro Peres




> Boa tarde
> 
> Normalmente os relés de 5V consomem mais do que 20mA para serem actuados e queimariam o PLC (Arduino)... mas parece que não é esse o caso...
> 
> Se suportam 220V 10A, então podem puxá-los até aos 2200-2500W.
> 
> Abraço
> Pedro Ferrer

----------


## Pedro Ferrer

Boa noite




> if (Hora = 23)


se for 




> if (Hora == 23){


Costuma dar melhor resultado... :SbSourire2: 

(...)




> Pedro,
> Normalmente usa-se um transístor para permitir mais corrente para actuar o relé


Obrigado pelo exemplo. Muito bom.

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

Exacto!
Pelo que andei a ler deve-se usar o 2N2222.

----------


## António Vitor

> Como o meu material nunca mais chega, ando a ocupar o tempo a ver se começo a pescar alguma coisa de programação de arduino.
> 
> O contexto do código abaixo é simples: trata-se de fazer um temporizador para os 4 canais da calha de iluminação que queria fazer. Cada pino de cada canal irá ligar a um relay de 5V.
> 
> Será que funciona?
> 
> /*
> * Temporizacao da calha de leds
> */
> ...


não sei se há limites para a função delay, mas estares 1 hora com o arduino em pausa em espera é pouco produtivo...quanto ao resto acho que funcionava...no entanto tens de libertar o arduino!


porque não algo deste estilo:

função crono:
overflow e clic duas váriaveis unsigned long, para rebentar uma vez por mês...

void crono(){
clic=millis();

//linhas em baixo verificam se rebentou a contagem, demora como disse uma vez por mês...
//linhas em cima atribui o valor de millis ao clic

  if (overflow > clic ){
overflow=clic;
  lastTick=overflow;
}



if (clic - lastTick > 1000.0) {
  lastTick = lastTick+1000; //duração do segundo
second++;
}
//em cima vai atribuir  mais 1000 ao lastick quando passa um segundo, para efeitos de comparação nas linhas em cima, para determinar quando passa um segundo...
bastante simples...
depois é adicionar em baixo comparações do tipo se segundos=60 então incrementa 1 minuto e segundo=0...se minuto=60 então incrementa hora e minuto e segundo=0, se hora =24 então hora =0 etc

bastante simples...
depois chamavas no meio do programa a função cronos...
tipo desde que faças mais que uma vez por segundo a função o atraso é de uns 2-3 segundos isto no meu caso depois da ultima actualização que fiz há uns bons meses atrás...
 :Big Grin: 
não uso RTC, mas tenho aqui as peças.
não preciso mesmo posso te arranjar...
Uso UPS logo mesmo quando corta a corrente lá continua a contar...

O segredo é a função millis(), que te dá o tempo que o arduino está ligado, até rebentar a tal unsigned long. vai para zero...por isso tenho a tal "evita isso" na função, tens de inicializar no inicio do programa a variável overflow, com a função millis, basta no inicio uma vez, fora do loop principal.
quando millis vai para zero, fica mais pequeno que overflow...logo rebentou...

----------


## Hugo Figueiredo

> mas estares 1 hora com o arduino em pausa em espera é pouco produtivo


Porquê? :Admirado: 
Não se faz mais nada desse arduino durante esse tempo?

----------


## António Vitor

> Porquê?
> Não se faz mais nada desse arduino durante esse tempo?


O Nuno meteu delay 3600000...
 :Big Grin: 
ficava em stand bye até passar esse tempo...isto supondo que não existe um limite para a função delay,
como o arduino até é rápido, no meu caso mesmo crescendo a complexidade enormemente, só coloquei a chamada á função cronos 1 vez no loop principal...garanto que ele deverá ir lá ver umas 10000 vezes por segundo, mas mesmo que o arduino fosse mais lento dava na mesma...

e no resto, ele pode fazer outras coisas, como:
ver pH etc...etc...etc...

Mas funcionava, a ideia do Nuno tem lógica...

----------


## Hugo Figueiredo

> O Nuno meteu delay 3600000...
> 
> ficava em stand bye até passar esse tempo...
> como o arduino até é rápido, no meu caso mesmo crescendo a complexidade enormemente, só coloquei a chamada á função cronos 1 vez no loop principal...garanto que ele deverá ir lá ver umas 10000 vezes por segundo, mas mesmo que o arduino fosse mais lento dava na mesma...
> 
> e no resto, ele pode fazer outras coisas, como:
> ver pH etc...etc...etc...
> 
> Mas funcionava, a ideia do Nuno tem lógica...


Pronto, mas só tem "problema" se ele quiser depois usar esse arduino para fazer mais alguma coisa...
Mas a tua solução é mais versátil, sem dúvida!

De qualquer forma só não mandei vir ainda o RTC porque há para aí lcd's touch que já o têm incorporado e ainda não me decidi por mandar vir um desses. :SbSourire2:

----------


## António Vitor

> O Nuno meteu delay 3600000...
> 
> ficava em stand bye até passar esse tempo...isto supondo que não existe um limite para a função delay,
> como o arduino até é rápido, no meu caso mesmo crescendo a complexidade enormemente, só coloquei a chamada á função cronos 1 vez no loop principal...garanto que ele deverá ir lá ver umas 10000 vezes por segundo, mas mesmo que o arduino fosse mais lento dava na mesma...
> 
> e no resto, ele pode fazer outras coisas, como:
> ver pH etc...etc...etc...
> 
> Mas funcionava, a ideia do Nuno tem lógica...


Hoje vou receber os leds da ledrise, nem sei se me faltam controladores, vou agora ver...lol...
mas mais 1 semana no máximo e tenho as t5 tiradas.
como tinha dito vou meter leds azuis e não royal blue. vai ficar todo coberto, e nas periferias vai ficar com lentes, para não desperdiçar luz...
Será um bom upgrade...

depois vou simplificar retirando alguns fios da calha...
ficarei com apenas 4 canais. chega e sobra, e vou alterar o programa, escrevendo de novo, o primeiro foi a tal aprendizagem e fui escrevendo e aprendendo no caminho, agora será uma coisa diferente...

vou retirar algumas funções como o tal nascer do sol, ocaso do sol, e implementar outras tantas...nubelosidade e trovoada.

O meu código se alguém o experimentou não funciona, sem alterarem a livraria do LCD shield, alterei os pinos standard... e acho que esqueci-me de o referir...
irei usar a livraria normal, sem alterações com o novo programa, passou 1 ano e já tenho pachorra...

----------


## António Vitor

> Pronto, mas só tem "problema" se ele quiser depois usar esse arduino para fazer mais alguma coisa...
> Mas a tua solução é mais versátil, sem dúvida!
> 
> De qualquer forma só não mandei vir ainda o RTC porque há para aí lcd's touch que já o têm incorporado e ainda não me decidi por mandar vir um desses.


ele vai querer...
usar o arduino assim, é desperdiçar o tremendo potencial do mesmo!

Mas eu também sei que este foi só um exercicio para o Nuno, tipo "hello world"
 :Big Grin:

----------


## Nuno Prazeres

> ele vai querer...
> usar o arduino assim, é desperdiçar o tremendo potencial do mesmo!
> 
> Mas eu também sei que este foi só um exercicio para o Nuno, tipo "hello world"


Exacto! Sou informático mas não programava há 20 anos LOL! É um "back to the world" no meu caso. 

Quanto a expandir o uso do arduino, acontecerá e nessa altura alterarei o código. 

Abraço

----------


## Rui Manuel Gaspar

> Exacto! Sou informático mas não programava há 20 anos LOL! É um "back to the world" no meu caso. 
> 
> Quanto a expandir o uso do arduino, acontecerá e nessa altura alterarei o código. 
> 
> Abraço


Estás como eu que já não programo à 20 anos ...

O problema se bem "ME" conheço é que se ficar lá código para depois modificar ... um gajo habitua-se e nunca mais o optimiza ...

Abraços,

----------


## Hugo Figueiredo

> Estás como eu que já não programo à 20 anos ...
> 
> O problema se bem "ME" conheço é que se ficar lá código para depois modificar ... um gajo habitua-se e nunca mais o optimiza ...
> 
> Abraços,


isso acontece com toda a gente que programa, sem ser em termos profissionais! É feitio, não é defeito!!! :yb624: 

Mas quando temos de programar em teermos profissionais, a coisa já parece mais... profissional!!!

É como comentários! "Vou por comentários para quê se sou eu que estou a fazer isto?".

Programador é um gajo muita estranho. lol  :yb624:

----------


## Pedro Ferrer

Bom dia




> um gajo habitua-se e nunca mais o optimiza ...


Isso acontece quando o código é criado para uma situação específica.
O mesmo não acontece quando o código é necessário em mais do que uma circunstância.
Quando é necessário utilizá-lo numa 2ª situação, então sim, é optimizado. Se assim não for... então não sabemos programar...




> É como comentários! "Vou por comentários para quê se sou eu que estou a fazer isto?".


Comentários dos passos...
Comentários da origem da informação...
Comentários das equações matemáticas...
Comentários das rotinas...

Tão importante são os comentários dos passos, quanto os da origem da informação...

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

Programar tem a vantagem/desvantagem de não ser uma ciência exacta!
Há várias formas de atingir o mesmo fim.

O importante é que o código seja eficaz, disso não há dúvida, mas só os bons programadores o fazem eficiente!

----------


## JoaoCAlves

> Boa noite
> 
> 
> 
> se for 
> 
> 
> 
> Costuma dar melhor resultado...
> ...


Lol

pois!  :Big Grin: 

Já cometi esse erro algumas vezes...

----------


## Nuno Prazeres

Eu quando programava de inicio era gozado por fazer sub rotinas com uma linha. Só que depois vinha o "já agora" e o "com isto funciona melhor" e as subs engordavam sucessivamente até que voltava a partir o código em sub subrotinas e por aí em diante.
Era poupado nos comentários até que apanhei um prof  (o actual Reitor da Univ. de Coimbra) que dizia que "não há comentário, não percebo o que o aluno pretende com o código".
Os meus programas tinham por isso mais linhas de comentário do que código, LOL!
Normalmente funcionavam bem mas nunca tive jeito para interfaces gráficos todos pipis. Era forte e feio. Bugs havia, claro. E às vezes até eram aos enxames  Mas como o código estava sempre arrumadinho normalmente não custava muito descobrir donde vinham. 
Gráficos é que não. É por isso que nesta fase nem estou a pensar em displays e teclados.

Já agora, João, fiz uma simulação rudimentar do ciclo de temporização e fiquei nas 24 horas e não nas 23. Isto porque a instrução de "delay" está antes do incremento da variável. Mas posso de facto estar enganado.

Entretanto Hugo. O código que colocaste é para pwm? Não pesco nada das funções do arduino.  :SbPiggy: 

Já agora, descobri que ainda tenho para aqui uns relays na caixa das electrónicas pelo que irei tentar testar a minha UPS dos pobres que pretendo fazer com uma pilha de 9v, um relay ou mosfet e um condensador (e um diodo a filtrar). O objectivo é activar a alimentação pela pilha em caso de quebra de corrente e voltar ao transformador quando esta regressar. Isto claro está sem picos ou depressões que causem o reset do arduino.

----------


## JoaoCAlves

Boas Nuno.

Estranho, não percebo como obtens o 24.

Aliás, como o Pedro apontou e mt bem, ao fazeres "if (Hora = 23)" Tás na verdade a escrever 23 na variavel Hora, e não a comparar a variavel Hora com 23.

Tens que fazer == qd queres fazer uma comparação.

"

Comparison Operators

    == (equal to)
    != (not equal to)
    < (less than)
    > (greater than)
    <= (less than or equal to)
    >= (greater than or equal to) 

"

----------


## Nuno Prazeres

> Boas Nuno.
> 
> Estranho, não percebo como obtens o 24.
> 
> Aliás, como o Pedro apontou e mt bem, ao fazeres "if (Hora = 23)" Tás na verdade a escrever 23 na variavel Hora, e não a comparar a variavel Hora com 23.
> 
> Tens que fazer == qd queres fazer uma comparação.
> 
> "
> ...


Boas!

A sintaxe está errada de facto. É obviamente "==". 
Vou correr aquilo outra vez a ver se chego lá.

Obrigado

----------


## Nuno Prazeres

Tenho um Arduino Mega e 4 relays TTL para 220V 10A a caminho!

Daqui a duas semanitas vou começar a brincadeira a sério.  :Palmas:

----------


## António Vitor

> Boas!
> 
> A sintaxe está errada de facto. É obviamente "==". 
> Vou correr aquilo outra vez a ver se chego lá.
> 
> Obrigado


Não tinha reparado nisso, e também cometi esse erro, é a prática em outras linguagens...
 :Big Grin: 

Amanhã vou iniciar e espero acabar a calha.
problema os gajos da bisalarmes, cortaram o meu dissipador upgrade com apenas 99.3 cms
ou seja quase 1 cm de diferença para os outros 2...
enfim fica uma calha ainda pior amanhada, ok não se vê...mas fica mal amanhada e meio "marreca".
tenho aqui já o acrilico, amanha sem falta.

Tive a minha filha com varicela, e agora veio o meu filho, portanto fico em casa e devo por isso conseguir acabar isto.

não vou mudar o código, programar é giro, mas chateio-me rápido mais vale não mudar o que funciona.
Eu vejo isto como a evolução de vez em quando há saltos qualitativos, mas o lixo evolutivo deixa rastos...
lol

só daqui a algum tempo programo e é se me apetecer...acreditem que é mais chato que conceber a calha...pelo menos para mim.

não vou simplificar o layout disto, apenas unir 2 bucks ao mesmo pin pwm.
e só no do meio e de trás.
porque tar a desfazer dava uma carga de trabalho.

não estragar o que está a funcionar...
 :Big Grin: 

como tenho aqui bucks a 1000 mA com fartura (5 bucks), vou retirar um buck dos leds brancos xp-g a 700 mA do centro, e colocar a 1000 mA.
assim fico com 3 bucks de 700 mA (preciso de 3), e só tinha 2.
é material que ficou do inicio da calha.
Os leds a cor, não convém meter mais de 700 mA.
Os outros meto a 1000 mA os xp-g aguentam na boa.
amanhã depois posto fotos...

Um grande problema e que devem ter cuidado, é a ferrugem...
por metodos galvanicos talvez...
por exemplo os parafusos que meti nas ventoinhas vai ser mesmo dificil os tirar, quero usar as mesmas ventoinhas e espalhar estas pelo dissipador triplo (3x bis-95 de 1 metro em paralelo), vai ser mesmo dificil, sem partido as ventoinhas...
a corrosão é mesmo brutal!
só nos parafusos atenção o aluminio está impecável, nos pontos onde existe os dois metais, ferro zincado julgo dos parafusos, existe mais corrosão do aluminio, no acrilico em cima aparece algum pó que cai da calha onde estão os parafusos. curioso, é pouco mas dá para ver.

amanhã tentarei retirar estes parafusos e meter de nylon que também já aqui tenho.
enfim tenham cuidado com estes pormenores...
atenção acço inoxidável tem mais potencial galvânico com o aluminio...
curiosamente.
 :Big Grin:

----------


## Nuno Prazeres

Lol! Eu sempre fui um bocadinho como tu mas às tantas passei a considerar como fazendo parte do desafio fazer as coisas tão perfeitas quanto possível e não meramente "a funcionar".

As melhoras dos teus filhos!

Já agora... Como é que estás a alimentar o Arduino? Transformador de 9V?

----------


## António Vitor

> Lol! Eu sempre fui um bocadinho como tu mas às tantas passei a considerar como fazendo parte do desafio fazer as coisas tão perfeitas quanto possível e não meramente "a funcionar".
> 
> As melhoras dos teus filhos!
> 
> Já agora... Como é que estás a alimentar o Arduino? Transformador de 9V?


Obrigado!
Estou a alimentar o arduino com as duas baterias "ups" que fiz num anterior DIY( 80 amp/h a 12 V), por causa dos 12V, e para não fritar a longo prazo o arduino tenho aqui um desses integrados que me baixa a tensão para 5 v.

e injecto os 5v, no pin dos 5 volts, (onde sairia 5 volts do arduino, este internamente funciona a 5 volts (pelo menos o meu) com tantas versões...
A electricidade faz o sentido inverso mas alimenta o arduino...não perguntes como mas funciona.
 :Big Grin: 

juntei o útil ao agradável, porque o arduino tinha ligação ás baterias, adicionei um divisor de tensão com uma resistência variável, de forma a ter no máximo 5 volts, quando as baterias tivessem tipo 13.6 volts, assim num dos pins analogico, consigo ler a tensão das baterias, sabendo que se baixarem dos 11.5V estão em risco de entrarem em colapso...
se tiver um corte de corrente por vários dias, consigo prever o fim das baterias.

Pelas minhas contas, deverá dar para quase 1 semana.
A tunze que eu tenho a 12v, é bem poupadinha.

atenção o arduino só é alimentado pelas baterias se falha a corrente, é imediato, não tenho relés, nada...
quando falha a corrente, as baterias em vez de receberem carga despejam, mas isto á velocidade da luz, nada apaga.
 :Big Grin: 
Ou seja normalmente quem dá a carga para o overflow das baterias, e da bomba e arduino é o carregador (a 13.6 volts).
A carga é tão leve, para permitir que as baterias durem pelo menos 1 decada. sempre carregadas!
o suficiente para materem-se carregadas, sem criar desgaste.
Como estou a alimentar a bomba e o arduino, julgo que o overflow ainda é mais tenuo...

Assim simplifiquei esta trapalhada toda, sem relés e sem artimanhas electronicas, simplificando ganhei mais segurança, e menos condições de avarias.

A verdade é que ainda tenho as baterias em pleno, e passou quase 2 anos.

----------


## Nuno Prazeres

Sempre quis fazer uma ups. Será projecto para fazer lá mais para a frente.  
Estou a fazer a tal mini ups só para o Arduino para já em laboratório. Estava a montar o único relay que por cá anda mas parti-lhe um raio dum pino a metê-lo no breadboard. :Icon Cry: 
Vou ter que enxertar uns quantos arames no relay à força de ferro de solda.

----------


## António Vitor

> Sempre quis fazer uma ups. Será projecto para fazer lá mais para a frente.  
> Estou a fazer a tal mini ups só para o Arduino para já em laboratório. Estava a montar o único relay que por cá anda mas parti-lhe um raio dum pino a metê-lo no breadboard.
> Vou ter que enxertar uns quantos arames no relay à força de ferro de solda.


já fiz isso num pentium 4 ...foi a minha prova de soldadura mais eloquente.
mete aquela resina antioxidante para soldar no resto do pé que restou junto ao relay...
mete depois solda nisso, a resina vai servir também para proteger termicamente o relay, o plástico.

depois de banhada de solda....faz o mesmo num fio...resina e banha com solda, isto antes  de unires.

depois de ambas partes terem solda, junta e aqueces.
quando fundir retira antes que queimes o resto, mete mais resina para proteger o relay e soldar melhor antes da união em ambas partes.

----------


## Nuno Prazeres

> já fiz isso num pentium 4 ...foi a minha prova de soldadura mais eloquente.
> mete aquela resina antioxidante para soldar no resto do pé que restou junto ao relay...
> mete depois solda nisso, a resina vai servir também para proteger termicamente o relay, o plástico.
> 
> depois de banhada de solda....faz o mesmo num fio...resina e banha com solda, isto antes  de unires.
> 
> depois de ambas partes terem solda, junta e aqueces.
> quando fundir retira antes que queimes o resto, mete mais resina para proteger o relay e soldar melhor antes da união em ambas partes.


Obrigado! Isso faz todo o sentido e seria muito útil se eu tivesse por cá resina ou tempo para a comprar. Acho que vai ter que ser à bruta, lol!

----------


## Nuno Prazeres

Mini-ups testada! Funciona com leds e ventoinhas.
Peças:
- Relay comutador
- Condensador de 1000 microF
- Pilha de 9V

Ainda vou meter um diodo de protecção.

Resta só saber se a coisa tem poder suficiente para aguentar o Arduino sem que este faça reset.

Obtive entretanto um resultado secundário interessante.

Quando a ventoinha está ligada directamente à fonte 9V DC made in China tem um fluxo bonzinho. Se lhe meto o condensador em paralelo, ela acelera visivelmente.
Conclusão minha: a rectificação destas fontes é feita às 3 pancadas com o respectivo condensador sub dimensionado para ser mais barato.

----------


## António Vitor

> Obrigado! Isso faz todo o sentido e seria muito útil se eu tivesse por cá resina ou tempo para a comprar. Acho que vai ter que ser à bruta, lol!


Se vais soldar leds, aconselho-te a comprares isso...
Até porque a resina que a solda costuma ter pode não chegar, e tens de manter o ferro (a ponta) sempre com solda, e sem sujidade, tipo ferrugens e etc...

A solda e uma esponja humida para retirar o excesso assim limpas a ponta...

Se fizeres isso a ponta dura-te mil anos...

já montei isto dá 267W de leds...
lol
 :yb620:  :yb620: 

ou seja com t5 gastaria mais ou menos a mesma coisa. 280W +/-

não tinha cola suficiente, e faltou meter um led, num circuito...depois faço isso. agora fica assim.

Como tens as lentes na periferia e lentes mais ajustadas, tenho realmente bastante mais luz.
palpita-me que tenho acima de 300 mesmo em baixo.
Estou quase no 1W/litro...
lol

tenho é o KH a 15 (irra) e o cálcio com bons valores...
tenho de adicionar apenas cloreto de cálcio e ajustar...
magnésio agora tenho baixo.
1150.
enfim...
nitratos fosfatos=0.

portanto com tanta luz, se tiver algum tipo de insucesso é culpa do aquariofilo.
 :Big Grin:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Prontos ... chegou ontem o Arduíno, o LCD, o Shield, os Relays ...

Estou metido numa carga de trabalhos. O que vale é que vou entrar de férias!  :Coradoeolhos: 

Abraços,

----------


## Ricardo Pinto

Olá pessoal,

Não faço a mínima ideia se ajuda ou não... mas viram esta notícia?

Hands on with the Reef Angel controller

Este controlador auto-denomina-se como o primeiro open source reef controller. Fui ver o site deles, e têm uma parte de tutorias que tem lá os codigos de programação. 

Tutorials - Reef Angel Controller


Um abraço

----------


## Nuno Prazeres

> Olá pessoal,
> 
> Não faço a mínima ideia se ajuda ou não... mas viram esta notícia?
> 
> Hands on with the Reef Angel controller
> 
> Este controlador auto-denomina-se como o primeiro open source reef controller. Fui ver o site deles, e têm uma parte de tutorias que tem lá os codigos de programação. 
> 
> Tutorials - Reef Angel Controller
> Um abraço


Opinião dum leigo (mas com um Arduino a caminho).

O código usa a mesma sintaxe. Não vi diferenças apreciáveis nos exemplos mais simples.

Penso que pode ajudar muito.

É um COADAS+ no qual investiram uma valente maquia em desenvolvimento da componente envolvente.  :SbSourire2: 

Tem tudo para ser um sucesso.

E poder contar com uma comunidade a partilhar projectos e código ainda mais transponíveis para o Arduino faz sorrir de orelha a orelha qualquer utilizador deste sub-forum!!!!!

Obrigado Ricardo por mais esta dose cavalar de serviço público!
 :tutasla:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Se calhar isto é uma pergunta completamente estúpida, mas onde é que guardam de forma permanente variáveis de sistema?

Exemplo do COADAS+ do Pedro, os valores de lat e long são guardados onde?

É que se fôr uma variável em caso de falha de corrente vai tudo à vida. Certo?

Estava a pensar em guardar alguns valores no SD card num ficheiro de configuração. É muito trabalhoso / descabido?

Abraços,

----------


## Nuno Prazeres

> Boas ,
> 
> Se calhar isto é uma pergunta completamente estúpida, mas onde é que guardam de forma permanente variáveis de sistema?
> 
> Exemplo do COADAS+ do Pedro, os valores de lat e long são guardados onde?
> 
> É que se fôr uma variável em caso de falha de corrente vai tudo à vida. Certo?
> 
> Estava a pensar em guardar alguns valores no SD card num ficheiro de configuração. É muito trabalhoso / descabido?
> ...


Se forem variáveis acho que vão à vida. Pode-se sempre inicializar as variáveis com um valor default mas para as manter com os dados inseridos via teclado acho que só mesmo como dizes.

Aliás isso até dá jeito porque assim podes por exemplo ir gravando outras coisas mais dinâmicas como a temperatura ao longo do tempo ou mesmo o pH se te deres ao trabalhinho de fazer um medidor.

----------


## Rui Manuel Gaspar

> Se forem variáveis acho que vão à vida. Pode-se sempre inicializar as variáveis com um valor default mas para as manter com os dados inseridos via teclado acho que só mesmo como dizes.
> 
> Aliás isso até dá jeito porque assim podes por exemplo ir gravando outras coisas mais dinâmicas como a temperatura ao longo do tempo ou mesmo o pH se te deres ao trabalhinho de fazer um medidor.


 
Sim, é esse o objectivo. poder gravar dados e mostrar um gráfico deles.
Se reparares no video que pus no Ricordea Dream tens lá dois botões para alternar entre gráficos e valores instantâneos

abraços,

----------


## António Vitor

> Sim, é esse o objectivo. poder gravar dados e mostrar um gráfico deles.
> Se reparares no video que pus no Ricordea Dream tens lá dois botões para alternar entre gráficos e valores instantâneos
> 
> abraços,


Se eu estou recordado existe uma parte da memoria do arduino, que dá para gravar, é tipo firmware, mesmo deopis de corte de corrente...

Só que só dá para umas milhares de vezes, até se destruir...

Arduino - Memory

Como nunca falha a corrente no meu arduino (literalmente), não precisei de usar isso...

----------


## António Vitor

No mega já tens uns kbs....

Arduino - ArduinoBoardMega




> EEPROM Write Endurance
>  The EEPROM is specified with a write endurance of 100,000 cycles. Each time you write, the memory is stressed, and eventually it will become less reliable. It's guaranteed to work for at least 100,000 writes, and will very likely work for many more. Normally this limit is not an issue if you write to the EEPROM infrequently.
>  The 100,000 writes apply to each address separately. For example, if you write to address 0 many times, only that address has been stressed. Address 1, 2, 3, etc would not be stressed by writing to address 0. If you do write data quickly, you can prolong the life of the EEPROM by cycling through all addresses in sequence.
> 
> Reading does not stress the EEPROM. Only writes count for the write endurance.


Consegues gravar no EEPROM umas 100 000 vezes até poderes ter problema...
Na memoria flash não faço ideia...

nunca usei o EEPROM para guardar valores.

----------


## Pedro Ferrer

Boa tarde




> Exemplo do COADAS+ do Pedro, os valores de lat e long são guardados onde?


Já em casa...
Gravo na EEPROM... index de 0 a 511. Ou seja, tens 512 posições que servem de BD. (base de dados).

O RTC também funciona como EEPROM, via IC2. Não uso pois não necessito.

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

> Boa tarde
> 
> 
> 
> Já em casa...
> Gravo na EEPROM... index de 0 a 511. Ou seja, tens 512 posições que servem de BD. (base de dados).
> 
> O RTC também funciona como EEPROM, via IC2. Não uso pois não necessito.
> 
> ...


Pergunta de besta ignorante. :SbPiggy:  Se ligar um pen disk vulgar à porta USB consigo chegar-lhe à respectiva memória e usá-la para registar dados que possa invocar pela programação?

----------


## António Vitor

> Pergunta de besta ignorante. Se ligar um pen disk vulgar à porta USB consigo chegar-lhe à respectiva memória e usá-la para registar dados que possa invocar pela programação?


O eeprom do arduino dá para gravar 100 000 vezes, e o flash só 10 000 vezes, uma pen vulgar, dá para gravar menos vezes que o eprom dp arduino.

e que tal ir gravando na memoria de uma forma sequencial...
tipo fila, do seguinte modo.

tens uma zona onde está gravado variáveis, tudo o resto inicializado com um valor qualquer para saberes que está apagado. e de cada vez que vais gravar alguma coisa, á frente no endereço fisico dessa memoria vais meter os novos valores, apagando os anteriores com o tal valor para saberes que está apagado.

Assim se não tiveres muitas variáveis gravadas dava para gravares milhões ou mesmo biliões de vezes as tais variáveis sem a eprom se queixar...
não sei se tás a perceber, embora tenhas de meter mais código... e de inicio o gajo pesquisar a memoria para ver onde estava os tais valores...
claro não irias meter um indice, porque isto desgastava a parte de memoria onde metias o indice...
 :Big Grin: 

claro que podias fazer as coisas ás 3 pancadas como eu algumas vezes faço.

se isso guarda-se os valores tipo ás 00:00 uma vez por dia. 100 000 vezes dava para muitas decadas...
lol
Ou melhor ainda, no menu teres a opção save...
epá 100 000 vezes é mesmo muitas vezes...

Atenção que eu simplifiquei isto...
quando quero meter informação nova, toca a fazer upload na memoria flash (10 000 x apenas), ou seja alterando o programa...

até para acertar as horas faço isso, já que não implementei um acerto de relogio...
e estava á espera de quem o fizesse para gamar o código.

Verdade seja dita, o relógio não falha e não preciso...em 8 meses o atraso é de miseros 5 segundos...
 :Big Grin: 
só por mariquice...

----------


## Nuno Prazeres

> O eeprom do arduino dá para gravar 100 000 vezes, e o flash só 10 000 vezes, uma pen vulgar, dá para gravar menos vezes que o eprom dp arduino.
> 
> e que tal ir gravando na memoria de uma forma sequencial...
> tipo fila, do seguinte modo.
> 
> tens uma zona onde está gravado variáveis, tudo o resto inicializado com um valor qualquer para saberes que está apagado. e de cada vez que vais gravar alguma coisa, á frente no endereço fisico dessa memoria vais meter os novos valores, apagando os anteriores com o tal valor para saberes que está apagado.
> 
> Assim se não tiveres muitas variáveis gravadas dava para gravares milhões ou mesmo biliões de vezes as tais variáveis sem a eprom se queixar...
> não sei se tás a perceber, embora tenhas de meter mais código... e de inicio o gajo pesquisar a memoria para ver onde estava os tais valores...
> ...


A pen dava muito jeito.

Gostava de conseguir fazer um ficheiro de escrita com data, hora e por exemplo as temperaturas do aquário e do dissipador dos leds.
De x em x tempo juntava uma linha ao ficheiro.
Quando me apetecesse tirava a pen do arduino e inseria no PC para ver os respectivos gráficos.

----------


## Hugo Figueiredo

> A pen dava muito jeito.
> 
> Gostava de conseguir fazer um ficheiro de escrita com data, hora e por exemplo as temperaturas do aquário e do dissipador dos leds.
> De x em x tempo juntava uma linha ao ficheiro.
> Quando me apetecesse tirava a pen do arduino e inseria no PC para ver os respectivos gráficos.


É o que pretendo fazer  :Olá: 

Não com uma pen, mas com um cartão SD enquanto não tenho o ethernet shield!

----------


## Nuno Prazeres

E como ligas o cartao ao arduino?

----------


## Hugo Figueiredo

> E como ligas o cartao ao arduino?


Tenho lá isso que vinha com o kit do arduino que comprei!

Ainda não testei mas é um leitor de cartões e podes ler e escrever...  :Pracima:

----------


## Nuno Prazeres

> Tenho lá isso que vinha com o kit do arduino que comprei!
> 
> Ainda não testei mas é um leitor de cartões e podes ler e escrever...


Então será disso que necessito. É caro?

----------


## Pedro Ferrer

Boa tarde

Ha LCD que trazem leitor de cartoes SD.

Abraco
Pedro Ferrer

----------


## Hugo Figueiredo

> Então será disso que necessito. É caro?


Se quiseres podes ficar com o meu para começar a brincar porque tão cedo nao vou tocar nisso...

----------


## Nuno Prazeres

> Se quiseres podes ficar com o meu para começar a brincar porque tão cedo nao vou tocar nisso...


Obrigado mas eu de início conto usar o meu arduino como mero temporizador.

Claro que gostaria que me controlasse tudo e mais alguma coisa.

O projecto seguinte vai ser ter um sensor na calha para desligar os brancos se a temperatura dela subir acima de 45 graus.

----------


## JoaoCAlves

Pois, o SDcard é a melhor opção para memória não volatil. Um cartão de 16megas faz maravilhas aqui!!!  :Big Grin: 

Mas isso, vai ficar para o fim!  :yb665:

----------


## Nuno Prazeres

> Mas isso, vai ficar para o fim!


Exacto. Há mais coisas para fazer antes.
Ainda assim o verdadeiro super projecto para mim vai ser mesmo tentar fazer um medidor de pH. Isso é que vai ser belo. Daqui a 5 anitos já deverei ter coragem para tal coisa.

----------


## Hugo Figueiredo

> Exacto. Há mais coisas para fazer antes.
> Ainda assim o verdadeiro super projecto para mim vai ser mesmo tentar fazer um medidor de pH. Isso é que vai ser belo. Daqui a 5 anitos já deverei ter coragem para tal coisa.


 5 anitos?

Eu chega-me hoje um que mandei vir por 15euros  :Admirado: 

Estou agora na dúvida é se monto eu o BNC ou se compro já o BNC shield feito...

Não faço a mínima se o medidor é alguma coisa de jeito ou não, mas por 15 resolvi experimentar... :Coradoeolhos:

----------


## Nuno Prazeres

Abusando do JoãoCAlves vinha juntar aqui mais uma nota que é tentar determinar como tirar o máximo partido do Arduino.

O João falou nestas possibilidades noutro post - postem mais!

- Medidor salinidade (necessário desenvolver hardware), 

- medidor/controlador ORP, PH (necessário desenvolver hardware),

- Controlador das bombas / wavemaker. (código já feito, circuito planeado, falta montar e testar). Nesta fase vai ser feito para bombas 24Vdc. (Resun 15000 e oceanprop 15000 e penso que as tunze entram neste bolo tb). Depois quero controlar bombas 220V tb.
Com isto quero tentar implementar marés.

- Medidor de desgaste das lampadas, (necessário desenvolver hardware, mas nada de complicado).

- Medidor / controlador temperatura, (necessário desenvolver hardware, mas nada de complicado).

- Ciclo Moonlight com led's. Os mesmos led's serviram para efectuar uma transição suave desde o inicio do ciclo do sol até arrancar os balastros, os balastros, o minimo é 1% de iluminação, o que é mt luz ainda. 


Outras banalidades como a reposição tb poderão vir a ser controladas. Isto é mt simples de implementar, mas pouco prioritário.

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Gráficos de tudo o que está atrás descrito.

+

TPA automática com possibilidade de controle do número de litros a trocar.

Screen Saver com Fotos do aquário

Tomadas controláveis em função de parâmetros dos sensores acima descritos ou então de um simples on/off

Envio por SMS do estado e possível interacção.

Sensor de alagamento

e ... quando me lembrar de mais logo vou postando!

----------


## Nuno Prazeres

Acrescento:
- um sensor de temperatura para a calha de iluminação para a poder desligar ou "dimar" em caso de falha da ventoinha;
- usar um sensor de pH no aquário e outro no reactor para controlar o CO2 via solenoide
- usar um sensor de pH no reactor de kalk para criar um alarme para colocar mais CaOH
- usar o sensor de pH do aquário para controlar um comutador que possa fazer passar a água de reposição pelo reactor de kalk se o pH estiver baixo ou directamente para a sump se estiver alto
- controlar peristálticas de adição de traces ou mesmo de phytoplancton usando um esquema que já tenho desenvolvido em papel (descrito em 
http://www.reefforum.net/f8/o-lado-n...a-forca-21939/)
- controlar a carga das baterias da UPS (visto e aprovadíssimo no sistema do António Vitor)
- um capturador de larvas de palhaços: durante os dias em que espera o nascimento, o arduino para a circulação por cerca de duas horas, 15 minutos depois do início do ciclo da noite, activando então os leds da armadilha respectiva - assim diria que não teremos que nos incomodar com a coisa e no dia seguinte teremos um bom grupinho de larvas ali à disposição (não percebo nada disso mas penso que também funciona com os Lysmata)

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Estou a ver é quando estas funcionalidades estiverem todas implementadas com cada um a trabalhar na sua, ainda fazemos uma cooperativa e aniquilamos os italianos e o alemães com o

TugaQuino ... 

 :yb624:  :yb624:  :yb624: 

Abraços,

P.S: a brincar a brincar .... era uma ideia!

----------


## Ricardo Pinto

> - um capturador de larvas de palhaços: durante os dias em que espera o nascimento, o arduino para a circulação por cerca de duas horas, 15 minutos depois do início do ciclo da noite, activando então os leds da armadilha respectiva - assim diria que não teremos que nos incomodar com a coisa e no dia seguinte teremos um bom grupinho de larvas ali à disposição (não percebo nada disso mas penso que também funciona com os Lysmata)


Uiiii..... o que tu foste fazer... abriste aqui uma caixa de Pandora para mim... Eheh!

Ora explica lá isso melhor? Como funcionam essas armadilhas? Pensava que nas primeiras horas, as larvas dos palhaços não conseguissem ver bem, que a luz lhes ofusca a vista. Até há quem recomende "tapar" o aquário totalmente, deixando só o topo aberto e com a luz natural da divisão. 
O que tu estás a dizer, é que se tivermos uma luz lusco-fusco, as larvas dirigem-se para lá? 

Às tantas era melhor abrirmos um tópico só para falarmos nestas coisas... Reprodução de peixes, cultura de fitoplancton, rotíferos, etc. 
Era interessante trocarmos ideias sobre isto.

----------


## Nuno Prazeres

> Uiiii..... o que tu foste fazer... abriste aqui uma caixa de Pandora para mim... Eheh!
> 
> Ora explica lá isso melhor? Como funcionam essas armadilhas? Pensava que nas primeiras horas, as larvas dos palhaços não conseguissem ver bem, que a luz lhes ofusca a vista. Até há quem recomende "tapar" o aquário totalmente, deixando só o topo aberto e com a luz natural da divisão. 
> O que tu estás a dizer, é que se tivermos uma luz lusco-fusco, as larvas dirigem-se para lá? 
> 
> Às tantas era melhor abrirmos um tópico só para falarmos nestas coisas... Reprodução de peixes, cultura de fitoplancton, rotíferos, etc. 
> Era interessante trocarmos ideias sobre isto.


Perto dos tubarões das reproduções que por aí andam eu sou um ignorante.  :Coradoeolhos: 
A minha taxa de sucesso é de 1/10000. Ou seja: já me devem ter nascido 10000 palhaços (ocellaris) no meu sistema (senão mais) e consegui fazer crescer um!!!
Mas vamos abrir um tópico. Por mim tudo bem.  :SbOk5:

----------


## Nuno Prazeres

De férias e a recuperar emocionalmente da catástrofe que me matou em horas o esforço de sete anos, tenho-me voltado para o Arduino.

Sendo absolutamente ignorante, limito-me a usar os ensinamentos aqui deixados e avancei então para a parte que mais me assustava: a relação do Arduino com o restante hardware.

Consegui já fazer o seguinte:
- controlar relays que funcionam a 5V.
- ligar e desligar uma ventoinha que funciona a 12V usando na comutação um mosfet IFRZ44N e duas resistências (100 ohms em série e 100 K em paralelo) para limpar melhor o sinal.
- controlar a velocidade da ventoinha por pwm usando o circuito acima.
- medir a temperatura ambiente usando um LM35DZ.

Acho que já tenho o básico para controlar a minha calha de leds/T5. É "só" juntar o diverso código e temporizar a coisa.

Já agora pergunto ao pessoal... Como levam o sinal de e para o arduino quando falamos de muito fio? Cabo de rede?
Eu vou ter o arduino no movel do aquário mas a caixa de balastros fica noutra divisão ao lado (fuz um buraco na parede enquanto a minha senhora estava fora  :yb665: ).

----------


## António Vitor

> De férias e a recuperar emocionalmente da catástrofe que me matou em horas o esforço de sete anos, tenho-me voltado para o Arduino.
> 
> Sendo absolutamente ignorante, limito-me a usar os ensinamentos aqui deixados e avancei então para a parte que mais me assustava: a relação do Arduino com o restante hardware.
> 
> Consegui já fazer o seguinte:
> - controlar relays que funcionam a 5V.
> - ligar e desligar uma ventoinha que funciona a 12V usando na comutação um mosfet IFRZ44N e duas resistências (100 ohms em série e 100 K em paralelo) para limpar melhor o sinal.
> - controlar a velocidade da ventoinha por pwm usando o circuito acima.
> - medir a temperatura ambiente usando um LM35DZ.
> ...


Eu uso cabo de rede, mas pode ser ainda mais fino, usei cabo de rede, porque era o que tinha mais à mão...(isto faz-me sempre lembrar do João Pinto do FCP)

aliás até a alimentação de cada buck uso cabo de rede.
são 24V a 700 e a 1A, e aguentam bem.
fazendo as contas em cima do joelho hehe, diria com os miseros mA até um fio com a espessura de um cabelo serviria.

----------


## Pedro Ferrer

Boa tarde




> Já agora pergunto ao pessoal... Como levam o sinal de e para o arduino quando falamos de muito fio? Cabo de rede?


Eu gosto de usar bornes para calha DIN...

Quanto aos fios, gosto de usar um cabo com a quantidade de condutores necessários... cada um dos condutores com 0.5mm2 deve chegar...

Abraço
Pedro Ferrer

----------


## JoaoCAlves

Boas.

Para transportar sinais DC, eu diria que qq cabo serve, tendo em conta a corrente de trabalho claro. Obviamente que se a distancia for grande, é preciso cuidado, mas isso não é normalmente o caso nos nossos aquarios.

Agora, sinais PWM, acho melhor usar cabos UTP e respeitar o pinout para garantir que o sinal é transportado no seu par. 

Para quem for construir PCB's, façam sempre pontos de massa. Se for só fiarada, juntem o mais possivel os fios de massa.

----------


## AntonioSilva

Desculpem a demora, mas o meu arduino veio avariado.
Reclamei e recebi o dinheiro de volta do paypal.
Ja recebi outro arduino entretanto

Agora mandei vir uma sonda de ph de 15 euros e um sensor de temperatura por 5 €.

Relativamente a colocar uma sonda de ph ou orp ou o que for a comunicar com o arduino na realidade não exige ciençia nenhuma, basta escolher uns ampops em condições para dc com um circuito de instrumentação.

A chatice é que cou usar um display de 2 linhas mas para min a informação chega, mas vou ter de adaptar a programação para o display porque o codigo original usa um display de 4 linhas I2C

Podem ver aqui. Main Page - Reef Projects

O que gostaria de acrescentar era a rede...uma coisa de cada vez.

Um abraço

----------


## Nuno Prazeres

Por falar numa coisa de cada vez, tenho andado a trabalhar com o LM35DZ como sensor de temperatura e já fiz a função que pretendo utilizar:
int Temperatura(int Pin)

Trata-se de devolver o valor da temperatura quando esta é lida a partir dum sensor ligado à entrada analógica de número "Pin". 

A precisão daquilo é razoável mas fica-se pela unidade grau. Não dá squer décimas.

Serve perfeitamente para monitorar a temperatura do dissipador dos leds mas para o aquário não chega.

Nota reiterada por me parecer importante: 100 ohms em série e 100k em paralelo tornam o sinal mais bem comportado. Por exemplo se o fio central se solta, assim a leitura passa a ser zero. Sem as resistências dá valores aleatórios que no meu caso poderiam disparar alarmes.


Outro assunto: display e keypad

Peço ajuda sobre onde comprar baratinho e já agora digam-mequantos pins vou " comer" entre os que serão usados e os que vão ficar tapados.

----------


## Pedro Ferrer

Bom dia Nuno




> A precisão daquilo é razoável mas fica-se pela unidade grau. Não dá sequer décimas.
> 
> Serve perfeitamente para monitorizar a temperatura do dissipador dos leds mas para o aquário não chega.


Usa '*analogReference(INTERNAL1V1)*' em vez de '*analogReference(DEFAULT)*'... coloca no 'Setup'
Aí sim, vais ter uma leitura mais precisa, pois estás a dar 1.1V à analógica... e assim reduz a margem de erro.

Atenção que assim colocas todas as analógicas a 1.1V... claro que quando acabas de ler a analógica da temperatura e pretendes ler outra que não trabalhe a 1.1V, terás então qur mudar novamente para '*analogReference(DEFAULT)*'... pelo que sei, não precisas de qualquer resistência...

Para teres décimas, terás que usar '.0' nas contas... ou seja, se necessitares de multiplicar por '100', terás que colocar '100.0'...
Para enviares essa info para o PC, fazes:
*Serial.print(temperaturaNunoPrazeres,3);* onde '3' é o número de casas decimais
*Serial.println(" C");*

(...)

Quanto ao display e keypad... os pins necessários varia...
Mas acho que com um display, adquirido com visão e não só para o actual momento, dispensa qualquer keypad...
Até um LCD de 2 linhas dispensa keypad...

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

Quanto ao sensor de temperatura nao posso dizzer nada porque uso o DB18S20 e tem precisão interessante... (estou a falar de sensores estanques à prova de água).

Quando ao keypad, partilho da opinião do Pedro. Acho perfeitamente dispensável para o efeito que queremos. No limite melhor e mais user friendly 5 botões chegam para fazer o interface. No limite pequeno 2 botoões são suficientes!  :Pracima:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Vê o que mandei vir ... ITDB02 Shield + 3.2" TFT WC

Se procurares por esta ref. no google chegas lá num instante.

são 30 e poucos USD e ja tem rtc, sd, touch, e TFT. 

As livrarias deles são uma treta mas ha um gajo que desenvolveu uma livraria própria que é excelente.

Abraços,

----------


## AntonioSilva

> Boas ,
> 
> Vê o que mandei vir ... ITDB02 Shield + 3.2" TFT WC
> 
> Se procurares por esta ref. no google chegas lá num instante.
> 
> são 30 e poucos USD e ja tem rtc, sd, touch, e TFT. 
> 
> As livrarias deles são uma treta mas ha um gajo que desenvolveu uma livraria própria que é excelente.
> ...


Viva

Estive a ver esse display mas houve uma coisa que me chamou a atenção, vai sobrar portas digitais depois de ligar isso ?

Um abraço

----------


## Rui Manuel Gaspar

Boas  :Olá: ,


Vai sim.
Ainda nao as contei mas acho que sobam pelo menos 16. 

Quando regressar de ferias e me dedicar a isso logo vos digo.

Abracos.

----------


## JoaoCAlves

Boas.

Vou ter um touchscreen a mais que dá para utilizar com os GLCD.

Se alguem estiver interessado que diga.

abraço

----------


## Pedro Ferrer

Boa tarde Nuno




> (...) tenho andado a trabalhar com o LM35DZ como sensor de temperatura


Já experimentaste fazer o que aconselhei neste post ?

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

> Boa tarde Nuno
> 
> 
> 
> Já experimentaste fazer o que aconselhei neste post ?
> 
> Abraço
> Pedro Ferrer


Boas! :Olá: 

Ainda não. Estou de férias em dedicação exclusiva à família. Os projectos práticos têm ficado em espera. Tenho aproveitado para ler mais umas coisas e reunir algum material que me fará falta para a calha de leds.

----------


## Nuno Prazeres

O projecto do sensor de temperatura com base na solução do Pedro Ferrer será aplicado amanhã. Vou tentar colocar dois sensores no breadboard correndo um deles com os 5V do costume e o outro com os tais 1.1V.

Vou ter que anda a mudar a analogReference no meio dos ciclos mas penso que se faz bem.

Estou curioso quanto a comparar a leitura dos dois.

Entretanto estou no "terreno" a ver mais hardware. O meu pinpoint monitor de pH berrou mas a sonda testada noutro aparelho está perfeita. Isto está mesmo a pedir que mande vir o stamp da Atlas:

http://atlas-scientific.com/_documents/pH_Stamp_2.6.pdf

Há também o RTC, um display e um SD card reader.

Acho que o melhor é seguir o conselho do Rui Gaspar e ir para isto:

3.2 TFT LCD Screen Module: ITDB02-3.2 3.2 TFT LCD Screen Module: ITDB02-3.2 [DIS002] - $27.50 : iStore, Make Innovation Easier

É mais barato do que comprar "à peça". Tem é pinos que nunca mais acabam...

O que é que acham?

----------


## JoaoCAlves

Pelo menos nesse, tens uma livraria para começar a brincar!  :Wink:

----------


## Nuno Prazeres

> Bom dia Nuno
> 
> 
> 
> Usa '*analogReference(INTERNAL1V1)*' em vez de '*analogReference(DEFAULT)*'... coloca no 'Setup'
> Aí sim, vais ter uma leitura mais precisa, pois estás a dar 1.1V à analógica... e assim reduz a margem de erro.
> 
> Atenção que assim colocas todas as analógicas a 1.1V... claro que quando acabas de ler a analógica da temperatura e pretendes ler outra que não trabalhe a 1.1V, terás então qur mudar novamente para '*analogReference(DEFAULT)*'... pelo que sei, não precisas de qualquer resistência...
> 
> ...


Feito com resultados mistos... :Admirado: 

Quando passo o analogicReference para "DEFAULT" ele aparentemente fica a 5 V para sempre já que nunca mais volta a 1.1V apesar da instrução estar lá. Curiosamente, a primeira leitura vem correcta. As seguintes dão cerca de 1/5 do valor pretendido.

Já coloquei delays para ver se é algum tema relacionado com tempos de reacção e os resultados são iguais. O site diz que as primeiras leituras após alteração da voltagem de referência poderão vir incorrectas mas sempre incorrectas é outra história...

Por outras palavras, assim que passo a coisa para 5V fica nos 5V toda vida...
 :Icon Cry: 

Alguma ideia??  :yb663: 

*/*
Verificação de temperaturas com voltagens de referência diferentes
A leitura de temperatura do aquário será a mais rigorosa pelo que usa 1.1 V como referência analógica
*/ 

int PinTempCalha = 0; // Pin de leitura da temperatura da calha
int PinTempAqua = 1; // Pin de leitura da temperatura do aquário
float TempCalha; // Temperatura da calha
float TempAqua; // Temperatura do aquário 

void setup()
{
  Serial.begin(9600); // inicializa comunicação série
}

void loop()
{
analogReference(INTERNAL1V1);
TempAqua = (1.1 * analogRead(PinTempAqua) * 100.0) / 1024.0; // obtém a temperatura do aquário
analogReference(DEFAULT);
TempCalha = (5.0 * analogRead(PinTempCalha) * 100.0) / 1024.0; // obtém a temperatura da calha

// imprime os valores das temperaturas
Serial.print("Aquario ");
Serial.print(TempAqua,1);
Serial.print("    Calha ");
Serial.println(TempCalha,1);

delay(1000); // espera um segundo
}*

----------


## Pedro Ferrer

Boa tarde Nuno

Entendo o que dizes... mas porque não obtens a 'TempCalha' com 1.1 em vez dos 5.0V ?

Pelo que entendo, ainda usas apenas 2 analógicas... depois com outras analógicas é que esse problema irá existir... 

Também me deparei com essa questão e ainda não a ultrapassei... 
Mesmo com amostras de leitura e não apenas leitura única...

Para já, abdiquei da leitura de temperatura para ter leituras de PH e ORP correctas, pois necessitam dos 5V...

(...)

Serial.*print*(TempAqua,1); não será Serial.*println*(TempAqua,1); ?

Abraço
Pedro Ferrer

----------


## JoaoCAlves

Boas.

Para ver se eu percebo, estão a ligar a sonda de temperatura directamente ao arduino sem amplificação no meio?

----------


## JoaoCAlves

> - usar um sensor de pH no reactor de kalk para criar um alarme para colocar mais CaOH


Boa, na me tinha lembrado dessa!  :Wink:

----------


## Nuno Prazeres

> Boa tarde Nuno
> 
> Entendo o que dizes... mas porque não obtens a 'TempCalha' com 1.1 em vez dos 5.0V ?
> 
> Pelo que entendo, ainda usas apenas 2 analógicas... depois com outras analógicas é que esse problema irá existir... 
> 
> Também me deparei com essa questão e ainda não a ultrapassei... 
> Mesmo com amostras de leitura e não apenas leitura única...
> 
> ...


Obrigado Pedro!

Pois é...

Já dei voltas e voltas e sai sempre mal.

Estava a obter duas temperaturas com referências diferentes para comparar a precisão dos dois resultados já que os transdutores estão lado a lado no breadboard.

Cheira-me a bug... vou ver se adiro a um Forum do Arduino para ver se obtenho alguma resposta.

Pois eu também vou querer pelo menos medir o pH.

Para já isto é um conjunto de blocos que ando a construir.

Ficam como função e mais para a frente compilo uma "livraria" (sempre gostei quando lhe chamar assim,  :yb624: ) com as que avançarem para o projecto.




> O da temper
> Serial.*print*(TempAqua,1); não será Serial.*println*(TempAqua,1); ?
> 
> Abraço
> Pedro Ferrer


Eu estou a escrever na mesma linha. Há um espacito antes da palavra "Calha".

Entretanto aqui fica a função definitiva, testada há meia hora. No exemplo já faço um carriage return line feed.  :SbSourire2: 

/*
Medição de temperatura com o LM35DZ.
A função usa 1.1 V como referência analógica e faz 10 leituras eliminando os dois valores extremos devolvendo a média dos restantes 8 valores
*/ 

float MedeTemperatura(int Pin)
{
  float Leituras[10]; // Array para registo de 10 leituras
  float Temperatura = 0; // Temperatura a apurar
  int i; // Contador simples
  float Maximo = -10; // Variável para registo do valor máximo das leituras
  float Minimo = 70; // Variável para registo do valor mínimo das leituras

  for(i = 0; i < 10; i++) // Efectua as 10 leituras
  {
    Leituras[i] = (1.1 * analogRead(Pin) * 100.0) / 1024.0; // Obtém leituras de temperatura
    Temperatura = Temperatura + Leituras[i]; // Soma todas as leituras
    if (Leituras[i] > Maximo) // Actualiza o valor máximo
    {
      Maximo = Leituras[i]; 
    }
    if (Leituras[i] < Minimo) // Actualiza o valor mínimo
    {
      Minimo = Leituras[i];
    }
  }
  Temperatura = (Temperatura - Maximo - Minimo)/8.0; // Elimina os dois valores extremos e apura a média dos restantes
  return Temperatura;
}  

// EXEMPLO DO USO DA FUNÇÃO COM DOIS SENSORES

int PinTempCalha = 0; // Pin de leitura da temperatura da calha
int PinTempAqua = 1; // Pin de leitura da temperatura do aquário

void setup()
{
  Serial.begin(9600); // Inicializa comunicação série
  analogReference(INTERNAL1V1); // Estabelece voltagem de referência
}

void loop()
{
// imprime os valores das temperaturas
Serial.print("Temperatura da Calha ");
Serial.println(MedeTemperatura(PinTempCalha),1);
Serial.print("Temperatura do Aquario ");
Serial.println(MedeTemperatura(PinTempAqua),1);

delay(5000); // Espera 5 segundos
}

----------


## AntonioSilva

Boas noites

O problema dos sensores é facilmente resolvido, coloca-se um ampop para amplificar a tensão da sonda de temperatura.
Ao fim ao cabo vão ter de colocar ampops para o sensor de ph, não o podem ligar directamente ao arduino sem terem um erro muito elevado de leitura.

Um abraço

----------


## Nuno Prazeres

> Boas noites
> 
> O problema dos sensores é facilmente resolvido, coloca-se um ampop para amplificar a tensão da sonda de temperatura.
> Ao fim ao cabo vão ter de colocar ampops para o sensor de ph, não o podem ligar directamente ao arduino sem terem um erro muito elevado de leitura.
> 
> Um abraço


Obrigado.

Por acaso já estava a pensar nisso devido ao tema do comprimento do fio.

Mas estou mais preocupado com eventual ruído.

A questão é que, bem vistas as coisas, admito erros de um grau centígrado desde que sistemáticos. O pior é se há ruído a perturbar algumas leituras (exemplo: bomba do repositor)...

----------


## AntonioSilva

Viva

Se usares um circuito de instrumentação não existe o problema de ruido, alem da alta impedançia de entrada o ruido é anulado, por isso é que a maior parte dos sensores tem-em 3 fios, fase e fora de fase e blindagem extra mas mesmo sem a blindagem ligada o circuito de instrumentação limpa o ruido.

Um abraço

----------


## JoaoCAlves

> Viva
> 
> Se usares um circuito de instrumentação não existe o problema de ruido, alem da alta impedançia de entrada o ruido é anulado, por isso é que a maior parte dos sensores tem-em 3 fios, fase e fora de fase e blindagem extra mas mesmo sem a blindagem ligada o circuito de instrumentação limpa o ruido.
> 
> Um abraço



Nem mais!

Acho que é preferivel isto do que andar a manipular a referência.

----------


## Nuno Prazeres

> Nem mais!
> 
> Acho que é preferivel isto do que andar a manipular a referência.


Obrigado aos dois. :tutasla: 

Vou por aí então. Mais para a frente vou tentar comparar com o resultado dum termómetro daqueles mais sensíveis.

----------


## AntonioSilva

> Obrigado aos dois.
> 
> Vou por aí então. Mais para a frente vou tentar comparar com o resultado dum termómetro daqueles mais sensíveis.


Necessitas de um esquema ?
Se quiseres diz qual o sensor que vais usar para a temperatura que eu coloco aqui o esquema para a saida ir perto dos 5 V.

Se quiseres coloco tambem o esquema para a sonda de ph.

Se quirerem usar outras sondas digam quais e entre que valores podem variar.

Um nota: o Arduino so lé tensões positivas se não estou enganado de maneira que na sonda de ph as tensões tem-em de ser convertidas, ou seja, uma sonda ph da valores entre os -500mV e +500mV mais ou menos de maneira que a saida tem de ser convertida entre 0 e 5 V.
Lembrem-se que a calibração do valor de saida ou é feita no ampop ou então por calculos na progamação do arduino que é o mais indicado.

Um abraço

----------


## JoaoCAlves

> Necessitas de um esquema ?
> Se quiseres diz qual o sensor que vais usar para a temperatura que eu coloco aqui o esquema para a saida ir perto dos 5 V.
> 
> Se quiseres coloco tambem o esquema para a sonda de ph.
> 
> Se quirerem usar outras sondas digam quais e entre que valores podem variar.
> 
> Um nota: o Arduino so lé tensões positivas se não estou enganado de maneira que na sonda de ph as tensões tem-em de ser convertidas, ou seja, uma sonda ph da valores entre os -500mV e +500mV mais ou menos de maneira que a saida tem de ser convertida entre 0 e 5 V.
> Lembrem-se que a calibração do valor de saida ou é feita no ampop ou então por calculos na progamação do arduino que é o mais indicado.
> ...


Sim mas para PH tens n circuitos disponiveis, não precisas matar a cabeça!  :Wink:

----------


## Nuno Prazeres

> Necessitas de um esquema ?
> Se quiseres diz qual o sensor que vais usar para a temperatura que eu coloco aqui o esquema para a saida ir perto dos 5 V.
> 
> Se quiseres coloco tambem o esquema para a sonda de ph.
> 
> Se quirerem usar outras sondas digam quais e entre que valores podem variar.
> 
> Um nota: o Arduino so lé tensões positivas se não estou enganado de maneira que na sonda de ph as tensões tem-em de ser convertidas, ou seja, uma sonda ph da valores entre os -500mV e +500mV mais ou menos de maneira que a saida tem de ser convertida entre 0 e 5 V.
> Lembrem-se que a calibração do valor de saida ou é feita no ampop ou então por calculos na progamação do arduino que é o mais indicado.
> ...


Obrigado!

Estou a usar o LM35DZ. O código está aqui : Função Temperatura.

A montagem é tão simples que até chateia:

5V dum lado, o pino onde se faz o analogRead ao meio e o GND do outro.



Quanto ao pH ainda me falta comer muitas linhas de código para lá chegar...  :Coradoeolhos:

----------


## Pedro Ferrer

Boa noite

Ainda bem que há alguém que percebe de electrónica :-)
Arduino  e electrónica estão intimamente ligados.
Infelizmente de electrónica nada pesco ... E o que vou aprendendo é graças às necessidades, de forma a cumprir objectivos.

Abraço
Pedro Ferrer

----------


## AntonioSilva

> Sim mas para PH tens n circuitos disponiveis, não precisas matar a cabeça!


Eu sei...mas alguns deles usam ampops que necessitam de muita corrente comparada com que a sonda de ph fornece, não sendo circuitos de instrumentação a escolha do ampop ainda complica mais, um dos melhores é o lcm6001 mas o preço até asusta, estou a pensar usar a linha dos opas da texas

Nuno, vou ver o circuito e amanha digo alguma coisa.

Um abraço

----------


## Nuno Prazeres

> Eu sei...mas alguns deles usam ampops que necessitam de muita corrente comparada com que a sonda de ph fornece, não sendo circuitos de instrumentação a escolha do ampop ainda complica mais, um dos melhores é o lcm6001 mas o preço até asusta, estou a pensar usar a linha dos opas da texas
> 
> Nuno, vou ver o circuito e amanha digo alguma coisa.
> 
> Um abraço


Obrigado.

Entretanto quanto ao pH estou a pensar em comprar isto: pH stamp para o Arduino.

----------


## JoaoCAlves

> Eu sei...mas alguns deles usam ampops que necessitam de muita corrente comparada com que a sonda de ph fornece, não sendo circuitos de instrumentação a escolha do ampop ainda complica mais, um dos melhores é o lcm6001 mas o preço até asusta, estou a pensar usar a linha dos opas da texas
> 
> Nuno, vou ver o circuito e amanha digo alguma coisa.
> 
> Um abraço


Podes usar qq ampop desde que tenha jfet na entrada (impedancia de entrada na ordem dos Teraohm).

O que vou fazer, é adaptar um circuito que encontrei que tinha precisamente o offset para 0-5V.

Vou pegar nesse circuito e mudar o andar de entrada, usando a configuração dos 3 ampops para instrumentação.

----------


## Nuno Prazeres

Já começo a ter ideias concretas sobre onde quero ir com o Arduino e onde quero parar.

Decidi não inventar demasiado mas sem deixar de revelar alguma ambição.

Os módulos que terei no loop serão 6:
0 - Parametrização (serve para acertar a data e hora)
1 - Iluminação (temporiza e faz o dimming dos leds do aquário e do refúgio)
2 - Temperatura (mede as temperaturas regulando ventoinhas e termostatos)
3 - Reposição (controla a reposição a partir de interruptores de boia)
4 - Aditivos (controla a adição de CO2 e peristálticas)
5 - Monitorização (verifica parametros e emite SMSs)

Há umas quantas variáveis dependentes do utilizador que provavelmente serão tratadas por via dum sistema de menus associado ao módulo de parametrização mas como são relativamente estáticas após calibração até pode ser que fiquem no código declaradas como constantes.

Exemplos:
Horas de iluminação e ritmo de dimming
Temperaturas limite
pH limite
Números de telefone para envio de sms
Frequência e tempos das peristálticas

Não quero demasiadas variáveis. Vou tentar definir umas coisas a partir das outras. Por exemplo quanto à variável temperatura, arranco com as ventoinhas logo que se atinjam 1,5 graus abaixo e desligo-as 2 graus abaixo.
No pH faço algo parecido, por exemplo desligo o CO2 a 0,1 do mínimo e ligo a 0,3 dele.

Em princípio só terei 4 entradas analógicas:
2 sensores de temperatura, um de pH e outro para verificar o nível de carga das baterias.
Entradas digitais serão 8:
4 boias de nível para regular a sump e o depósito de reposição, um detector de inundação diy e três interruptores para activar os modos TPA, enchimento do bidon de reposição e ausência prolongada (este estado activa o envio de sms com parâmetros críticos por exemplo de 4 em 4 horas).

Nos outputs conto 7 digitais a controlar relays e 5 pwm um para controlar o dimming dos leds brancos (o resto não terá dimming), 2 para as ventoinhas das calhas de leds (tanque e refúgio), um para a bomba do repositor e finalmente o último para fazer um alarme sonoro.

As peristálticas (serão duas) arrancarão mais tarde e penso que também precisam de dois pwm.

Vai ser um valente esparguete de fios. :EEK!: 

Ideias, sugestões, dúvidas, críticas...  :SbOk5:

----------


## Nuno Prazeres

Ando a matar a cabecinha com o analogReference.

Como não consigo mudá-lo durante o loop, fico preso aos 5V porque terei obrigatoriamente que usar essa tensão no stamp de pH e no RTC. Confirmam?

Mas para medir a temperatura muito jeito me dariam os 1.1V propostos pelo Pedro Ferrer.

----------


## Baltasar Parreira

Boas, Nuno podes usar outra voltagem tua de referencia desde que a tenhas a entrada do pino AREF e seja entre 0v a 5V que é o caso dos 1.1V que pretendes.

Lê isto que explica o que falo caso não tenhas visto ainda:
*Warning*

*Don't use anything less than 0V or more than 5V for external reference voltage on the AREF pin! If you're using an external reference on the AREF pin, you must set the analog reference to EXTERNAL before calling analogRead().* Otherwise, you will short together the active reference voltage (internally generated) and the AREF pin, possibly damaging the microcontroller on your Arduino board.

Alternatively, you can connect the external reference voltage to the AREF pin through a 5K resistor, allowing you to switch between external and internal reference voltages. Note that the resistor will alter the voltage that gets used as the reference because there is an internal 32K resistor on the AREF pin. The two act as a voltage divider, so, for example, 2.5V applied through the resistor will yield 2.5 * 32 / (32 + 5) = ~2.2V at the AREF pin.

----------


## Baltasar Parreira

Humm... Nuno agora que pesquisei mais nas minhas info verifico que já existe 1.1v só tens de usar o setup certo destes:

DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8 (_not available on the Arduino Mega_)INTERNAL1V1: a built-in 1.1V reference (_Arduino Mega only_)INTERNAL2V56: a built-in 2.56V reference (_Arduino Mega only_)EXTERNAL: the voltage applied to the AREF pin (*0 to 5V only*) is used as the reference.Pelo que percebi precisas é de ter mais que um ou mudar de vez em quando e isso?

Outra que me parece estas a fazer confusão é que os 5V presentes nos pinos 5V serão sempre 5V logo não à qualquer problema e os usares para alimentar o RTC.

----------


## Pedro Ferrer

Boa tarde




> Pelo que percebi precisas é de ter mais que um ou mudar de vez em quando e isso?


O Nuno tem o mesmo problema que eu e entretanto passei à frente, sem resolver o assunto...

Para ter uma leitura mais correcta da sonda de temperatura, é aconselhável usar 'analogReference(INTERNAL1V1)', função apenas para os Mega.

Mas para outras sondas... PH, ORP... que trabalham a 5V, é necessário usar
'analogReference(DEFAULT)'...

Acontece que é necessário estar sempre a comutar de uma referência para outra... e há algo que não funciona bem... pois as leituras passam a ser erradas... mesmo sabendo que as 1as leituras irão ser esquisitas... elas deveriam estabilizar, mas não parece ser o caso...

Nuno, com analogReference a 1.1V, cheguei a obter valores bem dentro do intervalo de 0.5º

21.7517642974º
21.8397789001º
21.6071357727º
21.6462440490º
21.9182052612º
21.5186367034º
21.4956054687º
21.5795688629º
21.7270050048º
21.7120819091º
21.8656406402º
21.7869682312º
21.7573280334º
21.3469219207º
21.6581382751º

Abraço
Pedro Ferrer

----------


## AntonioSilva

Boas tardes

Nuno...não me esqueci de ti....não tenho é tido tempo.

De qualquer maneira ja montei o circuito pata medir o ph, está em fase de testes no aquário, quero ver se é estável, para isso tenho outra sonda de ph ao lado para comparar valores e ver até que ponto é estável.

Depois coloco aqui o esquema para quem quiser montar, isto se não der problemas.

Relativamente ao redox....pelos vistos as sondas de ph medem o redox, pelo que li a sonda é a mesma a diferença é que a temperatura não interessa e em vez da saída aparecer em ph aparece em mV

Podem ver aqui pH -an index of Hydrogen's chemical activity in a solution -The degree of Acidity of a Substance

Um excerto

"Redox Measurements
The measurement of the oxidation-reduction potential of a solution is commonly called a redox measurement. This measurement gives an indication of oxidizing or reducing power of a solution. Since a pH meter is also a very good voltmeter, it can be used in making redox measurements. The sensing electrode used in this measurement is usually platinum, although gold and silver have been used for special purposes. The reference electrode is the same as that used in pH measurements. The electrode potential is usually expressed in millivolts ( mV ). Thus, most pH meters have a ( mV ) scale, as well as a pH scale. Also, since the temperature coefficient varies with the particular redox couple being measured, the temperature control is deactivated during the ( mV ) measurement. "

Quem tiver uma sonda de orp que teste para ver se é verdade ou não, se for vai ser muito simples.

----------


## Baltasar Parreira

Certo Pedro já tinha percebido +/- que poderia ser isso, no entanto não estou a ver problema em comutar mesmo tendo alguma instabilidade.

Na minha opinião para termos dados estáveis deveria-se fazer várias medidas de X em X tempo de uma sonda, depois saltar para outra sonda e fazer as mesmas 5 ou mais leituras e ir calculando uma média dessas leituras de cada sonda e guardar esses valores (PH, temperatura, outros), valores esses que serão os usados quando precisos ou os constantes escrito no LCD/outro.

Isto sendo um equipamento multi-medida ou multi-parâmetros eheheh... de monitorização permanente e não algo que enfiamos na agua e vemos o que dá naquele momento, pois se não o fizermos assim e até formos criar sistemas de alarme e etc., basta haver num segundo ou menos algo que sai fora dos parâmetros e dispara logo o alarme só porque uma leitura subiu ou baixou fora dos valores aceites.

A meu ver desta forma só teremos alarmes se os valores permanecerem mesmo dai para a frente por mais algum tempo superior o que é sinal que algo vai mesmo mal.

----------


## Nuno Prazeres

> Certo Pedro já tinha percebido +/- que poderia ser isso, no entanto não estou a ver problema em comutar mesmo tendo alguma instabilidade.
> 
> Na minha opinião para termos dados estáveis deveria-se fazer várias medidas de X em X tempo de uma sonda, depois saltar para outra sonda e fazer as mesmas 5 ou mais leituras e ir calculando uma média dessas leituras de cada sonda e guardar esses valores (PH, temperatura, outros), valores esses que serão os usados quando precisos ou os constantes escrito no LCD/outro.
> 
> Isto sendo um equipamento multi-medida ou multi-parâmetros eheheh... de monitorização permanente e não algo que enfiamos na agua e vemos o que dá naquele momento, pois se não o fizermos assim e até formos criar sistemas de alarme e etc., basta haver num segundo ou menos algo que sai fora dos parâmetros e dispara logo o alarme só porque uma leitura subiu ou baixou fora dos valores aceites.
> 
> A meu ver desta forma só teremos alarmes se os valores permanecerem mesmo dai para a frente por mais algum tempo superior o que é sinal que algo vai mesmo mal.


Boas!

Muito obrigado pela ajuda inestimável.

Começo por dizer que também obtenho leituras muito mais precisas com o LM35 referenciado a 1.1V. Depois como coloco numa matriz de 10 e apuro a média excluindo o maior  a coisa ainda fica mais estável. Estou portanto a ter os mesmos sucessos e insucessos que o Pedro.

Quanto ao accionar de alarmes e/ou intervenções directas sobre o equipamento o que tinha previsto era fazer o que diz o Baltasar. Nunca reagir a uma leitura isolada mas sim a um conjunto de leituras num determinado período que varia em função do que se está a medir.

Entretanto hoje fiz um alarme de inundação (depois da casa assaltada, trancas na porta) e matei a cabeça porque tinha muitos falsos positivos. Aprendi que aparentemente um sensor digital deve funcionar em HIGH por default caso contrário qualquer microcondução fazia-me disparar o alarme. Até o meu corpo estava a passar corrente suficiente. 

O Pedro Ferrer já tinha falado nisso penso que noutro tópico. O chatinho é que assim tenho que levar 3 fios até ao sensor. 5V (com uma resistência em série), o pin e GND. Estarei a ver mal a coisa?

----------


## Baltasar Parreira

Pois Nuno não estas a ver bem não ehhehe  :yb668: 

Só tens que no pino que queres saber se tens um sinal high ou low fazer entrar 0V ou 5V, portanto entra um destes sinais no float switch e sai para o teu pino de imput do Arduino, logo são só 2 fios mesmo.

Sorry... esqueci de dizer que depois no arduino em si tens de ter um pull up resitor (10K geralmente) ou a massa ou aos 5V consoante se queres por defeito LOW ou HIGH no teu pino do Arduino.

----------


## Nuno Prazeres

> Pois Nuno não estas a ver bem não ehhehe 
> 
> Só tens que no pino que queres saber se tens um sinal high ou low fazer entrar 0V ou 5V, portanto entra um destes sinais no float switch e sai para o teu pino de imput do Arduino, logo são só 2 fios mesmo.
> 
> Sorry... esqueci de dizer que depois no arduino em si tens de ter um pull up resitor (10K geralmente) ou a massa ou aos 5V consoante se queres por defeito LOW ou HIGH no teu pino do Arduino.


Boas!

Obrigado!  :yb677: 

Tentei fazer assim (pin ligado à massa por resistência de 10K) ficando assim o estado default em LOW e o sensor disparava-me só com a condução do meu dedo.

Atenção que não é um float switch. 

É uma placa de kit electrónico para DIY perfurada e com filas estanhadas.

Acho que se fizer o mesmo exercício com o pin invertido (pin ligado aos 5V pela resistência) talvez obtenha o resultado que quero mas só posso testar isso à noite.

Depois posto resultados e fotos. O projecto foi baseado nesta solução.

Fiquei aterrado com a idea de ter que levar 3 fios a todo e qualquer sensor digital. Sou mesmo maçarico... :yb624:   :yb624:   :yb624:

----------


## Pedro Ferrer

Boa tarde

Nuno, o meu sensor DIY também é baseado nessa mesma solução.
Ao contrário da placa, uso um cabo/fio com 2 condutores, cujos condutores têm ainda algum diâmetro...

Agora que falam nisso  :yb624:  ... o meu retorna HIGH quando em contacto com a água... 

Levo o GND, os 5V e retorno o valor... ou seja, uso 3 fios... não vejo qualquer transtorno nisso...

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

> Boa tarde
> 
> Nuno, o meu sensor DIY também é baseado nessa mesma solução.
> Ao contrário da placa, uso um cabo/fio com 2 condutores, cujos condutores têm ainda algum diâmetro...
> 
> Agora que falam nisso  ... o meu retorna HIGH quando em contacto com a água... 
> 
> Levo o GND, os 5V e retorno o valor... ou seja, uso 3 fios... não vejo qualquer transtorno nisso...
> 
> ...




Boa tarde,  :Olá: 

Obrigado Pedro!

Acabo de testar a versão a dois fios e com um default HIGH. O comportamento parece-me satisfatório ao nível do que tinha conseguido com os 3 fios. Com o default LOW a coisa parece que não me corre tão bem... mas deve ser sugestão ou erro no circuito.

Na versão que tenho agora aqui experimentei ligar o Vcc ao pin de leitura quer com 10K quer com 100K e não noto diferença.

Como se calcula a resistência a utilizar?

Meti uma resistência de 100 ohms em série com o sensor. Parece que é uma boa prática "arduínica". Não sei porque se faz mas a coisa mais sábia que um ignorante deve fazer é respeitar a sabedoria dos outros! :Coradoeolhos:

----------


## Baltasar Parreira

Nuno, o valor de 10K é um standard +/- para pull up resitor, no entanto até podes usar a interna de 20K do Arduino se não quiseres uma externa caso seja para teres o default como HIGH.

Pois sim ela existe lá dentro e pode ser activada da seguinte forma:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors


Se repares num pequeno esquema que existe no link da solução que estás a seguir vês esta imagem:




como vês nos fios/cobre que faz de sensor entra massa e sai o sinal que liga a resistência de 10K (pull up) que esta a pôr por defeito o input do arduino em high, correcto?  Logo só vão dois fios ao sensor.

----------


## Nuno Prazeres

Obrigado!

De facto estava a ver mal o filme. Contudo o Pedro até leva os 3 fios ao sensor. O meu problema maior começa a ser imaginar a gestão de tanta ligação e de tanto fio. O software preocupa-me claro mas não tanto.

E já agora... Porque tantas montagens têm uma resistência de 100 ohms em série na linha do pino?

----------


## Baltasar Parreira

Sim deverias colocar no teu caso também essa resistência, serve para evitar um curto-circuito caso por acidente ao testares/desenvolveres o teu software no Arduino fizeres para esse mesmo pino:

pinMode(pin, _OUTPUT_); 

Exemplos para defaults LOW e HIGH como já sabes:

----------


## JoaoCAlves

Boas Nuno.

A resistência de 100 ohms faz sentido qd se usa pwm e fet's.

O que acontece, é que o fet é como se tivesse um pequeno condensador entre a gate e a source, como tb tem entre a gate e o dreno. Qd aplicas alta frequencia a um fet, por causa deste condensador, há sempre corrente, e se não tiver a resistência, pode ser mesmo um momentaneo curto-circuito que iria danificar o microcontrolador com o tempo. Daí ser uma boa pratica colocar uam resistência de 100ohms entre o arduino e o fet.

Mas por exempo, se não fores usar pwm, ou seja, se for para fazer um simples switch electrónico, não necessitas da resitência. A resistência da gate do fet é praticamente infinita, a corrente é na ordem dos pico/micro amperes.

Nas restantes situações, é preciso ter sempre em conta que a corrente máxima das portas do arduino é 40mA. Posto isto, é aplicar lei de ohm para que a corrente seja sempre abaixo disto. 

Usa-se 10k nos pull-up/down pq não precisas de corrente, e com 10k, tens uma corrente de 500uA. Assim escusas de estar a dissipar energia na forma de calor no microcontrolador.

 :SbOk:

----------


## Baltasar Parreira

Correcto João, mas como respondi noutro post em casos do género de botões/float switch ou algo que feche o circuito entre 2 pontos sem grande resistência pode evitar um curto-circuito.

Aqui fica de novo exemplos de pull-up e pull-down resitor em que a de 100 ohm evita um desses curto-circuitos:



EDIT: Sorry... esqueci de dizer novamente que o curto-circuito só acontece se para esse pin acidentalmente no código se colocar um pinMode(pin, OUTPUT); !!!

----------


## JoaoCAlves

Certo baltasar, respondes-te enquanto eu escrevia!  :Big Grin: 

Mas por acaso, não concordo mt com essa abordagem.

Para essa situação, tens uma corrente na porta do microcontrolador de 50mA qd activas o switch, excedendo assim o limite do arduino.

Para esses casos, acho que se devia usar 1k.

Eu costumo, mesmo assim, fazer de outra forma, uso a técnica do divisor de tensão com uma resistência de 100k e 1k.

Ou seja, imaginando que quero que a porta esteja low, e que qd carrego no switch vá para high.

Coloco a resistência de 100k entre o arduino e massa. Entre o arduino e os 5V, coloco a resistência de 1k com o switch em serie.

Neste caso a res de 100k é o pull down. Qd se carrega no switch, como esta resitêcnia é 100 vezes maior que a de 1k, a tensão fica praticamente toda aos terminais dela, passando-se assim 5V para o arduino. Mas a corrente é mt baixa pq o arduino fica com a resistência de 1K entre ele e os 5V, neste caso, aproximadamente 5mA.

Já coloco um boneco.

----------


## Nuno Prazeres

Boa noite!

Mais uma vez obrigado.

Resumindo: pelo sim e pelo não meto essa resistência em série quer nos inputs quer nos output PWM (que vão todos dar a um fet). São duas ventoinhas para arrefecer as calhas de led, o motor de reposição e os leds coolwhite que serão os únicos que vou dimar. 

Os outros outputs são para relays com a nobre excepção do altifalante de alarme. Pelo esquema da placa de relays já existe uma resistência penso que mesmo de 100 na entrada. São 4 pins para a restante iluminação, um para fazer redundância ao termostato, um para ligar ventoinhas que ficarão apontadas para a queda de água que tenho no refúgio e finalmente outro para o solenoide do reactor. 

Tirando RTC e Display LCD 16x2 e depois o GSM os inputs serão os seguintes:
Analógicos:
pH,
Temperatura da calha,
Temperatura do tanque,
Carga da UPS

Digitais:
4 interruptores de boia
3 interruptores de estado do sistema: em TPA, a repor bidon de RO, utilizador ausente
1 detector de inundação
1 detector de falha de corrente (não sei o que vou usar até porque não tenho ainda a UPS mas no limite vou ter um relay sempre armado que se faltar a luz me mude o estado dum pino)

A especificação está terminada. Vai ser fio com fartura.  :EEK!:  o código como digo até será o menos complicado.

----------


## Baltasar Parreira

Sim João o que falas tecnicamente pode ser mais correcto, mas é pratica comum e funcional usar-se assim como disse. Certamente vais encontrar muitas montagens e esquemas idênticos, mas lá está se não nos enganar-mos e não colocarmos o pino como OUTPUT nem e preciso resistência nenhuma a entrada do Arduino só mesmo o pull-down ou up consoante o caso.

----------


## JoaoCAlves

Ok, mas na minha opinião não devia ser feito, mas vale o que vale!  :Coradoeolhos: 

É certo que normalmente o switch está pressionado por pouco tempo, mas mesmo assim está-se a stressar o microcontrolador sem necessidade.

Em todo o caso, deixo esquema do que costumo fazer.

Isto é um exemplo com pull-down. Para pull-up é só inverter os componentes em relação à porta do arduino!  :SbOk2:

----------


## Nuno Prazeres

> Sim João o que falas tecnicamente pode ser mais correcto, mas é pratica comum e funcional usar-se assim como disse. Certamente vais encontrar muitas montagens e esquemas idênticos, mas lá está se não nos enganar-mos e não colocarmos o pino como OUTPUT nem e preciso resistência nenhuma a entrada do Arduino só mesmo o pull-down ou up consoante o caso.


Já agora... Presumo que os pins estejam por default em modo INPUT. Caso contrário o Arduino ficaria muito mais exposto à asneira de tótós como eu.

----------


## Baltasar Parreira

Correcto Nuno por defeito são sempre como INPUT, logo nem precisas de colocar comandos pinMode(pin, INPUT); se só queres portas de entrada.

----------


## Hugo Figueiredo

Nuno, já testaste os relés para 220v com o arduino?
Que relé tens? fizeste tu ou é daqueles já prontos a ligar?

----------


## Nuno Prazeres

> Nuno, já testaste os relés para 220v com o arduino?
> Que relé tens? fizeste tu ou é daqueles já prontos a ligar?


Boas Hugo!

Comprei dois módulos de 4 no ebay. Os relays são de 12V mas a pcb vem com um pré circuito que permite operá-los com os 5V do Arduino.

Não são caros e aquilo é plug&play mas para quem quer fazer "à mão" penso que há uma solução mais eficaz e elegante que passa por usar umas coisas que nem sei bem o que são chamadas triacs e optoconectores.

----------


## Hugo Figueiredo

> Boas Hugo!
> 
> Comprei dois módulos de 4 no ebay. Os relays são de 12V mas a pcb vem com um pré circuito que permite operá-los com os 5V do Arduino.
> 
> Não são caros e aquilo é plug&play mas para quem quer fazer "à mão" penso que há uma solução mais eficaz e elegante que passa por usar umas coisas que nem sei bem o que são chamadas triacs e optoconectores.


Pois, eu tenho 1 de 16 saídas  :yb665: 

e era para saber se ja tinhas testado...  :SbOk:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Nuno, já testaste os relés para 220v com o arduino?
> Que relé tens? fizeste tu ou é daqueles já prontos a ligar?


Os que eu comprei são prontos a ligar.

Ligas a massa, o pin que queres de saída na entrada do Relay (5v) e ligas 220 no relé em que podes ligar Normalmente aberto ou Normalmente fechado!



Mais simples é difícil.

Abraços,

----------


## Nuno Prazeres

Já testei e funciona na perfeição. Aliás um veio avariado com dois dos leds de aviso partidos e eu tive que soldar uns de tamanho jumbo e aquilo ficou a funcionar. O minha lendária falta de habilidade para soldar foi testada ao limite.  :yb624:   :yb624:   :yb624:

----------


## Hugo Figueiredo

> Boas ,
> 
> 
> 
> Os que eu comprei são prontos a ligar.
> 
> Ligas a massa, o pin que queres de saída na entrada do Relay (5v) e ligas 220 no relé em que podes ligar Normalmente aberto ou Normalmente fechado!
> 
> 
> ...


Pois parece que é bem mais recomendável alimentar pelos 12v ou mesmo os 5v mas nunca pelo arduino.

Convém alimentar este modulo separadamente do arduino.  :Pracima:

----------


## Rui Manuel Gaspar

boas  :Olá: ,

Nao tenho nada para alimentar nada !

Aquilo pelo que posso ver e os 5v e so para activar o rele. Mais nada. Nao tem alimentacao suplementar.

Abracos.

----------


## Nuno Prazeres

Hugo,

Os relays em causa, se excitados directamente pelos seus próprios pinos só começam a comutar nos 9V. Abaixo disso parecem campaínhas.

Ora a placa em que estão tem um circuito que amplifica a tensão dos 5 do Arduino para os 12 do relay sendo que a respectiva intensidade necessária ronda os 15mA que é 75% do que larga o pino do nosso Arduino.

É por isso que contrariamente a um circuito de relay simples onde só necessitas do controlo e da massa, aqui tens que juntar o Vcc de 5V para que se possa alimentar o amp-op que cada relay tem associado.

Se fores daqueles que usa um coeficiente de cagaço de 50% no que toca a potências eléctricas então não vás por esta solução. Se achas 75% aceitável é de facto difícil arranjares melhor como bem diz o Rui.

----------


## António Vitor

> Hugo,
> 
> Os relays em causa, se excitados directamente pelos seus próprios pinos só começam a comutar nos 9V. Abaixo disso parecem campaínhas.
> 
> Ora a placa em que estão tem um circuito que amplifica a tensão dos 5 do Arduino para os 12 do relay sendo que a respectiva intensidade necessária ronda os 15mA que é 75% do que larga o pino do nosso Arduino.
> 
> É por isso que contrariamente a um circuito de relay simples onde só necessitas do controlo e da massa, aqui tens que juntar o Vcc de 5V para que se possa alimentar o amp-op que cada relay tem associado.
> 
> Se fores daqueles que usa um coeficiente de cagaço de 50% no que toca a potências eléctricas então não vás por esta solução. Se achas 75% aceitável é de facto difícil arranjares melhor como bem diz o Rui.


não estava a perceber...ha nesses "shields" têm de alimentar o relé separadamente, pois...
o arduino não consegue alimentar directamente relés...quer dizer poder pode...
mas pode gripar...
lol

----------


## Rui Manuel Gaspar

Boas :Olá: ,

Mas eu na foto que mostro so tenho 5 pinos.

Um e o ground e os outros 4 para alimentar o rele. 

Ver se consigo fazer um teste simples ate ao fim das ferias e depois digo-vos algo.

Abracos,

----------


## Hugo Figueiredo

> Hugo,
> 
> Os relays em causa, se excitados directamente pelos seus próprios pinos só começam a comutar nos 9V. Abaixo disso parecem campaínhas.
> 
> Ora a placa em que estão tem um circuito que amplifica a tensão dos 5 do Arduino para os 12 do relay sendo que a respectiva intensidade necessária ronda os 15mA que é 75% do que larga o pino do nosso Arduino.
> 
> É por isso que contrariamente a um circuito de relay simples onde só necessitas do controlo e da massa, aqui tens que juntar o Vcc de 5V para que se possa alimentar o amp-op que cada relay tem associado.
> 
> Se fores daqueles que usa um coeficiente de cagaço de 50% no que toca a potências eléctricas então não vás por esta solução. Se achas 75% aceitável é de facto difícil arranjares melhor como bem diz o Rui.


Pois, agora multiplica isso por 16 (no meu caso) ou 4 (no teu)...




> não estava a perceber...ha nesses "shields" têm de alimentar o relé separadamente, pois...
> o arduino não consegue alimentar directamente relés...quer dizer poder pode...
> mas pode gripar...
> lol


Pois foi o que me constou... :SbOk: 

Não pesco nada de electronica entenda-se, estou só a mandar postas de pescada!  :Admirado:

----------


## Nuno Prazeres

Os meus não são shields. Ligam-se ao Arduino por fio. Têm 6 pinos. Vcc, Gnd e os 4 de controlo.

Rui, se interpreto correctamente as tuas fotos, parece-me que os teus são iguais. Diferem dos meus apenas na cor dos relays, no tipo de leds e por parecerem ter um led indicador de carga na placa.

----------


## JoaoCAlves

Boas.

Têm um datasheet desse shield?

Eu digo já para não alimentarem isso pelo arduino, mas só vendo o datasheet.

Que relés são usados? têm marca e referência visivel? podem tirar uma foto que apanhe com detalhe a parte escrita do relé?

----------


## Pedro Ferrer

Boa noite

Por aquilo que conheço, os 5V do Arduino, deveria apenas ser usado para abrir um caminho via um integrado, por onde passaria os 12V ou os 220V, conforme a sua bobine.

Por exemplo, os relés que uso têm uma bobine de 12VDC, mas suportam até 300W.
Assim sendo, uso os 5V para deixar passar os 12V de modo a comutar a bobine... depois a partir daí posso usar corrente DC ou AC... até 10A.

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Pelas fotos colocadas as boards de relay do Rui parecem ter este esquema por cada um dos canais:




Sendo assim não à qualquer problema em ligar directo aos pinos de controle do Arduino pois tem um *optoacoplador* por cada canal que isola totalmente o Arduino do resto do circuitos da Board. Este *optoacoplador* só faz ligar/desligar os 12V de entrada na board para alimentar a bobine de cada relé. depois os reles em si podem comutar qualquer voltagem AC ou DC até 10A.

EDIT: Foto maior que penso ser a mesma board para verem melhor as características dos reles.

----------


## Baltasar Parreira

A mesma versão mas com reles com bobine de 5V, aqui poderá ser usada a mesma fonte de alimentação do Arduino para alimentar a board desde que esta tenha no mínimo 1A, pois cada bobine dos reles consome cerca de 15-20mA.



Notar o jumper amarelo que faz bypass da alimentação da board (vcc) e assim os 5V de entrada poderem servir para alimentar as bobines dos reles quando accionados. Caso queiram usar uma fonte de alimentação externa só tem de retirar o jumper e fornecer no pino certo dele os 5V com outra fonte externa, depois ligar as massas que vem do Arduino a board com a dessa fonte externa.

----------


## Baltasar Parreira

Outra variante penso também aqui já falada, desta vez em shield para encaixar directo por cima dos Arduino:



Como vêm esta tem uma ficha de entrada para ligação de fonte de alimentação externa pois as bobines dos reles são de 9V.

----------


## JoaoCAlves

Ok.

Mas o que digo que não se deve ligar ao arduino, é os 5V de alimentação da board de relés. Esse 1A pode ser demasiado para o regulador interno, caso se esteja a utilizar alimentação externa do arduino. Se o arduino for alimentado por USB, então é mesmo para esquecer.

Acho que essas boards têm uma entrada de 12V para alimentar os circuitos driver dos relés. Essa alimentação é que deve ser usada a partir duma fonte externa ao arduino.

Depois como disse o Baltasar, é só ligar as massas e os pinos de controlo que se pretende.

----------


## JoaoCAlves

> Pelas fotos colocadas as boards de relay do Rui parecem ter este esquema por cada um dos canais:
> 
> 
> 
> 
> Sendo assim não à qualquer problema em ligar directo aos pinos de controle do Arduino pois tem um *optoacoplador* por cada canal que isola totalmente o Arduino do resto do circuitos da Board. Este *optoacoplador* só faz ligar/desligar os 12V de entrada na board para alimentar a bobine de cada relé. depois os reles em si podem comutar qualquer voltagem AC ou DC até 10A.
> 
> EDIT: Foto maior que penso ser a mesma board para verem melhor as características dos reles.


Sim, o esquema se não é esse é muito parecido, mas tb me parece ser isso.

O que deprendo então que a placa tem que ser alimentada a 12V sómente.

O pino que vai ao arduino, passa pelo led do optoacupolador e ainda um outro led mais uma resistência até chegar a vcc (12V). Esta resitência em conjunto com o led e o opto fazem com que a queda de tensão seja suficiente para que chegue somente 5V ao arduino. Neste circuito, o arduino vai ligar o relé qd a porta for posta em LOW.

Pelo menos, é o que deprendo do circuito...

----------


## Baltasar Parreira

Sim claro estás correcto João, se o Arduino estiver a ser alimentado pelo USB não dá pois as saídas USB dos PC só conseguem fornecer uns meros miliamperes e podem queimar logo.

Alimentando o Arduino com uma fonte externa de 5v @1A e só alimentar a board também caso os reles sejam dos com bobine para 5V.

Eu nunca uso o regulador integrado do Arduino uso sempre uma boa fonte estabilizada de 5V e ligo directo no pino de 5V da board do Arduino, assim não existe qualquer problema desse mesmo ou outro pino 5V (existe mais que um) ligar ao pino VCC da board de reles, mais uma vez se esta tiver reles de 5V.

Usando a ficha de alimentação do Arduino com uma qualquer fonte de 7V- 12V o regulador interno poderá realmente não ter capacidade para o consumo total das coisas ligadas no arduino + a board dos reles.

----------


## JoaoCAlves

> Eu nunca uso o regulador integrado do Arduino uso sempre uma boa fonte estabilizada de 5V e ligo directo no pino de 5V da board do Arduino, assim não existe qualquer problema desse mesmo ou outro pino 5V (existe mais que um) ligar ao pino VCC da board de reles, mais uma vez se esta tiver reles de 5V.


Essa é outra hipotese, desde que não se vá alem dos 2A julgo que não há problema.

Mas aqui a questão é mais que é preciso dar 12V à board de relés, o que inviabiliza puxar alimentação do arduino á board.  :SbOk2:

----------


## Baltasar Parreira

Não João se os reles onboard forem de 12V tens de retirar o jumper e assim tens VCC para ligar ao VCC do arduino e teres os 5V de controle a fornecer aos optoacupoladores, no jumper aberto ficas com um pino que será o JD-VCC ai terás de ligar o positivo da fonte externa dos 12V só para alimentar as bobines dos reles e juntar a massa dessa fonte com a massa do arduino.

Como disse caso os reles sejam de 5V então o jumper fica fechado e assim o VCC vindo do arduino serve para activar quer os optoacupoladores quer as bobines dos reles, isto claro como já falado caso a fonte do Arduino seja uma externa de pelo menos 1A já com 5V regulados sem usar o regulador interno do Arduino. Neste caso como falado também a board dos reles não necessita de qualquer fonte externa.

----------


## Nuno Prazeres

As minhas placas são da versão jumper amerelo.

Devo dizer que os relays não têm especificação da respectiva tensão mas ligando directamente uma fonte aos seus pinos de controlo verifiquei que só a partir dos 9V é que o relay começa a comutar. Antes faz efeito besouro nomeadamente se alimentados a 5V.

Contudo, ligando o arduino aos pinos da placa e sem fonte externa eles comutam perfeitamente. Não percebo nada de electronica mas se com 5 directos não funcionam mas com 5 via circuito já dão, diria que o circuíto deve permitir puxar a tensão para cima de alguma forma.

O meu arduino no teste dos relays estava a ser alimentado via USB mas provavelmente a curta duração deste não permitiu ver resulados que expusessem a limitação que vocês apontam.

----------


## Baltasar Parreira

Nuno para testares isso bem retira o jumper e liga no pino do jumper que referi os 5V (JD-VCC) e a massa e vê se o relê fecha, ao ligares de outra forma podes estar a dar controlo também ao optoacupolador e haver ai o tal efeito liga/desliga rápido (besouro que ouves). Mas nos reles não tem mesmo qualquer indicação/referencia de nada?

----------


## JoaoCAlves

> Não João se os reles onboard forem de 12V tens de retirar o jumper e assim tens VCC para ligar ao VCC do arduino e teres os 5V de controle a fornecer aos optoacupoladores, no jumper aberto ficas com um pino que será o JD-VCC ai terás de ligar o positivo da fonte externa dos 12V só para alimentar as bobines dos reles e juntar a massa dessa fonte com a massa do arduino.
> 
> Como disse caso os reles sejam de 5V então o jumper fica fechado e assim o VCC vindo do arduino serve para activar quer os optoacupoladores quer as bobines dos reles, isto claro como já falado caso a fonte do Arduino seja uma externa de pelo menos 1A já com 5V regulados sem usar o regulador interno do Arduino. Neste caso como falado também a board dos reles não necessita de qualquer fonte externa.


Ok, pera, na tava a ver o jumper. Mas o jumper, é na 2ª versão, na 1ª, não existe jumper nenhum, eu tava a falar da 1ª. E nesta tem que ser 12V o vcc para aquilo funcionar.

Sim, concordo com o que dizes, na 2ª versão pode ficar o jumper desde que se acautele a alimentação do arduino.

Sorry, não vi o 2º caso.

----------


## JoaoCAlves

Nuno, tira uma foto à board em macro e coloca aqui!  :Wink:

----------


## Nuno Prazeres

Vou tentar então ligar uma fonte independente ao jumper e ver se aquilo funciona. Os relays têm a referência SRD-05VDC-SL-C. Leva a supor que se aguentam com 5V DC mas pelo menos os meus aparentemente só de 9V para cima é que estabilizaram.

Enfim... O melhor mesmo será jogar pelo seguro e, já que penso alimentar o Arduino com 5V regulados via Vin, uso essa mesma fonte para as placas de relays.

Vou ter vários relays ligados umas largas horas seguidas. Ainda que só puxem 15mA no pino de controlo, não faço ideia de quanto puxam no Vcc. 

Ainda que venha a medir esse valor com um amperímetro e me dê um valor baixinho, a vossa intervenção já deu para perceber que estou a tentar os electro-demónios.

Quanto a fotos estou só com smartphone e não consigo publicar mas é exactamente igual à segunda do Baltasar (tirando dois leds vulgares que eu tive que soldar lá porque os originais vinham partidos).

Obrigado!

----------


## Hugo Figueiredo

O meu de 16 saídas é o da 1ª hipótese, sem jumper!  :Olá:

----------


## Pedro Ferrer

Bom dia

Eu continuo a afirmar que o Output do Arduino serve apenas para *abrir* caminho para os 12V (para actuar bobine do relé) provenientes de uma fonte externa.

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

Bom dia Pedro,

Se assim fosse eu não conseguiria comutar os relays apenas com o arduino alimentado via USB e o facto é que consigo.

----------


## Baltasar Parreira

Nuno essa referencia é porque os reles tem bobine de 5V logo podem mesmo ser alimentados directos pelo pino 5V do Arduino por USB desde que o circuito total Arduino + Board reles + outros não ultrapasse 500900mA @ 5 V  pois é o limite de uma porta USB de um PC.

Se usares uma fonte externa regulada de 5V no mínimo de 1000mA ligada aos pinos 5V de todas as boards estás a vontade.
Não convém usares o VIN do Arduino pois este passa pelo regulador interno do mesmo e pode não conseguir aguentar com o consumo se depois puxares tudo que é 5V dele. Vou procurar informação sobre que regulador estão a usar para ver o seu limite de corrente.

Pedro como dizes e bem, se no caso das bobines dos reles forem de 12V este sim terá de ser alimentado por uma fonte externa de 12V para poder actuar essas bobines, e os 5V serão só para alimentar os optoacupoladores de forma a estes fecharem e deixarem passar esses 12V para as bobines dos reles e estes fecharem.

Portanto Hugo, penso que estejas também nesta ultima situação, mas se deres a referencia escrita nos reles ou uma macro da caixa deles por cima logo confirmamos se são realmente de 12V ou outra diferente dos 5V.

----------


## Hugo Figueiredo

> Nuno essa referencia é porque os reles tem bobine de 5V logo podem mesmo ser alimentados directos pelo pino 5V do Arduino por USB desde que o circuito total Arduino + Board reles + outros não ultrapasse 500–900mA @ 5 V pois é o limite de uma porta USB de um PC.
> 
> Se usares uma fonte externa regulada de 5V no mínimo de 1000mA ligada aos pinos 5V de todas as boards estás a vontade.
> Não convém usares o VIN do Arduino pois este passa pelo regulador interno do mesmo e pode não conseguir aguentar com o consumo se depois puxares tudo que é 5V dele. Vou procurar informação sobre que regulador estão a usar para ver o seu limite de corrente.
> 
> Pedro como dizes e bem, se no caso das bobines dos reles forem de 12V este sim terá de ser alimentado por uma fonte externa de 12V para poder actuar essas bobines, e os 5V serão só para alimentar os optoacupoladores de forma a estes fecharem e deixarem passar esses 12V para as bobines dos reles e estes fecharem.
> 
> Portanto Hugo, penso que estejas também nesta ultima situação, mas se deres a referencia escrita nos reles ou uma macro da caixa deles por cima logo confirmamos se são realmente de 12V ou outra diferente dos 5V.


O meu é este:

Ou seja, tem:
- 2 pinos para GND
- 2 pinos para 5V
- GND + 12V em terminais de fio

Os relés acho que são de 12V...

----------


## Baltasar Parreira

Ok mistério resolvido eheheh  :Coradoeolhos: , de acordo com o esquema quer da ultima versão do Arduino (UNO) quer anteriores (Duemilanove) e mesmo o novo Mega2560 ou antigo Mega, todos usam o regulador *MC33269D-5.0* que de acordo com o PDF tem um limite de corrente nos 800mA.

Assim sendo se o consumo total do vosso circuito Arduino+ board reles+ outros não for superior a isto podem usar quer o pin VIN que a ficha de entrada para ligar fontes externas de 7V-12V e depois retirar dos pinos 5V alimentação para tudo que necessite 5V.

Aqui ficam os esquemas de todos os Arduinos:

- Uno (http://arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf)
- Duemilanove (http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf)
- Mega2560 (http://arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf)
- Mega (http://arduino.cc/en/uploads/Main/arduino-mega-schematic.pdf)

Procurem na zona do circuito de alimentação que em todos irão ver o *MC33269D-5.0*, fica aqui o datasheet dele para verem as características bem como o limite de 800mA dele:

http://www.datasheetcatalog.org/datasheet/motorola/MC33269D-5.0.pdf


Espero que assim fique esclarecido a diversas forma de alimentar tudo.

----------


## Hugo Figueiredo

> Ok mistério resolvido eheheh , de acordo com o esquema quer da ultima versão do Arduino (UNO) quer anteriores (Duemilanove) e mesmo o novo Mega2560 ou antigo Mega, todos usam o regulador *MC33269D-5.0* que de acordo com o PDF tem um limite de corrente nos 800mA.
> 
> Assim sendo se o consumo total do vosso circuito Arduino+ board reles+ outros não for superior a isto podem usar quer o pin VIN que a ficha de entrada para ligar fontes externas de 7V-12V e depois retirar dos pinos 5V alimentação para tudo que necessite 5V.
> 
> Aqui ficam os esquemas de todos os Arduinos:
> 
> - Uno (http://arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf)
> - Duemilanove (http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf)
> - Mega2560 (http://arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf)
> ...


Para quem percebe minimamente de electronica acho que sim, agora para mim isso não me diz nada.. lol

Resumindo, o melhor e pelo sim pelo não é alimentar externamente por 12V, certo?

----------


## Baltasar Parreira

Correcto Hugo no teu caso os teus reles são de 12V, logo terás de ter uma fonte externa ligada ao terminal azul que diz 12V+ e GND.

Os outros terminais 5V e GND serão para ligar aos respectivos 5V e massa do Arduino e assim teres voltagem para alimentar os optoacupoladores, mas penso estar a ver um regulador integrado nessa board também o que me leva a querer que do input da fonte externa de 12V eles fazem 5V para alimentar os optoacupoladores e assim só tens de ligar tudo que é massa para teres a referencia quando mandas algum sinal nos pinos de saída do Arduino eles actuarem, mas teria de se ver o esquema ou ter um zoom grande daquele IC grande deitado perto dos condensadores electrólitos e terminal azul dos 12V.

----------


## Hugo Figueiredo

> Correcto Hugo no teu caso os teus reles são de 12V, logo terás de ter uma fonte externa ligada ao terminal azul que diz 12V+ e GND.
> 
> Os outros terminais 5V e GND serão para ligar aos respectivos 5V e massa do Arduino e assim teres voltagem para alimentar os optoacupoladores, mas penso estar a ver um regulador integrado nessa board também o que me leva a querer que do input da fonte externa de 12V eles fazem 5V para alimentar os optoacupoladores e assim só tens de ligar tudo que é massa para teres a referencia quando mandas algum sinal nos pinos de saída do Arduino eles actuarem, mas teria de se ver o esquema ou ter um zoom grande daquele IC grande deitado perto dos condensadores electrólitos e terminal azul dos 12V.


Pois, eu tinha para mim (que não vale nada, claro está) que teria de alimentar esta board por 12v + gnd com uma fonte externa e depois só ligava o respectivo pino ao arduino, sem gnd e sem 5v...

----------


## Baltasar Parreira

Hugo encontrei o esquema da tua board é este que vai em attach, tal como pensava usa um regulador* LM2576* para dos 12V fazer 5V.

Mas tens de ligar as massas (GND) do Arduino e a board dos reles, pois caso contrario não tinhas sinal de referencia e só mandar sinal por uns dos outputs do Arduino não iria funcionar correctamente.

----------


## JoaoCAlves

Não, o gnd tens que ligar sempre, senão não passo o sinal de controlo do arduino para a board.  :Wink:

----------


## JoaoCAlves

Epa, o lm2576 vai até 3A!!

podes é usar a board de relés para alimentar o arduino!!!!  :SbSourire2:

----------


## Baltasar Parreira

Eheheheh... o fórum devia ter uma protecção tipo lock qualquer, assim quando alguém está a colocar um post mais ninguém poderia colocar outro até este terminar.

Somo tão rápidos que acabamos de responder as mesmas coisas em posts seguidos  :Coradoeolhos: ...

EDIT: Correcto João, uma boa fonte de 12V a entrada dos 12V+ na board dos reles e depois temos os 5V para ligar e alimentar o Arduino bem como tudo que necessite de 5V.

----------


## JoaoCAlves

Pois!

é melhor irmos bater bolas para o chat!!!

----------


## Pedro Ferrer

Boa tarde




> uma boa fonte de 12V (...) 5V para ligar e alimentar o Arduino bem como tudo que necessite de 5V.


Já há algum tempo que ando a namorar esta fonte para esse efeito...
Mean Well D-60A - 56W Dual Output AC-DC Enclosed Switching PSU

(...)

O que essas placas de relés fazem, faço eu com um ULN*2803* (elas usam o ULN*2083*) e respectivos relés (dá para 8 relés)...
Nada mais... O ULN2803 suporta até 50V, ou seja, quem use fontes de 48V, está à vontade...

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Pedro, não é preciso ir para uma fonte tão XPTO, mas claro se preferes é sempre bom e só trás mais segurança ainda.

Para se ter uma boa fonte barata a dar quer 5V quer 12V basta comprar uma fonte ATX para PC, estas debitam os 12V e 5V a boas amperagens, tem protecção sobre curto-circuitos e não custam mais que cerca de 20eur a 30eur para uma normal de 100W-150W.

----------


## Pedro Ferrer

Boa tarde




> Para se ter uma boa fonte barata a dar quer 5V quer 12V basta comprar uma fonte ATX para PC, estas debitam os 12V e 5V a boas amperagens, tem protecção sobre curto-circuitos


Baltasar, valeu!  :SbSmileyBisous: 
Fonte ATX... 15€... em 2ª mão... :SbSourire2: 

A que referi ficava-me em 72€ + IVA  :EEK!: 

Quem não sabe, é como quem não vê...

Abraço
Pedro Ferrer

----------


## Bruno Morais

Pedro, tens aqui o link que utilizei para fazer a minha fonte de alimentação para quase tudo.

----------


## Nuno Prazeres

Eu vou precisar de 12V para as ventoinhas e bomba de reposição e de 5V para o arduino. Sempre me safei com a clássica montagem transformador + ponte rectificadora + condensador + reguladores (neste caso um 7005 e um 7012).

É demasiado básico para fins "arduínicos" ou dá conta do recado?

----------


## Baltasar Parreira

Nuno se dimensionares isso correctamente não terás problemas, mas claro num circuito básico dessa natureza não tens qualquer protecção de curto-circuitos e etc. Se a coisa der para o tordo podes queimar tudo ou parte da electrónica que tens, alem que os vulgares transformadores não são eficientes, estas fontes ou são switching sem qualquer transformador ou quando tem são toroidais muito mais eficientes.

----------


## Nuno Prazeres

"se a coisa der para o torto" é uma expressão que actualmente me faz termer.   :Icon Cry: 

Nesse sentido talvez seja melhor ir para uma fonte de PC já que tem os 5 e os 12 ali à mão e, penso eu, logo com massa comum, coisa que me poupa umas quantas ligações nos circuitos em que terei um fet a ajustar a tensão do pwm.

----------


## Rui Manuel Gaspar

Boas  :Olá: 




> Ok mistério resolvido eheheh , de acordo com o esquema quer da ultima versão do Arduino (UNO) quer anteriores (Duemilanove) e mesmo o novo Mega2560 ou antigo Mega, todos usam o regulador *MC33269D-5.0* que de acordo com o PDF tem um limite de corrente nos 800mA.
> 
> Assim sendo se o consumo total do vosso circuito Arduino+ board reles+ outros não for superior a isto podem usar quer o pin VIN que a ficha de entrada para ligar fontes externas de 7V-12V e depois retirar dos pinos 5V alimentação para tudo que necessite 5V.
> 
> Aqui ficam os esquemas de todos os Arduinos:
> 
> - Uno (http://arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf)
> - Duemilanove (http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf)
> - Mega2560 (http://arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf)
> ...


Cada vez percebo menos disto mas pelo que me é dado a perceber vou conseguir alimentar as duas boards de reles com os 5V do arduíno.

Isto é o que dizem no site da board que comprei:

This is a 5V 4-Channel Relay module, It can be controlled directly by a wide range of microcontrollers such as Arduino, AVR, PIC, ARM and MSP430.
1. Each 5V Relay need 20mA driving current
2. 5V TTL control input which can be directly controlled by Arduino, AVR, PIC, ARM and others.
3. Indication LED for each Relay's Status

E podem ver o link aqui:

4 Channel 5V Relay Module [SHD020] - $12.00 : iStore, Make Innovation Easier

Estou completamente enganado?

Abraços,

----------


## Baltasar Parreira

Estás certo Rui, na tua board os reles trabalham a 5V e consumem max 20ma logo os 4 consomem 80mA, o regulador interno do Arduino aguenta até 800mA, logo fazendo as contas, 80 - 800 = 720mA

Tens 720mA para gastares com o consumo do Arduino em si e outras coisas que gastem ligadas a ele isto mais ou menos, pois os restantes componentes da board dos reles terão algum pequeno consumo também.

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Baltasar, então basta ligar os 5v e o ground do Arduino e depois qualquer um dos pins as saidas que quero controlar. É isto. Não é?

Abraços,

----------


## Baltasar Parreira

Sim Rui, usando os nomes que tens na tua board:

- VCC aos 5V do Arduino
- GND à massa do Arduino (GND também)
- CH1, CH2, CH3 e CH4 aos pinos de OUTPUT analógico (ou digital caso esgotes os analógicos todos ehehhe) do Arduino.


Depois nos terminais azuis os positivos em caso de DC ou fase em caso de AC das coisas que queres controlar sendo que:

- O do meio é o comum (entrada por assim dizer)
- NC = Normalmente fechado (normal close,  circuito fechado sempre se a bobine do relê não tem corrente)
- NO = Normalmente aberto (normal open, aberto sempre e quando aplicada corrente na bobine do relê fecha o circuito)

Claro que ao fornecer corrente ás bobines as posições do que era normalmente fechado e aberto invertem-se.

Acho que assim toda a gente fica esclarecida não?  :SbOk:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Sim Rui, usando os nomes que tens na tua board:
> 
> - VCC aos 5V do Arduino
> - GND à massa do Arduino (GND também)
> - CH1, CH2, CH3 e CH4 aos pinos de OUTPUT analógico (ou digital caso esgotes os analógicos todos ehehhe) do Arduino.
> 
> 
> Depois nos terminais azuis os positivos em caso de DC ou fase em caso de AC das coisas que queres controlar sendo que:
> 
> ...


 
Esclarecidíssimo ...  :tutasla: 

Abraço,

----------


## Nuno Prazeres

Bom dia comunidade Reefarduínica!  :Olá: 

Baltasar,
Há alguma vantagem em usar os pinos de Output analógico (pwm) para os relays, quando estes até são em menor número e mais versáteis que os digitais simples (falo no meu caso que tenho um Mega 2560)?

Outro assunto...

Já alguém trabalhou com gsm/gprs?

Quais são os melhores shields?

Já terminei a especificação do meu sistema por isso quero reunir todo o material que falta para depois gerir a atribuição de pinos que promete ser desafiante. Tenho que conjugar um LCD com keypad com o pH stamp, o GSM e o RTC. Estou também a pensar em comprar um screwshield ou então um daqueles shields de prototipação para lá soldar as resistências de pull-up/pull-down e os fets de conversão de tensão pwm.

----------


## Pedro Ferrer

Bom dia Nuno




> Já alguém trabalhou com gsm/gprs?


Não queres libertar a tua caixa de mensagens!?  :SbSourire2: 

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Atenção Nuno, os pinos analógicos não são de PWM, podem ser mediante algumas alterações de código complexo mas não vamos falar disso agora.

A vantagem de usar os pinos analógicos do Arduino como output é que assim libertas os que podem mesmo fazer PWM por defeito e que geralmente num Arduino normal são poucos.

Para mandar activar um relê de qualquer board qualquer saída analógica ou digital serve desde que especificado o correcto código da seguinte forma:

Quer para os analógicos quer para os digitais e porque por defeito estão todos configurados como input, primeiro isto:

*pinMode(A0, OUTPUT); // para analógicos*
*pinMode(pin, OUTPUT); // para digitais*

depois para activar um relê é só mandar 5V (estado HIGH digital na lógica TTL) no referido pino assim:

*digitalWrite(A0, HIGH); // para analógicos*
*digitalWrite(pin, HIGH); // para digitais*


*Relembro que num Arduino normal (ATmega328) temos:*

- 6 pinos analógicos = A0, A1, A2, A3, A4 e A5
- 14 pinos digitais = 0 ao 13 , mas agrupados assim;

*Serial:* 0 (RX) and 1 (TX) - Comunicação serial TTL
*External Interrupts:* 2 and 3
*PWM:* 3, 5, 6, 9, 10, e 11
*SPI:* 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) - Comunicação em protocolo SPI
*LED:* 13 - Led onboard ligado fixo


*E no Mega (ATmega1280 ou o novo ATmega2560) temos:*

- 16 pinos analógicos = A0, A1, A2, A3, A4 e A5
- 21 pinos digitais = 0 ao 13 , mas agrupados assim;

*Serial:* 0 (RX) and 1 (TX); Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX) - Comunicação serial TTL
*External Interrupts:* 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2)
*PWM:* 0 to 13
*SPI:* 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS) - Comunicação em protocolo SPI
*LED:* 13 - Led onboard ligado fixo

----------


## Hugo Figueiredo

> Atenção Nuno, os pinos analógicos não são de PWM, podem ser mediante algumas alterações de código complexo mas não vamos falar disso agora.
> 
> A vantagem de usar os pinos analógicos do Arduino como output é que assim libertas os que podem mesmo fazer PWM por defeito e que geralmente num Arduino normal são poucos.
> 
> Para mandar activar um relê de qualquer board qualquer saída analógica ou digital serve desde que especificado o correcto código da seguinte forma:
> 
> Quer para os analógicos quer para os digitais e porque por defeito estão todos configurados como input, primeiro isto:
> 
> *pinMode(A0, OUTPUT); // para analógicos*
> ...


Este homem é um mister!!!  :tutasla:

----------


## Hugo Figueiredo

> Bom dia comunidade Reefarduínica! 
> 
> Baltasar,
> Há alguma vantagem em usar os pinos de Output analógico (pwm) para os relays, quando estes até são em menor número e mais versáteis que os digitais simples (falo no meu caso que tenho um Mega 2560)?
> 
> Outro assunto...
> 
> Já alguém trabalhou com gsm/gprs?
> 
> ...


Tens mesmo a certeza que queres ir pelo modulo GSM/GPRS?
Confesso que pessoalmente não acho de grande utilidade, mas percebo que depende muito do tipo de vida de cada pessoas.

Senão vejamos:

O modulo serviria mais para actuar qualquer coisa no aquário ou para alertar em casa de alguma falha?

Provavelmente as 2, mas centremo-nos na 2ª hipótese - Alerta em caso de falha!

E separamos entre alertas quando estamos a trabalhar e alertas quando estamos fora de férias.

Se estivermos a trabalhar e recebermos um alerta de qualquer problema, podemos sair a correr e tentar remediar o problema in loco. Mas para isto, acho mais interessante, barato, fácil e engraçado ter por exemplo uma câmara web apontada ao aquário. Tem ainda a vantagem de podermos realmente ver o que está a acontecer...

Se estivermos de férias, há-de servir de muito os alertas... Das duas uma: ou temos alguém que nos pode socorrer e ir lá a casa, e caso assim seja é preferível que a pessoa lá vá, independentemente de haver problema ou não, ou não temos ninguém e pouco ou nada podemos fazer. De qualquer forma a câmara web também serve para este exemplo.

Tá certo que não podemos estar sempre a ver a câmara web e na realidade não sabemos quando algo corre mal a não ser que estejamos a ver, mas eu tenho essa experiência com os meus cães e resulta muito bem! tenho uma câmara web e durante o dia vou dando um olhinho! Há uns meses atrás estraçalharam-me o sofá por complecto e eu a ver pela câmara web. E fazia o quê? Se tivesse sido alertado pelo telefone que eles estavam a roer o sofá, fazia o quê?



Para fazer actuar qualquer coisa no aquário, aí já vejo mais interesse no GSM/GPRS...

my 5 cents :Coradoeolhos:

----------


## Baltasar Parreira

> Já alguém trabalhou com gsm/gprs?
> 
> Quais são os melhores shields?


 
Nuno os módulos gsm/gprs são puros modems como no antigamente em que íamos as BBS hehehe... trabalham com comandos AT enviados por porta serie ou SPI.

Se queres avançar com isso tenta um que seja o mais standard possível, penso que o mais vulgar tem um chipset qualquer da Siemens o TC35 e é barato, cerca de 20eur a 40eur.
Existem como shields também quer para Ardunio normal ou Mega mas são mais caros.

Exemplo de um normal barato:

----------


## Pedro Ferrer

Bom dia

Caro?  :yb624: 
O meu custou 1/5 do valor de mercado... Profilux... Aquatrónica...




> Para fazer actuar qualquer coisa no aquário, aí já vejo mais interesse no GSM/GPRS...


Resposta:
http://www.reefforum.net/f8/controlo...tml#post155754

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

> Bom dia Nuno
> 
> 
> 
> Não queres libertar a tua caixa de mensagens!? 
> 
> Abraço
> Pedro Ferrer


Boa tarde.

Desculpa. Já apaguei umas quantas. :Coradoeolhos:

----------


## Nuno Prazeres

Obrigado pela ajuda!

Vou então estudar as diversas possibilidades.

Ora a mim dá-me mesmo muito jeito o GSM.

Intervir remotamente penso que não irei precisar. Mas convençam-me do contrário, LOL!

Agora a alternativa que passa por ligação à net a mim não serve porque ligar a coisa à UPS é complicado e assim se há uma falha de corrente fico sem acesso. Mais... Se de repente deixar de aceder ao sistema às tantas não sei se foi a luz abaixo, a ligação à internet, ou outra coisa.

Com o gsm pretendo programá-lo para me mandar um sms em situação de alarme incluindo falha e retorno da energia.

Pretendo igualmente que o sistena tenha um estado de "dono ausente" que depois tenha como consequência o envio periódico de sms com os principais parâmetros do aquário no momento desse mesmo envio.

----------


## Hugo Figueiredo

> Obrigado pela ajuda!
> 
> Vou então estudar as diversas possibilidades.
> 
> Ora a mim dá-me mesmo muito jeito o GSM.
> 
> Intervir remotamente penso que não irei precisar. Mas convençam-me do contrário, LOL!
> 
> Agora a alternativa que passa por ligação à net a mim não serve porque ligar a coisa à UPS é complicado e assim se há uma falha de corrente fico sem acesso. Mais... Se de repente deixar de aceder ao sistema às tantas não sei se foi a luz abaixo, a ligação à internet, ou outra coisa.
> ...


Ok, e se receberes um alerta e estiveres de férias, o que fazes?  :yb665:

----------


## Nuno Prazeres

> Ok, e se receberes um alerta e estiveres de férias, o que fazes?


Simples!

Saio da Ericeira, apanho a A21, depois a A8, o Eixo Norte-Sul e em cerca de 25 minutos chego a casa.  :yb624: 

Na remota hipótese de ir para mais longe, terei um amigo com a chave e reprogramo o Arduino para que os sms vão para ele.

----------


## Hugo Figueiredo

> Simples!
> 
> Saio da Ericeira, apanho a A21, depois a A8, o Eixo Norte-Sul e em cerca de 25 minutos chego a casa. 
> 
> Na remota hipótese de ir para mais longe, terei um amigo com a chave e reprogramo o Arduino para que os sms vão para ele.


Se há possibilidade do amigo, acho que é preferível que ele lá vá independentemente de se ter alertas ou não, mas como referi depende muito do tipo de vida de cada um...

----------


## Nuno Prazeres

Não queria estar a pedir a alguém que vá lá quase diariamente.

A periodicidade segura é hora da última visita + limite horário da UPS. É demais.

Entretanto já estou a tratar da calha e estou com um dilema que eventualmente também irás ter e necessito muito de opiniões já que hoje à noite queria ter os leds soldados:

http://www.reefforum.net/f112/leds-c...tml#post185110

----------


## Ricardo Pinto

Penso que é altura de renomear o nick do Baltasar para WikiArduino ou WikiLED.  :yb624:

----------


## Hugo Figueiredo

> Penso que é altura de renomear o nick do Baltasar para WikiArduino ou WikiLED.


  :SbOk:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Sim Rui, usando os nomes que tens na tua board:
> 
> - VCC aos 5V do Arduino
> - GND à massa do Arduino (GND também)
> - CH1, CH2, CH3 e CH4 aos pinos de OUTPUT analógico (ou digital caso esgotes os analógicos todos ehehhe) do Arduino.
> 
> 
> Depois nos terminais azuis os positivos em caso de DC ou fase em caso de AC das coisas que queres controlar sendo que:
> 
> ...


Como não tenho TFT (à espera  :SbRireLarme2:  :SbRireLarme2:  :SbRireLarme2: ) vou brincando com outras coisas.

Para além de esclarecido hoje fui às compras (BreadBoard, Leds, Resistências 100Ohm e um multímetro digital) e decidi fazer um teste.

Liguei como o Baltasar (AKA WikiArduino Man) mandou e funciona direitinho.



Activei o pino 10 só para dar energia ao led e com o 11 activo o pin de controlo do relé. Resultado ... como seria de esperar o relé activa e acende o LED nas calmas.

Obrigado Baltasar !!!  :tutasla: 

Abraços,

----------


## Pedro Ferrer

Bom dia




> A que referi ficava-me em 72€ + IVA


Pedi cotação a outra empresa (ambas nacionais) para a mesma fonte (Meanwell D-60A) e...
26.34€ + IVA  :SbOk5: 

Já se aproxima do preço de uma fonte ATX.

Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

> Bom dia
> 
> 
> 
> Pedi cotação a outra empresa (ambas nacionais) para a mesma fonte (Meanwell D-60A) e...
> 26.34 + IVA 
> 
> Já se aproxima do preço de uma fonte ATX.
> 
> ...


 
Yep ... e se procurares um pouco mais ... ainda deves arranjar mais barato.

O problema que vejo para utilização de fontes ATX é o seu tamanho no projecto da natureza do do Pedro Ferrer.

Já para mim por exemplo é-me um pouco indiferente!

Abraços,

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Ok, relacionado com o nosso amigo Arduino aqui vai uma pergunta muito estupida.

Para quem está atento sabe que comprei um Shield para TFT com RTC e SD card reader.

Até aqui tudo bem, mas para ligar o TFT no Shield aquilo que só usa 34 pinos, ocupa os pinos todos do Arduino MEGA (encaixa por cima).

Como é que eu posso aproveitar os restantes?
Existe algum "raiser" que seja um T que possa usar? Ou o melhor mesmo é cortar os pinos "dummy" do Shiels e usar um "raiser" em "L"???

Sugestões?

Os pinos usados pelo Shield são:

5V, 3.3V, GND, D20 a D41, D50 a D53 e D2 a D6 

Abraços,

----------


## JoaoCAlves

Boas.

No próprio site onde compras-te o TFT não tinha um shield para por por baixo do TFT?

----------


## Baltasar Parreira

Não conheço esse TFT shield nem nunca vi nenhum, mas os shields que uso tipo LCD com keypad ou botões trazem sempre depois um bypass para poderes ter acesso aos pinos não usados.

----------


## Rui Manuel Gaspar

Boas,

Sim, e isso que estou a dizer. Esse shield ocupa todos os pinos do arduino, mas so usa 34. A pergunta e mesmo essa, como posso fazer para usar os outros.

Este nao tras bypass nenhum. E isso que quero fazer. Qual a melhor opcao?

Abracos,

----------


## JoaoCAlves

Humm, ok.

Sendo assim, ou esqueces esse shield e ligas directamente com fios, ou então tens que fazer um shield com bypass. Eu por acaso não me lembro de alguma vez ter visto isso para o mega.

----------


## Baltasar Parreira

Pois sem ver isso não posso dizer, mas não tens uma segunda fileira com os pinos não usados replicados?

Uso muito o shield LCD com botões como disse, nomeadamente este:



Como vêm a segunda fileira de pinos (a mais exterior) replica os que não usados pelo shield, enquanto os interiores encaixam todos directo no Arduino.

----------


## JoaoCAlves

Pois, mas parece que não se encontra nada para o mega, pelo menos pelo google encontro nenhum.

Isso realmente dá jeito.

----------


## Nuno Prazeres

> Pois sem ver isso não posso dizer, mas não tens uma segunda fileira com os pinos não usados replicados?
> 
> Uso muito o shield LCD com botões como disse, nomeadamente este:
> 
> 
> 
> Como vêm a segunda fileira de pinos (a mais exterior) replica os que não usados pelo shield, enquanto os interiores encaixam todos directo no Arduino.


Tenho um desses a caminho.

Optei por ele precisamente devido ao facto de ter essa funcionalidade.

----------


## Pedro Ferrer

Boa tarde 

O meu LCD shield é precisamente esse.
Para facilitar as ligações, adquiri igualmente um screw shield.
O link no ebay expirou, mas encontrei este para vos elucidar.
Arduino Screw Shield Screwshield Expansion Board | eBay

ou este

http://www.ebay.co.uk/itm/DFRobot-Sc...-/250819736149

Pode-se colocar shields por cima e ao mesmo tempo duplica os IO's cá para fora, de modo a serem usados, mesmo que fiquem tapados pelos shields.

Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Pois Pedro, eu tenho esses shield mas para já eles não existem para o mega, logo as portas 24 a 50 não tem screw shield. Aliás comprei-os mesmo por causa da tua recomendação!

A somar a isso o raio do shield está mal feito e fica desalinhado com os pins adicionais do Mega pelo que não consigo encaixar!

Abraços,

----------


## Pedro Ferrer

Boa noite Rui

Deve haver algum equívoco!
Também tive alguma dificuldade em perceber como funcionava...
Mas encaixa perfeitamente no Mega.

Vou tirar fotos e postar aqui.

Abraço
Pedro Ferrer

----------


## Pedro Ferrer

Boa noite

Rui, seguem as fotos







Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

Boas,

Não me estou a conseguir explicar.

Deixem-me receber o shield de novo para tirar umas fotos e explicar-vos o problema visualmente !!!

Abraços,

----------


## JoaoCAlves

Pelo que estou a perceber, o problema do Rui é que o TFT dele usa as portas de lado, pinos 20 a 50 e tal. Esse shield do deucemila, só resolve o problema dos pinos compativeis com o deucemilla, os outros não.

Como o tft deixa pinos não utilizados no range dos pinos 20 a 50, ele não tem depois como lhes chegar.

Tou a explicar-me bem Rui?

----------


## Pedro Ferrer

Bom dia

O teu problema Rui, é que pelo que percebo, esse teu LCD é um 'monstro', ocupando grande parte do Arduino.

Nesse caso o que deves precisar é este shield:
ScrewShield v1.5 InMotion

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

Peço desde já desculpa pelo offtopic, mas como aqui todos são consumidores do ebay...

Como é que se muda a moeda no ebay? Seja ele de que país for...  :Admirado:

----------


## Pedro Ferrer

Bom dia Hugo

Não sei se dá... penso que não...
Eu uso sempre um 'money converter'...
XE - Universal Currency Converter

Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Bom dia
> 
> O teu problema Rui, é que pelo que percebo, esse teu LCD é um 'monstro', ocupando grande parte do Arduino.
> 
> Nesse caso o que deves precisar é este shield:
> ScrewShield v1.5 InMotion
> 
> Abraço
> Pedro Ferrer


Não sei o que é que consideras monstro  :Coradoeolhos:  :Coradoeolhos:  :Coradoeolhos:  mas o shield é do tamanho do Arduíno. Ou seja ocupa todos os pinos disponíveis.

Quando metes o screw shield os pinos de saída não ficam alinhados com os restantes pelo que mesmo que meta uns raisers pelo meio para levantar as saídas D22 a D54 não consigo depois encaixar o shield.

Mas acho que já decidi o que vou fazer. Para começar vou ligar o shield por cabos saída a saída só com os pinos que são realmente usados.

Se vir que funciona faço eu um screw shield com aquelas placas de protótipos que o João Alves usa para fazer a saída dos pinos que não são usados ou então mantenho mesmo a ligação por cabos!

Abraços,

----------


## Baltasar Parreira

Ok Rui já percebi, o que precisas então é isto (http://www.robotshop.com/dfrobot-prototyping-shield-arduino-mega.html):



Assim podes encaixar o TFT por cima deste shield e no shield em si tens acesso a todos os pinos vagos do Arduino Mega para soldares fios e retirar os sinais/portas que precisares para outras coisas usando muitos menos fios que se fores ligar o TFT todo com fios.


*EDIT: Opsssss, esqueçam já vim que o size/distancia depois dos pinos fêmea por cima do shield não bate certo para encaixar outra coisa em cima, daria se usares depois flat cables por cada grupo desses pinos a ligar ao teu TFT.
De qualquer forma não será difícil com veroboard ou qualquer outro PCB pré-perfurado fazer um screw Shield para o Mega, posso tentar ver isso, mas precisava do mega para ver as distancias certas mesmo.
Se acham isto interessante e útil e houver muita gente interessada posso fazer mesmo o PCB como deve ser para quem quiser tal como o screw Shield para o normal Arduino.*

----------


## Baltasar Parreira

Acho que encontrei o certo, com este podem encaixar outra coisa em cima e no shield tem todos os pinos replicados para soldar os fios as portas/sinais que precisam do Mega.

MEGAshield complete KIT for Arduino MEGA and MEGA 2560

 

No entanto continuo aberto a construir um screw shield mesmo para Mega se houver interessados como disse, não sei em quanto poderia ficar a produção de uns quantos.

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Baltasar, é quase isso !!!!

Se reparares depois de encaixares isso em cima do mega as portas replicadas ficam para dentro.

Se coloco o shield por cima fico sem acesso a elas na mesma.

Interessava-me isso exactamente mas com as portas para fora ...

Abraços,

----------


## Baltasar Parreira

Sim Nuno neste ultimo que coloquei terias de usar fios soldados aos furos dentro para as portas/sinais que queres usar do Arduino que não sejam usadas pelo TFT.

Ou seja a diferença é ao contrario do screw Shield que tens parafusos para ligar os fios e do lado de fora, este tens por dentro e tens de soldar nos furos do PCB, mas não vejo problema ser por dentro pois podem sair todos do seu lado esquerdo (do mesmo lado e por cima da ficha USB e de power do Mega) que tem montes de espaço.

----------


## Hugo Figueiredo

Se alguém quiser um ecrã gráfico (KS0108) já com os pinos soldados e com touch, PM que vendo baratinho  :Coradoeolhos: .

Mandei vir 2 por engano  :EEK!:  :yb620:

----------


## Nuno Prazeres

Boa tarde!  :Olá: 

Já alguém brincou com o stamp da Atlas Scientific para medir pH?

O código parece-me relativamente complexo...

Há 4 ligações ao Arduino e duas à sonda.

Quanto ao Vcc e Gnd estou à vontade agora quanto ao TX e RX estou às aranhas.
 :KnSmileyVertTirantLangue: 
Não sei a que pinos ligá-los.

Este esquema não me ajuda muito.

O datasheet está aqui...

Enfim... Quem é que me mandou meter meter nisto...  :yb620:

----------


## António Vitor

Arduino - SoftwareSerial

Não sei, mas talvez este link te ajude.
pelo que percebi tens de definir qual é o pino RX e o pino TX tu é que configuras.

----------


## António Vitor

If only one serial connection is necessary the hardware serial port should be used...
hum...

Arduino - Serial

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Pelo pouco que li, acho que tens que configurar as portas para isso.

O Arduino tem as portas 14 a 19 para isso e ainda podes usar a 0 e a 1.

Abraços.

----------


## Nuno Prazeres

Obrigado!!!

O que li vai no sentido da comunicação ser do tipo SoftSerial o que grosso modo significa usar quaisquer dois pinos digitais como RX e TX.

Tentei com várias combinações e consigo que os debug leds do stamp respondam. Agora ler a partir do stamp é que não consigo de todo.  :Icon Cry: 

E não é da sonda. 

O stamp recebe ordens sob a forma de strings ou caracteres sendo que um deles devolve a versão dele. Nem isso eu consigo ler.

Devo estar a cometer algum erro de palmatória. É o costume.  :Coradoeolhos:  

Manei um email para a Atlas Scientific. Depois partilho a resposta aqui.

----------


## Pedro Ferrer

Boa noite Nuno

Ligas o stamp à porta 2 e 3 do Arduino.
Esta porta serial, é a Serial1.

Tenta fazer as seguintes ligações.
Pin2 arduino ao TX do stamp
Pin3 arduino ao RX do stamp

No código, o seguinte:

void setup(){
*Serial1.*Begin(9600);
}

void loop{

*Serial1.* bla bla
*Serial1.* bla bla

}

P.S - O Mega não necessita de 'SoftSerial ' para emular as portas...

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Pedro acho que te enganaste nos pinos do Mega, o 2 e 3 são para external interrupts.

Para serial RX e TX pode ser qualquer destes pares:

*Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX).*

O serial normal (pinos 0 e 1) são ligados ao USB e servem para upload do código via PC, logo apesar de se poderem usar é sempre melhor usar outros visto o Mega ter mais 3 pares para comunicação serial.

*Atenção que em comunicação Serial o TX é sempre ligado ao RX de destino e vice-versa ou seja são sempre cruzadas as ligações.*
* 
A SoftSerial lib só deve ser usada em caso de não haver portas mesmo serial livres ou não se quiser usar as default usadas pelo USB nos pinos 0 e 1 quer do Arduino normal quer do Mega. Esta lib permite fazer comunicação serial em qualquer outro par de pinos digitais especificados.
*

----------


## Baltasar Parreira

Ok apanhando pedaços de código aqui e ali, testa isto. Vai te dar mensagens e valores na janela de debug do IDE para a COM que tens o USB:

char stamp_data[15]; //this is where the data from the stamp is stored. The array is 15 char long because
//if no pH probe is connected, the message "check probe" is transmitted.
//Having an array that is to small will cause data corruption and could cause the Arduino to crash. 
char state='C';
byte holding; //used to tell us the number of bytes that have been received by the Arduino and are holding in the buffer holding 
byte i; //counter
byte startup=0; //used to control the start-up sequence 
void setup(){
Serial1.begin(38400); //set up the soft serial to run at 38400 
Serial.begin(38400); //set up the hardware serialport to run at 38400
Serial1.print("l0"); //turn on the led
Serial1.print(13,BYTE); //ALWAYS end a command with <CR> (which is simply the number 13)||(print("/r") 
Serial1.print(state);
Serial1.print(13,BYTE);
delay(2000);
Serial.println("start");
}



void loop() { //main loop

if(Serial.available()>0){
state=Serial.read();
if(state=='C' || state=='c' || state=='E' || state=='e'){
Serial1.print(state);
Serial1.print(13,BYTE);
}
}


if(Serial1.available() > 0 && (state=='C' || state=='c')) { //if we see the more then three bytes have been received by the Arduino 
//Serial.println("entrou");
holding=Serial1.available(); //lets read how many bytes have been received 

for(i=1; i <= 5;i++){ //we make a loop that will read each byte we received 
stamp_data[i]= Serial1.read(); //and load that byte into the stamp_data array
}
if(stamp_data[1]=='c'){
Serial.println("Checking Probe");
}else{
for(i=1; i <= 4;i++){ //we now loop through the array 
Serial.print(stamp_data[i]); //printing each byte we recived through the hardware UART
}
Serial.println(stamp_data[5]); //once we finished, we print a nul char with the <CR><LF> command. 

}
}

delay(150);
}

----------


## Nuno Prazeres

Bom dia!  :Olá: 

Muito obrigado! :yb677: 

Presumo que como se vai usar o objecto Serial1, devo fazer as ligações nos pinos 19 (o RX do Arduino que liga ao TX do stamp) e 18 (o TX do Arduino que liga ao RX do stamp).

Vou tentar essa via então. 

Penso que a linha crítica do código será

if (Serial1.available() > 0 ...

Foi aí que nunca consegui entrar na versão anterior. Aparentemente o buffer nunca recebeu nada.

Mais uma vez obrigado.  :SbOk2:

----------


## Baltasar Parreira

Sim Nuno estás correcto.

Mas essa linha para falhar só poderia ser por não teres inicializado a comunicação serial com: Serial1.begin(38400); 

Depois ao fazeres: if(Serial1.available() > 0 estás a ler os 128 bytes (máximo) do serial buffer e comparar se maior que zero ou seja se tens dados então entra e processa-os.

Diz depois como isso correu.

----------


## Nuno Prazeres

Caríssimo Baltasar,

Não tenho palavras para expressar a minha gratidão!

Estou só com net no iphone por isso tive que ler o teu código, interpretá-lo e simplificar tudo.

Cheguei a isto no loop (omito declarações e o setup que só inicializa Serial e Serial1 a 38400):

Serial1.print("c");
Serial1.print(13,BYTE);
if (Serial1.available() > 4) {
   holding = Serial1.available();
   for (int i=1; i<=holding;i++) {
        stampdata[i] = Serial1.read();
   }
   for (int i=1; i<=holding;i++) {
        Serial.print(stampdata[i]);
   }
   Serial.println("");
}

Simples e eficaz!

Muitíssimo obrigado!!!!!!  :tutasla:

----------


## António Vitor

> Caríssimo Baltasar,
> 
> Não tenho palavras para expressar a minha gratidão!
> 
> Estou só com net no iphone por isso tive que ler o teu código, interpretá-lo e simplificar tudo.
> 
> Cheguei a isto no loop (omito declarações e o setup que só inicializa Serial e Serial1 a 38400):
> 
> Serial1.print("c");
> ...


Se não fosse o Baltasar...
 :Big Grin: 
O homem tem um grande coração e é o grande impulsionador dos arduinos aqui...
não é só dos leds...
 :tutasla:

----------


## Nuno Prazeres

Como disse, não tenho palavras...

Isto está a bulir à grande. Estive a ler o código dele com cuidado e devido aos debugging flags que ele espalhou por lá fiquei a entender, penso eu, a lógica do stamp.

Próximo desafio: módulo de gsm. Tenho que mandar vir isso...

Vou ter o controlador do aquário prototipado uns largos meses antes de ter aquário, lol!!!

Já tenho os menus mais ou menos prontos...

O RTC chega para a semana mas parece-me que não irá dar muita luta...

----------


## Baltasar Parreira

Nuno descobri uma coisa que penso ser muito importante, ao leres o valor do PH podes especificar a temperatura que tens e assim o valor da leitura vem compensado, seria interessante para ficares com leituras precisas teres outro circuito a apanhar a temperatura da agua e usares esse valor depois para ler correctamente o PH da seguinte forma:


Serial1.print(tt.tt); // tt.tt será a variável/valor da temperatura que vais passar tipo 26.00 que veio da leitura pela a board/circuito de temperatura
Serial1.print(13,BYTE);


Assim o Stamp ajusta a leitura de PH em função da temperatura da tua agua no momento e da-te um valor preciso mesmo.

Excerto do manual do Stamp sobre este comando:

----------------------------------------------------------------

*tt.tt * (where "t" is temperature in °C) By transmitting a temperature to the pH stamp a 
temperature compensated pH reading will be returned in the same manner as is seen when using the "R" command. However, the temperature entered will now be the new default temperature. Therefore it is not necessary to transmit a temperature each time a reading is taken. A temperature can be transmitted one time and then a "C" command can be issue. This will return continuous pH readings at the new temperature. 
Temperature data will be lost if stamp is powered off. When the ph stamp is powered on again temperature will go back to its default of 25°C 

*Full proper syntax:* 

*35<CR> or 35.67<CR>* 
*----------------------------------------------------------------*

----------


## Baltasar Parreira

Fica aqui uma dica de como construir um prático sensor de temperatura para o Arduino usando este IC (versão tipo transístor):




Soldar dois fios ao pino 1 e 2 (não é necessário usar o pino 3 (VCC) pois o 2 é uma combinação de output bus e power) e aplicar um pouco de cola quente em cima das soldaduras:




Depois com um pouco de tubo/mangueira onde caiba, colocar o sensor e acabar de encher com cola quente de forma que fique tudo bem preenchido e não existe nenhum contacto ou parte metálica não isolada de forma a que não fique exposta a agua:








Ligar ao Arduino da seguinte forma (exemplo para 2 sensores):



Código para o Arduino:

#include <OneWire.h> 
#include <DallasTemperature.h>

OneWire oneWire(8); // on pin 8 
DallasTemperature sensors(&oneWire);

void setup(){ 
Serial.begin(9600); // Initialize sensors 
sensors.begin();
}

void loop(){ 
sensors.requestTemperatures(); 
Serial.print(Sensor #0: ); 
Serial.println(sensors.getTempCByIndex(0)); 

Serial.print(Sensor #1: ); 
Serial.println(sensors.getTempCByIndex(1)) 

delay(100); // wait a little time
}


Se quiserem usar só um sensor bastar eliminar tudo do segundo, coloquei assim para perceberem que num só pino do Arduino podem ler valores de vários sensores usando a lib OneWire bastando incrementar o index do array de leituras.


*EDIT: Reparei que o DS1820 propriamente dito já não se fabrica, logo deixo aqui um quadro com as variantes todas elas compatíveis e as ligeiras diferenças que tem entre elas:*

----------


## Nuno Prazeres

Excelente!!! Eu tenho por cá uns quantos sensores mas de outro modelo cujo nome não me recordo.  Dão 0,5 C de precisão que penso ser suficiente. Ainda não tinha visto uma boa forma de os deixar estanques mas o software está pronto.

Essas dicas assentam como ginjas no meu projecto!
 :tutasla:

----------


## Pedro Ferrer

Boa noite




> Pedro acho que te enganaste nos pinos do Mega, o 2 e 3 são para external interrupts.
> 
> Para serial RX e TX pode ser qualquer destes pares:
> 
> *Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX).*


De facto enganei-me e lamento o lapso.  :Icon Cry: 
Ainda demorei algum tempo a perceber como me tinha equivocado e é simples de explicar.
Tenho 2 fios no pin 2 e 3 do arduino, que sabia que eram para o módulo GSM.
Como é algo que funciona (testado no início do ano), mas que ainda não está integrado, estes 2 fios ficaram no arduino *apenas* como cábula.
Hoje depois de ler que o Nuno já tinha conseguido a comunicação, fui tentar perceber onde eu tinha falhado.
E de facto estes 2 fios são lixo...uma cábula que me iludiu em erro.
Estes 2 fios, são para ligar, isso sim, nos pinos 2 e 3 do módulo GSM que estão ligados ao Arduino via pino 18 (TXD1) e 19 (RXD1).







> Excelente!!! Eu tenho por cá uns quantos sensores mas de outro modelo cujo nome não me recordo.  Dão 0,5 C de precisão que penso ser suficiente


Penso que sejam os LM35DZ.

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

Boa noite!  :Olá: 

Os sensores de temperatura são de facto esses, Pedro. Obrigado.  :SbOk: 

Agora já que falamos de gsm, será que este serve? Não é um shield mas gosto do preço. Aliás duvido que tenha espaço para ali meter um shield.

O meu Mega ainda vai parecer um Big Mac com tanto shield.  :SbRequin2: 

Por mim fico-me pelo lcd e o screw shield. O resto é para ligar por fio.

----------


## Baltasar Parreira

Sim Nuno o TC35 é simples de trabalhar, tem um chipset da Siemens e trabalha com comandos simples AT enviados por comunicação serial também.

Tens aqui igual ligeiramente mais barato:

Arduino GSM SIEMENS TC35 SMS drahtlos Module UART/232 | eBay

----------


## Rui Manuel Gaspar

Boas  :Olá: , 




> Sim Nuno o TC35 é simples de trabalhar, tem um chipset da Siemens e trabalha com comandos simples AT enviados por comunicação serial também.
> 
> Tens aqui igual ligeiramente mais barato:
> 
> Arduino GSM SIEMENS TC35 SMS drahtlos Module UART/232 | eBay


Antes que esgote ... e ainda por cima com portes grátis ... 21 ... livra, já encomendei mas foi o meu!

Obrigado pela informação Baltasar. Ainda ontem estava a falar com o Pedro Ferrer que me disse que pagou bem mais por isso!

Abraços,

----------


## Baltasar Parreira

Pois ehehhe... já tinha comprado um para mim também, mas e repararam na descrição do que traz incluído?
1x TC35 GSM Development Board1x SIEMENS TC35 GSM-Modul1x GSM spezielle Antenne1x DC 5V Netzteil1x Rechnung / Audio-AdapterAté vem o adaptador áudio, com isto podem falar mesmo normal tipo telemóvel eheheh !!!

----------


## Rui Manuel Gaspar

> Depois com um pouco de tubo/mangueira onde caiba, colocar o sensor e acabar de encher com cola quente de forma que fique tudo bem preenchido e não existe nenhum contacto ou parte metálica não isolada de forma a que não fique exposta a agua:


Boas  :Olá: ,

Olha lá Baltasar, mas isto assim vai garantir que continuas com a mesma precisão na leitura da temperatura?

Será que o plástico da mangueira não vai adulterar as leituras?

Outra pergunta parva. Para medição da temperatura da calha por exemplo usam o mesmo DS18B20+?

Abraços,

----------


## Baltasar Parreira

Hum... eu acho que qualquer objecto dentro de agua a X temperatura tem tendência a manter e igualar essa temperatura, no entanto o mesmo chip possui maneira de calibrar e pode-se sempre ver se bate certo tendo o vulgar termómetro de mercúrio ao lado.  :Coradoeolhos: 

Podes também usar este mesmo chip para ver a temperatura da calha ou qualquer outra coisa, claro que nesse caso e visto não ir ser mergulhado em líquidos/agua já não é necessários isolar tudo, basta nas soldaduras dos terminais ter um pouco de manga termo-retráctil só para não haver curto-circuito entre os mesmos.

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Hum... eu acho que qualquer objecto dentro de agua a X temperatura tem tendência a manter e igualar essa temperatura, no entanto o mesmo chip possui maneira de calibrar e pode-se sempre ver se bate certo tendo o vulgar termómetro de mercúrio ao lado. 
> 
> Podes também usar este mesmo chip para ver a temperatura da calha ou qualquer outra coisa, claro que nesse caso e visto não ir ser mergulhado em líquidos/agua já não é necessários isolar tudo, basta nas soldaduras dos terminais ter um pouco de manga termo-retráctil só para não haver curto-circuito entre os mesmos.


 
Olha lá ... mas tu não dormes????  :EEK!:  :EEK!:  :EEK!: 
Eu ainda tenho desculpa que estou a trabalhar. Bem a fazer uma pausa no trabalho!

Abraços,

----------


## Baltasar Parreira

Pois aqui trabalha-se também.  :Admirado: 

Estou quase a acabar um screw shield para o Mega, mas um pouco e já posso colocar uma imagem dos pinos analógicos como vai ficar.  :Coradoeolhos: 
Depois se houver malta interessada nisto é só mandar produzir uma dúzia no mínimo para não sair caro.

----------


## Nuno Prazeres

> Pois ehehhe... já tinha comprado um para mim também, mas e repararam na descrição do que traz incluído?
> 1x TC35 GSM Development Board1x SIEMENS TC35 GSM-Modul1x GSM spezielle Antenne1x DC 5V Netzteil1x Rechnung / Audio-AdapterAté vem o adaptador áudio, com isto podem falar mesmo normal tipo telemóvel eheheh !!!


Também mandei vir um! Obrigado!

----------


## Baltasar Parreira

Como prometido aqui fica já o lado dos pinos analógicos do ScrewShield para o Mega.

Se acharem que isto está no bom caminho pois não tenho aqui um Mega para testar se bate certo, digam que avanço para os restantes pinos.

----------


## Nuno Prazeres

Sem medir, apenas pela distribuição, parece-me perfeito.

Agora aqueles 4 primeiros screws não os faria assim. As massas e o Vcc de 5V dão muito jeito mas um Vin adicional já duvido.

Para que necessitamos de 2 Vin?

----------


## Baltasar Parreira

Nuno a ideia foi baseada no screw shield do Arduino normal.

Para mim a replicação desses pinos faz sentido porque, nos 4 primeiro é como se fossem terminais de input ao Arduino, ou seja ligas a massa e alimentas-o ou por ou por 5V ja estabilizados ou por 7-12V de uma qualquer outra fonte ao Vin e o regulador integrado onboard trata do resto.

Os outros pinos depois servem para em qualquer dos casos poderes retirar essas mesmas voltagens que usas para alimentar o Arduino de forma a alimentares outras boards/circuitos externos.
Muitos circuitos trabalham com os vulgares 12V em vez de 5V.
É sempre mais simples e melhor assim do que depois teres de colocar dois fios num só terminal e aparafusar.

----------


## JoaoCAlves

Boas Baltasar.

Os headers que escolhes-te têm qts mm entre pinos? É os 5mm?

----------


## Baltasar Parreira

Pois não sei porque não diz, mas penso que é visto ser o standard.
Estou a usar o "1X06_LOCK_LONGPADS" e "1X08_LOCK_LONGPADS" da lib da Sparkfun.

Fica aqui um ficheiro em tamanho real que se imprimirem (para quem tem Arduino Mega) podem ver se bate certo para já o lado dos pinos analógicos.

----------


## JoaoCAlves

Ok, não dá para medir, mas pelo desenho dos terminais, parece ser mesmo os que falo, uns que se encaixam uns nos outros, aliás, os que vêz nas fotos dos drivers que fiz.

Sendo esses, encontra-se facilmente.  :SbOk:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Baltasar, quando tiveres os suportes para os LEDS levo-te o meu arduino para que possas medir e testar o que quiseres.

Abraços,

----------


## Baltasar Parreira

O que costumo fazer para testar é quem tiver um shield qualquer para o Mega basta imprimir o PDF que coloquei pois tem tamanho real, depois assenta esse qualquer shield em cima do papel e os pinos tem de bater o mais certo possível no furos brancos destes (local onde irá ter os header fêmea para receber o shield por cima): 



Para quem não está a perceber será algo igual a este para o Arduino normal só com os pinos do Mega:






Mais um pouco e já coloco o outro lado do shield.

----------


## Baltasar Parreira

Ok aqui está o shield para o outro lado do Mega:

Só fica a faltar agora terceiro shield para o header duplo vertical com as restantes saídas digitais.

----------


## Pedro Ferrer

Boa tarde




> Obrigado pela informação Baltasar. Ainda ontem estava a falar com o Pedro Ferrer que me disse que pagou bem mais por isso!


Paguei mais e não me arrependo.
Quando se sabe que um módulo GSM de uma marca profissional custa cerca de 500... e com cerca de 80 fazemos a festa, é motivo de alegria. Se há módulos GSM por cerca de 21, melhor ainda!  :SbSourire2: 

Agora, aquela porta RS232... assusta-me!
O meu shield GSM com 2 fios Rx/Tx e faço a festa.

Quando procuro algo para o arduino, tento procurar algo que já exista e esteja implementado na comunidade. As bibliotecas e a fiabilidade são extremamente importantes! 

É como tudo... se formos os 1os a fazer ou comprar algo, quem vier a seguir tentará fazer melhor e mais barato...  :SbOk: 

Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

> Boa tarde
> 
> 
> 
> Paguei mais e não me arrependo.
> Quando se sabe que um módulo GSM de uma marca profissional custa cerca de 500... e com cerca de 80 fazemos a festa, é motivo de alegria. Se há módulos GSM por cerca de 21, melhor ainda! 
> 
> Agora, aquela porta RS232... assusta-me!
> O meu shield GSM com 2 fios Rx/Tx e faço a festa.
> ...


Boas ... não te assustes ... aquilo é só 3 fios ... TX, RX e Ground como os antigos cabos para ligar dois computadores via porta série.

Mas é como tu dizes amigo ... Tu andas à chuva e a malta só vai atrás a secar a pista ...  :tutasla: 

Abraços,

----------


## Nuno Prazeres

Baltasar,

Vais comercializar os screws para o Mega?

Se for economicamente viável será um bom produto para juntar aos que já tens.

Quanto ao GSM, o RS-232 de facto até tem menos fios que o USB.

Ainda tenho por lá machos e fêmeas que sobraram de outras lides. Penso que não será difícil dar conta disso mesmo para um tartarolo como eu.  :Coradoeolhos: 

Quanto à sintaxe AT, há muito por essa net fora.

E de facto o Pedro tem toda a razão. No que toca a alarmes domésticos comerciais, um módulo que envia sms é muitíssimo caro. Na ordem de 250 eur os que conheço. Admito que outras marcas ainda o vendam mais caro.

----------


## Baltasar Parreira

Sim Nuno se houver malta interessada vou fazer uma dúzia deles, pelos meus cálculos por alto não deve ficar muito caro as 3 pecas para o Mega.
Ainda tenho de afinar melhor o desenho para ser o menor possível e assim ficar mais compacto.

Sobre o modulo SMS, não é preciso usar a porta RS232 que tras, pois tem pinos para ligar por serial RX e TX tal como ligaste o PH stamp.

A porta RS232 existe caso queiram ligar a outras coisas sem ser Arduino, por exemplo para routear chamadas para telemóveis de uma central telefónica etc.

Se precisares eu tenho aqui um código já feito com os comandos básicos para envio de SMS, só tens de tirar partes e meteres no teu projecto e assim mandares os teus alarmes.

O módulo Siemens que vem na board é mesmo oficial e da marca, eles só ligaram a saída dele a uma board com ligações mais simples de operar para Arduinos, PICs ou outros processadores e pela ficha RS232 até podem usar o PC para operar SMS e outras coisas.

O modulo Siemens é este:

----------


## Nuno Prazeres

Muito obrigado.

Quanto ao shield já há interesse para 3, ultima contagem. Um paraco Rui Gaspar e 2 para mim.

Quanto ao gsm, quando ele chegar depois incomodo-te.  :Coradoeolhos:   :SbOk:

----------


## Hugo Figueiredo

Já estive mais céptio quanto a isso do GSM...  :yb665:

----------


## Rui Manuel Gaspar

> Muito obrigado.
> 
> Quanto ao shield já há interesse para 3, ultima contagem. Um paraco Rui Gaspar e 2 para mim.
> 
> Quanto ao gsm, quando ele chegar depois incomodo-te.


Já somos dois a incomodar ... o meu já vem a caminho!

E hoje enviaram-me também um TFT e um Shield novo. FINALMENTE ...

Só faltam mesmo dois leds para começar a montar a calha!

Abraços,

----------


## António Vitor

> Muito obrigado.
> 
> Quanto ao shield já há interesse para 3, ultima contagem. Um paraco Rui Gaspar e 2 para mim.
> 
> Quanto ao gsm, quando ele chegar depois incomodo-te.


e outro shield dos parafusos para mim..
 :Smile:

----------


## Nuno Prazeres

> e outro shield dos parafusos para mim..


O lado que falta vai fazer o nosso amigo Baltasar puxar ainda mais pela cabeça já que tem pinout duplo e não simples...

Se calhar terá que virar algumas portas screw para o lado de dentro mas mesmo assim as extremidades ficam em cima dos pins laterais.

Estou tão curioso quanto confiante.  :SbOk: 

Necessito mesmo desses pins. Fora shields, stamps e afins preciso de 27 pins só 4 dos quais analógicos.

----------


## Hugo Figueiredo

> Boas,
> 
> Ainda não encomendei o Arduíno ... Está quase, mas entretanto mandei vir este:
> 
> 
> 
> O do Video é o de 2,4" mas o que encomendei é o de 3.2" touch
> 
> O Shield para Arduíno Mega tem já RTC e SD card reader, e a julgar pelas reviews e pelo vídeo as libraries estão muito boas.
> ...


1 - Já chegou o LCD Rui?
2 - Já ligaste isso? funciona na boa e consegues controlar a orientação (em pé/deitado)?
3 - O teu é daqueles que trazem já botões pre-impressos no lcd?

Para já é só... :Coradoeolhos:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> 1 - Já chegou o LCD Rui?
> 2 - Já ligaste isso? funciona na boa e consegues controlar a orientação (em pé/deitado)?
> 3 - O teu é daqueles que trazem já botões pre-impressos no lcd?
> 
> Para já é só...


1 - Chegou e estava avariado, já vem a caminho outro!

2 - sim, configuras na zona de setup portrait ou landscape

3 - não!

Abraços,

----------


## Hugo Figueiredo

> Boas ,
> 
> 
> 
> 1 - Chegou e estava avariado, já vem a caminho outro!
> 
> 2 - sim, configuras na zona de setup portrait ou landscape
> 
> 3 - não!
> ...


Ok, estou a micar este:
http://iteadstudio.com/store/index.php?main_page=product_info&products_id=263

 :yb665:

----------


## Rui Manuel Gaspar

Boas ...


É igual ao meu!

Abraços,

----------


## Hugo Figueiredo

> Boas ...
> 
> 
> É igual ao meu!
> 
> Abraços,


Mas este tem os botões pré-impressos...  :SbSourire2: 
E a resolução é de 400x240. O teu não é de 320 x 240? :Admirado:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Mas este tem os botões pré-impressos... 
> E a resolução é de 400x240. O teu não é de 320 x 240?


Isso é só imagem. Vais ver que depois não tem!

e é mesmo igual ... 400x240 ...

Depois se quiseres passo-te as libraries que uso e todo o código para as funções touch, rtc e menus! Falta-me fazer a do SD antes de começar a programar aquilo com as funções que pretendo!

Abraços,

----------


## Hugo Figueiredo

> Boas ,
> 
> 
> 
> Isso é só imagem. Vais ver que depois não tem!
> 
> e é mesmo igual ... 400x240 ...
> 
> Depois se quiseres passo-te as libraries que uso e todo o código para as funções touch, rtc e menus! Falta-me fazer a do SD antes de começar a programar aquilo com as funções que pretendo!
> ...


Maravilha!!!  :SbOk: 

Depois com o shield fica um mimo, com o shiled screw do Baltazar fica uma beleza!!! Tudo arrumadinho, sem fios a bailar e com:
- LCD TOUCH
- RTC
- SD

Espectáculo!!! :Olá:

----------


## Rui Manuel Gaspar

> Maravilha!!! 
> 
> Depois com o shield fica um mimo, com o shiled screw do Baltazar fica uma beleza!!! Tudo arrumadinho, sem fios a bailar e com:
> - LCD TOUCH
> - RTC
> - SD
> 
> Espectáculo!!!


Yep ... é essa a ideia.

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

Fica já aqui a referência para quem adquirir:

3.2" Widescreen TFT LCD Screen Module: ITDB02-3.2WC1 x ITDB02 Arduino MEGA Shield v1.1
Não usem as libraries da IteadStudio mas sim as que este rapaz desenvolveu só porque não tinha nada para fazer  :EEK!:  :EEK!:  :EEK!: 

Electronics - Henning Karlsen

Abraços,

----------


## Nuno Prazeres

Finalmente recebi uma peça essencial: o RTC.

Já corri um codigozito jeitoso e os resultados foram bons.

Só usei a library Wire.h e adaptei código que encontrei em dois sites diferentes. Só com essa lib aquilo sai um bocadinho low level demais. Alguém conhece uma lib específica para o DS1307?

Já agora, um aspecto importante é que a ligação ao arduino mega do I2C se faz pelos pins 18 e 19 e não pelo 4 e 5 como nos outros modelos.

É só chegar o módulo de GSM que abro um tópico específico para verem as asneiras que for fazendo.  :SbPiggy:

----------


## Joao Quaresma

Boas,

podes usar a library do Henning, o link está no post anterior.


Joao Quaresma.

----------


## Baltasar Parreira

Eu para o RTC recomendo usar comunicação directa só com a lib Wire, pois a lib DS1307 tem alguns problemas e gera conflitos com outras libs as vezes para alem de ser mais lenta a comunicação.

Procurem no post do Nuno Prazeres sobre a calha T5 com DIM que eu pus lá código de como falar com o RTC usando só a Wire.

----------


## AntonioSilva

> Já agora, um aspecto importante é que a ligação ao arduino mega do I2C se faz pelos pins 18 e 19 e não pelo 4 e 5 como nos outros modelos.


Ops..não estás enganado ? Eu tenho o display e o rtc i2c pendurados no 20 e 21 SDA e SCL respectivamente

----------


## Baltasar Parreira

Sim António estás certo, o Nuno deve se ter enganado.

Comunicação I2C (TWI) no Mega (extraído do manual do Arduino Mega):

" *20 (SDA) and 21 (SCL).* Support TWI communication using the Wire library. Note that these pins are not in the same location as the TWI pins on the Duemilanove or Diecimila. "

*NOTA:* TWI significa Interface de Dois Fios (Two Wire Interface) e para a maioria este bus é idêntico ao I2C. O nome do TWI foi introduzido pela Atmel e outras empresas para evitar conflitos com as questões relacionadas com a marca I2C. A descrição das capacidades de interfaces TWI podem ser encontrados nas folhas de dados dos dispositivos correspondentes. Os dispositivos TWI são geralmente compatíveis com dispositivos I2C, excepto para algumas particularidades como a difusão geral ou o endereçamento de 10 bits.

----------


## Nuno Prazeres

Estava de facto enganadíssimo. 
Estava a fazer confusão. São o 20 e 21 claro!

----------


## Baltasar Parreira

Pessoal o meu TC35 chegou, logo quem tenha comprado na mesma altura já deve ter recebido também certamente.

Só quero alertar que no meu caso o vendedor não enviou a fonte de alimentação de 5V como descrito no anuncio, logo se não a têm também reclamem !!!
Foi o que fiz e recebi um credito de 4eur de volta pois ele diz que acabaram e não tem mais fontes.

Recordo a compra tem de incluir o seguinte como descrito na pagina do anuncio:

1x TC35 GSM Development Board1x SIEMENS TC35 GSM-Modul1x GSM spezielle Antenne1x DC 5V Netzteil1x Rechnung / Audio-AdapterTradução:

1x TC35 GSM Development Board 
1x SIEMENS TC35 GSM module 
1x GSM Special Antenna 
1x 5V DC power supply 
1x invoice / audio adapter


Entretanto já liguei e trabalha lindamente, só precisa de 3 fios ligados ao Arduino e a alimentação de 5V na ficha do módulo.

Usa os seguintes pinos:

- qualquer par serial RX e TX (pode ser emulado em qualquer par de pinos com a lib NewSoftSerial)
- GND

----------


## Hugo Figueiredo

> Pessoal o meu TC35 chegou, logo quem tenha comprado na mesma altura já deve ter recebido também certamente.
> 
> Só quero alertar que no meu caso o vendedor não enviou a fonte de alimentação de 5V como descrito no anuncio, logo se não a têm também reclamem !!!
> Foi o que fiz e recebi um credito de 4eur de volta pois ele diz que acabaram e não tem mais fontes.
> 
> Recordo a compra tem de incluir o seguinte como descrito na pagina do anuncio:
> 
> 1x TC35 GSM Development Board1x SIEMENS TC35 GSM-Modul1x GSM spezielle Antenne1x DC 5V Netzteil1x Rechnung / Audio-AdapterTradução:
> 
> ...


Boa, vou estar atento a isto...!

E que mal pergunte, há alguma operadora que disponibilize cartões sem carregamentos obrigatórios?  :Admirado:

----------


## Baltasar Parreira

Eu tenho alguns cartões Optimus que para estarem activos só precisa de pelo menos de muito em muito tempo receber uma chamada, claro que se não lhe carregares nada não consegues fazer tu chamadas nem enviar SMS.

Penso que se chame "Boomerang Free", mas procura pois podem ter mudado isto já foi a uns bons anos atrás.

----------


## Hugo Figueiredo

> Eu tenho alguns cartões Optimus que para estarem activos só precisa de pelo menos de muito em muito tempo receber uma chamada, claro que se não lhe carregares nada não consegues fazer tu chamadas nem enviar SMS.
> 
> Penso que se chame "Boomerang Free", mas procura pois podem ter mudado isto já foi a uns bons anos atrás.


Pois eu como deixei-me isso há uns anos perdi o fio a meada...

É que um gajo estar a lembrar-se de fazer uma chamada de tempos a tempos...  :Admirado: 

Depois quando realmente precisassemos do modulo ele não funcionava porque estava desactivado...

É preciso ter atenção a isso! :SbOk:

----------


## Rui Manuel Gaspar

> Pessoal o meu TC35 chegou, logo quem tenha comprado na mesma altura já deve ter recebido também certamente.
> 
> Só quero alertar que no meu caso o vendedor não enviou a fonte de alimentação de 5V como descrito no anuncio, logo se não a têm também reclamem !!!
> Foi o que fiz e recebi um credito de 4eur de volta pois ele diz que acabaram e não tem mais fontes.
> 
> Recordo a compra tem de incluir o seguinte como descrito na pagina do anuncio:
> 
> 1x TC35 GSM Development Board1x SIEMENS TC35 GSM-Modul1x GSM spezielle Antenne1x DC 5V Netzteil1x Rechnung / Audio-AdapterTradução:
> 
> ...


 
Boas  :Olá: ,

Recebi o meu hoje também ...  :SbSourire2: 
Faltava a fonte de alimentação ...

Só falta perceber é como é que aquilo se liga ...

Baltasar, vinha uma peça à parte que presumo que seja para ligar um altifalante e um microfone. Não irei usar, mas percebes como é que aquilo se liga?

E hoje tive a notícia que entre hoje e amanhã devo receber também finalmente o TFT e o Shield ... ALELUIA !!!

Abraços,

----------


## Hugo Figueiredo

> E hoje tive a notícia que entre hoje e amanhã devo receber também finalmente o TFT e o Shield ... ALELUIA !!!
> 
> Abraços,


Eu recebi hoje o meu... Vamos a ver se está ok, porque a soldagem dos fios do touch não me parece estar grande coisa... :yb663:

----------


## Pedro Ferrer

Boa tarde




> É que um gajo estar a lembrar-se de fazer uma chamada de tempos a tempos...


*Penso* que se programares o sistema para enviar uma SMS de forma periódica,
marcas presença na rede... evitando assim a chamada.

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Boas, sim como disse na descrição do material que vem existe uma placa adaptadora para se poder usar o modulo mesmo para fazer chamadas tipo telefone e ouvir e falar normal ligando nesse adaptador um micro e uns auscultadores/altifalante.

Esse adaptador encaixa no header do lado direito (se tiveres a ficha da alimentação no topo) onde vais reparar que tem marcado MIC e algo do género.

Quanto a fonte em falta como disse antes de darem feedback ao vendedor mandem mensagem a reclamar que ele credita uns euritos de volta no vosso paypal, pelo menos foi o que fez a mim por dizer que não tinha as fontes em stock se eu aceitava o dinheiro...  :Coradoeolhos:

----------


## Nuno Prazeres

O meu T35 deve demorar mais tempo a chegar porque ovendedor informou-me que tinha ficado sem stock por isso perdi cerca de 3 dias. Se calhar no meu caso virá com a fonte.

Tenho andado a ler umas coisas sobre a respectiva codificação e parece que há dois passos de inicialização absolutamente fundanentais:
1-colocar o cartão noutro aparelho e parametrizá-lo para não necessitar de PIN;
2-enviar um comando informando o módulo sobre qual a frequência do operador

Confirmam?

----------


## Hugo Figueiredo

> Eu recebi hoje o meu... Vamos a ver se está ok, porque a soldagem dos fios do touch não me parece estar grande coisa...


Funciona!!!

Obrigado Rui, pelo código!

Está a ajudar-me a desenvolver o meu UI bastante!!!  :Pracima: 

Já agora, sabes como colocar aqueles icons na parte esquerda (nesta imagem em baixo) do visor?


Eu como via isto em todas as imagens presumi que já viessem pré-impressos e depois fosse só programar, mas como disseste e bem não vêm, mas a área está lá... Não acredito que esteja lá por acaso...  :Admirado:  Não dá para usar aquela área?

----------


## Pedro Ferrer

Bom dia

Segue o 1º código que usei para testar o GSM.




> char incoming_char=0;      //Will hold the incoming character from the Serial Port.
> char mobilenumber[] = "xxxxxxxxx";  // Replace xxxxxxxx with the recipient's mobile number
> 
> void setup() {
> Serial.begin(9600);		
> Serial1.begin(9600);	//GSM
> Serial.println("Em comunicacao...");
> delay(35000); // give the GSM module time to initialise, locate network etc.
> }
> ...


Abraço
Pedro Ferrer

----------


## Nuno Prazeres

> Bom dia
> 
> Segue o 1º código que usei para testar o GSM.
> 
> 
> 
> Abraço
> Pedro Ferrer


Muito obrigado!

Já encontrei um documento com dezenas de páginas de comandos AT e perco-me por completo no meio de tanta informação.

Este tipo de ajuda poupa horas e horas de derrapagens na estrada encharcada da minha ignorância.  :SbOk5:   :tutasla:

----------


## Baltasar Parreira

Atenção que cada modulo GSM tem os seus próprios comandos AT, eu penso que o do Pedro seja com outro e não use o TC35 da Siemens.

No entanto aqui fica um código com o mais simples e pratico que pode ser necessário para testes do TC35, depois é só as retirar as partes que querem de código para usar no vosso final.

Neste exemplo é usada a lib para simular portas SERIAL em qualquer par de pinos o que quer dizer que isto funciona em qualquer arduino, quem tem Megas não precisa de usar essa lib é usara os pares de pinos extra SERIAL que o Mega tem.

Aqui fica o código:




> // serial speed to use with phone
> #define PHONE_SERIAL_BUAD 9600
> // Puts teh phone into SMS texting mode ( as opposed to MMS, etc.)
> #define PHONE_SET_SMS_TXT_MODE_COMMAND "AT+CMGF=1" 
> // Command used to send a message
> #define PHONE_SEND_MSG "AT+CMGS=" 
> // Command to dial a call
> #define PHONE_DIAL_CALL "ATD" 
> #define PHONE_END_CALL "ATH" 
> ...


Outra nota: após efectuarem todas as ligações do modulo GSM ao Arduino e ligarem os respectivos powers, tem de ser pressionado o botão do modulo GSM que irá fazer com que o led vermelho junto do mesmo fique a piscar, só assim o modulo fica operacional para receber comandos. Ainda não fiz testes adicionais se existe ou não algum comando para eliminar este processo e colocar o modulo operacional, talvez até ao fim de algum tempo após ligar o power ele passa a este estado e o pressionar de botão seja só para eliminar o delay de espera que tem ao inicializar antes de chegar ao estado de "Ready", fica aqui a ideia para concluírem nos vossos testes também e darem feedback se descobrirem mais alguma coisa adicional.

----------


## Rui Manuel Gaspar

> Funciona!!!
> 
> Obrigado Rui, pelo código!
> 
> Está a ajudar-me a desenvolver o meu UI bastante!!! 
> 
> Já agora, sabes como colocar aqueles icons na parte esquerda (nesta imagem em baixo) do visor?
> 
> 
> Eu como via isto em todas as imagens presumi que já viessem pré-impressos e depois fosse só programar, mas como disseste e bem não vêm, mas a área está lá... Não acredito que esteja lá por acaso...  Não dá para usar aquela área?


 
Boas  :Olá: ,

Hugo,

Que eu saiba não!
Por isso desenvolvi a minha própria UI com os meus botões!

É que essa área sai fora do range to display. Mesmo na LIB original não encontrei nada que permitisse isso. Mas podes sempre mandar um mail aos gajos!

Abraços,

----------


## Hugo Figueiredo

> Boas ,
> 
> Hugo,
> 
> Que eu saiba não!
> Por isso desenvolvi a minha própria UI com os meus botões!
> 
> É que essa área sai fora do range to display. Mesmo na LIB original não encontrei nada que permitisse isso. Mas podes sempre mandar um mail aos gajos!
> 
> Abraços,


Pois eu também não vi nada, mas não achas estranho estar lá a área e nas imagens aparecerem sempre esses botões?

Aquilo deve haver ali qualquer coisa!

E já agora, para lá dos pinos do LCD que usa aqueles 40 no final do mega, quais os pinos para as restantes funcionalidades do shield, sabes?

RTC, SD, e acho que flahs ou lá o que é...  :Admirado:

----------


## Rui Manuel Gaspar

> Pois eu também não vi nada, mas não achas estranho estar lá a área e nas imagens aparecerem sempre esses botões?
> 
> Aquilo deve haver ali qualquer coisa!
> 
> E já agora, para lá dos pinos do LCD que usa aqueles 40 no final do mega, quais os pinos para as restantes funcionalidades do shield, sabes?
> 
> RTC, SD, e acho que flahs ou lá o que é...



Boas  :Olá: ,

No site da itead tem o manual e estao os pinos todos descritos.

Abracos,

----------


## Hugo Figueiredo

Pois eu já la andei a ver, mas fico sem perceber bem... :Coradoeolhos: 

Eles falam em 40 pinos para tudo, ou seja, LCD, RTC, SD e flash, mas depois no mapeamento apenas referem 33 pinos:

5V
3V3
GND
D22(PA0)
D23(PA1)
D24(PA2)
D25(PA3)
D26(PA4)
D27(PA5)
D28(PA6)
D29(PA7)
D37(PC0)
D36(PC1)
D35(PC2)
D34(PC3)
D33(PC4)
D32(PC5)
D31(PC6)
D41(PG0)
D40(PG1)
D39(PG2)
D38(PD7)
D50(PB3)
D51(PB2)
D52(PB1)
D53(PB0)
D6
D5
D4
D3
D2
D20
D21

Será porque os pinos de power são partilhados?!?!?!?  :Admirado: 

Fazendo fé nisto, ficaríamos com estes pinos ocupados:


Será assim?

É importante saber isto para saber quais os pinos que precisam de screw terminal no shield do Baltazar... :Pracima: 



EDIT:Isto para TFT com shield, claro está!

----------


## Rui Manuel Gaspar

> Pois eu já la andei a ver, mas fico sem perceber bem...
> 
> Eles falam em 40 pinos para tudo, ou seja, LCD, RTC, SD e flash, mas depois no mapeamento apenas referem 33 pinos:
> 
> 5V
> 3V3
> GND
> D22(PA0)
> D23(PA1)
> ...


Hugo, 

Estás correctíssimo !

D20 e D21 são para o RTC
D50 a D53 para o SD
E se percebi correctamente D2 a D6 para o Touch e o resto para o TFT

Fixolas não???? E ainda ficam montes de pinos para o que a malta quer ...

GSM, pH, ORP, DIM 4 canais, 8 tomadas, 6 boias de nível! acho que chega!

Abraços,

----------


## Hugo Figueiredo

Ok, fixe!

E já agora qual á pilha para o rtc?  :Admirado:

----------


## Rui Manuel Gaspar

Boas  :Olá: ,

É exactamente a mesma das MotherBoards dos computadores.

Abraços,

----------


## Pedro Ferrer

Boa tarde




> E já agora qual á pilha para o rtc?





> Lithium coin cell battery (CR1225 41mAh) will run the module for a minimum of 9 years (17 years typical) without external 5V power.


Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Eu uso a CR2032 nos meus RTC que pelo aspecto do holder soldado no PCB parece ser igual aos meus logo penso que seja o tamanho certo, pois como a referencia da bateria indica tem 20mm × 3.2mm.

A que o Pedro indica tem portanto 12.5mm x 2.5mm.

É uma questão de medires o diâmetro do suporte para ver se aceita pilha de 20mm ou 12.5mm.

----------


## Pedro Ferrer

Boa tarde




> A que o Pedro indica tem portanto 12.5mm x 2.5mm.
> 
> É uma questão de medires o diâmetro do suporte para ver se aceita pilha de 20mm ou 12.5mm.


Pois... tanta coisa diferente...
O meu RTC é este.
Real Time Clock Module inmotion.pt - DIY tools for the creative mind

Abraço
Pedro Ferrer

----------


## Hugo Figueiredo

Este parece maior realmente...



P.S.:Quem quiser coisas desta loja, atenção que estão com 5% de desconto por causa de um feriado qualquer na China... :Pracima:

----------


## Nuno Prazeres

> P.S.:Quem quiser coisas desta loja, atenção que estão com 5% de desconto por causa de um feriado qualquer na China...


Podes recordar qual é a loja?

----------


## Hugo Figueiredo

> Podes recordar qual é a data?


 iStore, Make Innovation Easier

----------


## JoaoCAlves

Pelo Socket, parece-me a 2032.

----------


## JoaoCAlves

Bom, mandei vir um kit tb.

Parece que em breve terei um GLCD com touch para vender.

Se alguem tiver interessado...  :SbOk:

----------


## Fernando Garcia

> Boas ,
> 
> Baltasar, é quase isso !!!!
> 
> Se reparares depois de encaixares isso em cima do mega as portas replicadas ficam para dentro.
> 
> Se coloco o shield por cima fico sem acesso a elas na mesma.
> 
> Interessava-me isso exactamente mas com as portas para fora ...
> ...


Rui, boa tarde!
Comprei um TFT igual ao seu http://global.ebay.com/ITDB02-32WC-3...850393077/item e também comprei o ITDB02 http://iteadstudio.com/store/index.p...roducts_id=231 gostaria de saber como resolveu o problema dos pinos 22 a 53.
Tentei perguntar antes de comprar mas, o fórum estava em manutenção e acabei comprando por ansiedade e pelo dolar ter caído um pouco.
Também gostaria que me ajudassem a encontrar um shield para o xbee (wireless) que pudesse ficar abaixo do TFT.
Aceito outras sugestões.
Grato.
Fernando Garcia

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Rui, boa tarde!
> Comprei um TFT igual ao seu http://global.ebay.com/ITDB02-32WC-3...850393077/item e também comprei o ITDB02 http://iteadstudio.com/store/index.p...roducts_id=231 gostaria de saber como resolveu o problema dos pinos 22 a 53.
> Tentei perguntar antes de comprar mas, o fórum estava em manutenção e acabei comprando por ansiedade e pelo dolar ter caído um pouco.
> Também gostaria que me ajudassem a encontrar um shield para o xbee (wireless) que pudesse ficar abaixo do TFT.
> Aceito outras sugestões.
> Grato.
> Fernando Garcia


Fernando não sei se percebo muito bem a tua questão mas vê este tópico na secção DIY

Group Buy/Build Arduino LEDS

Abraços,

----------


## Fernando Garcia

Olá!
Rui, eu já tinha visto este tópico mas, não tinha visto o desenho final da PCB.
Muito obrigado.

----------


## Fernando Garcia

Olá!
Pensei que fosse possível usar o xbee para controlar o arduino pela internet e acabei descobrindo que ele tem um protocolo própio que é destinado apenas para controlar equipamentos em pequenas distâncias.

Maiores informações neste site http://www.rogercom.com/ZigBee/ZigBee.htm

O shield que mencionei anteriormente é parecido com este



Para conectar o arduino na internet wifi é necessário este tipo de módulo http://global.ebay.com/Arduino-WiFi-...913338029/item



Abraço
Fernando Garcia

----------


## Fernando Garcia

Olá!
Mais uma dúvida.
É possível remover ou desabilitar o "microSD card Socket" deste shield para não dar conflito com o que vem no TFT?

http://www.ebay.com/itm/ws/eBayISAPI...m=290550886135

Grato.
Fernando Garcia

----------


## Baltasar Parreira

Penso que não Fernando a não ser cortando as pistas no PCB e colocando algum tipo de botão para quando for preciso voltar a ligar.

Os leitores SD normalmente funcionam por  comunicação SPI e esta não tem endereçamento que suporte mais que um circuito no barramento, mas como no link não mostra grande informação técnica não posso dizer muito mais.

----------


## Fernando Garcia

Baltasar, obrigado mais uma vez.
Encontrei este modelo (http://global.ebay.com/Ethernet-Shie...753241396/item) sem "microSD card Socket" mas, o vendedor não diz com quais modelos ele é compatível.
Alguém poderia me dizer se serve para o mega 2560? 

Outra coisa, o que vocês querem dizer quando usam a expressão "levar à massa do arduino"?

Grato.
Fernando Garcia

----------


## Baltasar Parreira

Massa = negativo ou qualquer ponto marcado no Arduino por GND (Ground).

----------


## Fernando Garcia

> Massa = negativo ou qualquer ponto marcado no Arduino por GND (Ground).


Thanks!

----------


## Fernando Garcia

Olá!
Alguém pode me dizer qual modificação precisa ser feita neste código para que ele funcione no TFT 3.2WC?

// ITDB02_Graph16_Textrotation_Demo (C)2011 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program is a demo of the textrotation-functions.
//
// This program requires the ITDB02_Graph16 library.
//
// This demo will work on the widescreen modules, but
// keep in mind that this demo was also made to work on
// the 240x320 modules, so it will not use the extra 
// pixels of the wider screen.
//

#include <ITDB02_Graph16.h>

// Declare which fonts we will be using
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

// Uncomment the next line for Arduino 2009/Uno
//ITDB02 myGLCD(19,18,17,16);   // Remember to add the parameter for your display if you are not using an ITDB02-3.2!

// Uncomment the next line for Arduino Mega
ITDB02 myGLCD(38,39,40,41);   // Remember to add the parameter for your display if you are not using an ITDB02-3.2!

void setup()
{
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
}

void loop()
{
    myGLCD.print("Text rotation", 0, 0);
    myGLCD.setColor(0, 0, 255);
    myGLCD.print("0 degrees", 0, 16, 0);
    myGLCD.print("90 degrees", 319, 0, 90);
    myGLCD.print("180 degrees", 319, 239, 180);
    myGLCD.print("270 degrees", 0, 239, 270);

    myGLCD.setFont(SevenSegNumFont);
    myGLCD.setColor(0, 255, 0);
    myGLCD.print("45", 90, 100, 45);
    myGLCD.print("90", 200, 50, 90);
    myGLCD.print("180", 300, 200, 180);

  while (true) {};
}

Grato.
Fernando Garcia

----------


## Baltasar Parreira

Nesta linha tens de passar o modelo do LCD:

ITDB02 myGLCD(38,39,40,41); 

ou seja fica assim no teu caso:

ITDB02 myGLCD(38,39,40,41,*ITDB32WC*); 
ou 
ITDB02 myGLCD(38,39,40,41,*1*);


*Lista de modelos e seus respectivo números:
ITDB32: 0
ITDB32WC: 1
TFT01_32W: 1
ITDB32S: 2
TFT01_32: 2
TFT01_24: 3*

----------


## Sérgio Paulo

Boa noite Fernando Garcia,

Para que assuma o display só tens de alterar os pinos de leitura do TFT e do Touch.

Vê *AQUI* o ponto 4 onde diz: Pin Description.

À partida só deve ser necessário trocares estas duas linhas:

*// Change pins for screen and touch panel if needed
ITDB02        myGLCD(38,39,40,41,ITDB32WC);     // Remember to add ASPECT_16x9 if you are using an ITDB02-3.2WC!
ITDB02_Touch  myTouch(6,5,4,3,2);*



*EDIT:* O Baltasar Parreira é a melhor pessoa para te ajudar neste assunto.  :SbOk5:

----------


## Fernando Garcia

Valeu!!!
Funcionou.

----------


## Fernando Garcia

Sérgio, o Baltasar respondeu um pouco antes de você.
Obrigado mesmo assim.

----------


## Sérgio Paulo

> Sérgio, o Baltasar respondeu um pouco antes de você.
> Obrigado mesmo assim.


Não tem problema Fernando Garcia, o que interessa é que nos possamos ajudar todos uns aos outros.

A mim também tem sido o Baltasar que me tem ajudado e muito.  :yb677: 

 :Pracima:

----------


## Fernando Garcia

Bom dia!
Pessoal, ontem consegui fazer o upload do programa (ITDB02_Graph16_Textrotation_Demo.pde) com as devidas alterações e em seguida fiz o upload do programa de calibração (ITDB02_Touch_Calibration.pde) mas, não consigo passar deste ponto:



Então resolvi apagar todos os arquivos e baixá-los  novamente mas, agora nem consigo compilar os programas pois, apresenta este erro:



Pensei que poderia poderia estava ocorrendo o mesmo problema que o Rui Manuel teve com o IDE instalei o programa em outro computador e o problema persiste.

Como posso resolver estes problemas.
Será que esqueci alguma "lib".




Grato.
Fernando Garcia

----------


## Hugo Figueiredo

Tens de ler o que aparece no quadro inicial antes desse!  :yb665: 

Mas basicamente tens de ficar 3 segundos a carregar no (+) para calibrar!

----------


## Fernando Garcia

Hugo, boa tarde!

Antes disto só tem um espaço preto.



Agora não tenho como tentar calibrar pois, já tirei o programa e não consigo compilar nenhum programa do Henning pois, todos apresentam o mesmo erro relacionado ao tipo de fonte.

----------


## Hugo Figueiredo

Vamos por partes:

1º volta a carregar tudo novamente para conseguires compilar o código do Henning.
2ºvolta a fazer a calibração, mas tens de ficar 3seg nos (+), não é só clicar.

E vais ver que ficas com o problema resolvido!

----------


## Fernando Garcia

Baixei a versão 0023 do IDE e coloquei estas "libs" (DS1307, ITDB02_Graph, ITDB02_Graph16 e ITDB02_Touch) e mesmo assim não compila.
Falta alguma lib?

----------


## Fernando Garcia

Hugo, pode me enviar seus arquivos?

Meu email é fefegarcia_1@hotmail.com

----------


## Sérgio Paulo

> Hugo, pode me enviar seus arquivos?
> 
> Meu email é fefegarcia_1@hotmail.com


Fernando, eu compactei o meu e podes testar.

Link: http://www.box.com/s/i1zu4lecyqfq8pttckts

Abraço,
Sérgio.

*EDIT:* É só o ficheiro de calibração, caso pretendas o IDE todo diz.  :SbOk:

----------


## Fernando Garcia

Sergio, obrigado!
Vou baixar todos os programas novamente e depois testar com seu arquivo.

Abraço.
Fernando Garcia

----------


## Sérgio Paulo

> Sergio, obrigado!
> Vou baixar todos os programas novamente e depois testar com seu arquivo.
> 
> Abraço.
> Fernando Garcia


Ok.  :SbOk3:

----------


## Fernando Garcia

TFT calibrado, relógio instalado e com horário correto.

Obrigado a todos.

----------


## Sérgio Paulo

> TFT calibrado, relógio instalado e com horário correto.
> 
> Obrigado a todos.


De nada Fernando, qualquer coisa que possa ajudar é só pedires.  :SbBienvenu1:

----------


## Fernando Garcia

Olá!
Pessoal, encontrei este tópico http://lusorobotica.com/index.php?topic=3436.30 onde um dos participantes mostra um programa que criou para controlar uma placa com reles.
Gostaria de pedir a algum dos mestres da programação que faça um pequeno tutorial de como criar um programa semelhante.
Eu ficarei muito grato assim, como os muitos que vocês entusiamaram a entrar neste mundo.
O dono do vídeo não postou em nenhum lugar o código que usou.
Acho que este simples código já daria uma luz para nós.
Sugestões de bibliografias específica para estes hardwarers também ajudariam muito.
Ficam aqui algumas imagens e um vídeo.








E também o site do criador

http://sites.google.com/site/grcbyte/home

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá pessoal!
Estou aqui mais uma vez para pedir uma ajuda.
Fiz algumas modificações no código disponibilizado neste site http://code.google.com/p/stilo/downloads/list e criei o menu para configurar os dias e horários que as TPA's automáticas devem acontecer porém, não sei como escrever o código para que ele armazene na eeprom os dias  e horário que ele deve executar a tarefa.
Aqui estão as imagens dos menus:





Na configuração do horário eu plotei o horário retirado do RTC mas, sei que esta não é a maneira correta.
Gostaria que os dias selecionados ficassem com uma cor diferente.

Os esquema da troca de água é o seguinte:

1º O arduino aciona uma bomba que tira água da minha quarentena e envia ao esgoto;
2° O sensor de nível detecta que já retirou o volume dejejado envia um INPUTao arduino para ele desligar a bomba;
3° O arduino aciona a segunda bomba que tira água do sump e envia para a quarentena;
4° O segundo sensor de nível detecta que já foi retirado o volume desejado e envia um INPUT ao arduino para que ele desligue a segunda bomba;
5° O Arduino aciona a terceira bomba que retira água de um reservatório e envia para o sump;
6 O terceiro sensor detecta que o sump esta no nível desejado e envia um INPUT para que o arduino desligue a terceira bomba.

Se alguém puder ajudar aqui está o código que estou usando : https://skydrive.live.com/redir.aspx...HJ2xZIi4KI_zh0
Tem muitos comentários que usei para poder entender o que cada coisa faz pois, não sou programador.
As aventureiros sintam-se à vontade para usar o código. 

Grato.
Fernando Garcia

----------


## Hugo Figueiredo

Minha gente, não se tinha falado por aqui sobre haver 2 chips para ethernet para o arduino e de um ser melhor que outro? ou isso era para o modulo de GSM?

Qual a melhor ompra pra ethernet sem ser em shield? :Admirado:

----------


## Fernando Garcia

Olá!
Alguém pode me dizer o que está errado neste código para que o arduino sempre retorne para x, y e z o valor de 100?

void phScreen()
{
  int x, y, z;
  int a =8.4;
  int b =0.2;
  int c =0.2;
.
.
.
.

    linhaR =a;  //  Linhas de comparação
    linhaG =a+b
    linhaB =a-c

   if ((linhaR>7) && (linhaR<=9))
x= 190-((linhaR-7)*75);

   else if (linhaR >9)
x=30;

   else if (linhaR <7)
x=190;

   if ((linhaG>7) && (linhaG<=9))
y= 190-((linhaG-7)*75);

   else if (linhaG >9)
y=30;

   else if (linhaG <7)
y=190;

   if ((linhaB>7) && (linhaB<=9))
z= 190-((linhaB-7)*75);

   else if (linhaB >9)
z=30;

   else if (linhaB <7)
z=190;


     myGLCD.setColor(255, 0, 0);
     myGLCD.drawLine(40, x, 290, x);//PH desejado
     myGLCD.setColor(10, 10, 255);        //Variação permitida
     myGLCD.drawLine(40, y, 290, y); //variação mais
     myGLCD.drawLine(40, z, 290, z); //variação menos

     printButton("INICIO", iniC[0], iniC[1], iniC[2], iniC[3],false); 
     printButton("MENU", menU[0], menU[1], menU[2], menU[3], false);
     printButton("VOLTAR", volT[0], volT[1], volT[2], volT[3],false);
    }
Grato
Fernando Garcia

----------


## Baltasar Parreira

não podes atribuir a uma variável INTEGER um valor fraccionário, ao fazeres:

int a =8.4;
int b =0.2;
int c =0.2;

a variável a vai ficar somente com o valor 8 ou nem sei como reage, logo entra sempre no primeiro IF, para trabalhares com valores fraccionários tem de declarar as variáveis como float, mas atenção o Arduino como é um processador só de 8 bits falha muito em contas com floats e da valores errados, para alem que gasta mais memoria e corre mais lento o programa.

----------


## Fernando Garcia

Obrigado mais uma vez Baltazar.

coloquei assim:

float a =8.4;
float b =0.2;
float c =0.2;

E agora o arduino imprime os valores corretos.

Não sabia que o "int" era uma abreviação de INTEGER pensava que era uma variável qualquer.
Abraço.
Fernando Garcia

----------


## Hugo Figueiredo

> Minha gente, não se tinha falado por aqui sobre haver 2 chips para ethernet para o arduino e de um ser melhor que outro? ou isso era para o modulo de GSM?
> 
> Qual a melhor compra pra ethernet sem ser em shield?


oi? :yb665:

----------


## Fernando Garcia

Olá pessoal!
Cá estou eu mais uma vez a pedir a vossa ajuda.
Estou tentando migrar meu programa para usar a Lib DS1307 do Henning pois, a lib que estou usando não dá muita atenção para o dia da semana que será importante na configuração da TPA automática.
O único exemplo que tenho do uso desta lib é o do Relógio analógico.
Até o momento consegui compilar o programa e fazer o upload mas, não consigo acertar o relógio porque toda a vez que toco na tela o relógio é atualizado pelo rtc e se eu mudo aforma de atribuir as variáveis o horário impresso fica pausado e não cosigo mudar nada.
Também o horário da tela inicial (mainScreen) não é apresentado de forma correta.
Gostaria que ajudassem a corrigir a forma como as variáveis declaradas.

Os trechos do código que envolvem o rtc são estes:

#include <DS1307henning.h>
DS1307 rtc(20, 21);
Time  t;
String time, date;

void mainScreen(boolean refreshAll=false)
{
  int ledLevel, s, u;
  String oldval, rtc1, rtcm;

  if ((t.min>=0) && (t.min<=9)) {
      rtc1= '0' + String(t.min);         //adds 0 to minutes
    }
    else {
      rtc1= String(t.min);
    }

  if ((t.hour>=0) && (t.hour<=9)) {
      rtcm= '0' + String(t.hour);         //adds 0 to hour
    }
    else {
      rtcm= String(t.hour);
    }

  oldval = time;                           //refresh time if different
  time= rtcm+':'+rtc1;
  if ((oldval!=time) || refreshAll)
    {
     char bufferT[7];
     time.toCharArray(bufferT, 7);         //String to Char array 
     setFont(LARGE, 0, 255, 0, 0, 0, 0);
     myGLCD.print(bufferT, 320, 22);           // Display time
    }

  oldval = date;                             //refresh date if different
  date= "  " + String(t.date) + '.' + String(t.mon) + '.' + String(t.year);
  if ((oldval!=date) || refreshAll)
    {
     char bufferD[13];
     date.toCharArray(bufferD, 13);          //String to Char array
     setFont(SMALL, 255, 255, 255, 0, 0, 0);
     myGLCD.print(bufferD, 308, 6);            //Display date 

    char bufferLP[16];
    LP.toCharArray(bufferLP, 16);
    myGLCD.print(bufferLP, 98, 210); //Print Moon Phase Description to LCD

   float lunarCycle = moonPhase(t.date, t.mon, t.year); //get a value for the lunar cycle
   if ((lunarCycle*100) < 1) //Print % of Full to LCD
     { myGLCD.print(" 0.00", 212, 210); }
else { myGLCD.printNumF(lunarCycle*100, 1, 242, 210);}
       myGLCD.print("% Iluminada", 280, 210);
       myGLCD.print("Fase lunar:", 10, 210);
    }
  oldval = date; //refresh date if different
.
.
.
}

void clockScreen(boolean refreshAll=true)//----------------------Relogio----------------------------------------------------- tela =2
{
  Time t_temp;
    t_temp = rtc.getTime();

    if (refreshAll)


      printHeader("Alterar hora e data");

      printButton ("+", houU[0], houU[1], houU[2], houU[3], true);   //hour up
      printButton ("-", houD[0], houD[1], houD[2], houD[3], true);   //hour down

      printButton ("+", minU[0], minU[1], minU[2], minU[3], true);   //min up
      printButton ("-", minD[0], minD[1], minD[2], minD[3], true);   //min down 

      printButton ("+", segC[0], segC[1], segC[2], segC[3], true);   //segundo mais
      printButton ("-", segB[0], segB[1], segB[2], segB[3], true);   //segundo menos

      printButton ("+", yeaU[0], yeaU[1], yeaU[2], yeaU[3], true);    //year up
      printButton ("-", yeaD[0], yeaD[1], yeaD[2], yeaD[3], true);     //year down

      printButton ("-", dayD[0], dayD[1], dayD[2], dayD[3], true);     //day down
      printButton ("+", dayU[0], dayU[1], dayU[2], dayU[3], true);    //day up

      printButton ("+", monU[0], monU[1], monU[2], monU[3], true);    //month up
      printButton ("-", monD[0], monD[1], monD[2], monD[3], true);     //month down



      printButton("SALVAR", prOK[0], prOK[1], prOK[2], prOK[3]);
      printButton("INICIO", iniC[0], iniC[1], iniC[2], iniC[3]);
      printButton("MENU", menU[0], menU[1], menU[2], menU[3]);


    setFont(LARGE, 255, 255, 255, 0, 0, 0);
    myGLCD.print("   :     ", 70, 48);  //fill over old time
    myGLCD.print("   :     ", 160, 48);  //fill over old time
    myGLCD.printNumI(t_temp.hour, 70, 48);
    myGLCD.printNumI(t_temp.min, 160, 48);
    myGLCD.printNumI(t_temp.sec, 250, 48);
    myGLCD.print("        ", 70, 132);   //fill over old date
    myGLCD.printNumI(t_temp.date, 70, 132);
    myGLCD.printNumI(t_temp.mon, 160, 132);
    myGLCD.printNumI(t_temp.year, 230, 132);
    myGLCD.setFont(SmallFont);
    myGLCD.print("Hora:", 10, 51);
    myGLCD.print("Data:", 10, 134);
}

void setClock()
  {
   Time t_temp;

   rtc.halt(true);            //RTC clock setup 
   rtc.setTime(t.hour, t.min, t.sec);
   rtc.setDate(t.date, t.mon, t.year);
   delay(10);
   rtc.halt(false);
   delay(10);
  }

void processMyTouch()
{
  myTouch.read();
    x=myTouch.getX();
    y=myTouch.getY();
    Time t_temp;

.
.
case 2:              ///Hora e data
         if ((x>=prOK[0]) && (x<=prOK[2]) && (y>=prOK[1]) && (y<=prOK[3]))      // Função salvar
        {
        waitForIt(prOK[0], prOK[1], prOK[2], prOK[3]);

        setClock();

        dispScreen=0;
        clearScreen();
       clearMenu();     
        mainScreen(true);
        }

      else
       {
        if ((y>=houU[1]) && (y<=houU[3]))                      //first row
          {
           if ((x>=houU[0]) && (x<=houU[2]))                   //press hour up
            {
             waitForIt(houU[0], houU[1], houU[2], houU[3]);
             t_temp.hour+=1;
          if (t_temp.hour==24)
             t_temp.hour=0;
            }
           if ((x>=minU[0]) && (x<=minU[2]))                    //press min up
            {
             waitForIt(minU[0], minU[1], minU[2], minU[3]);
             t_temp.min+=1;
          if (t_temp.min==60)
            t_temp.min=0;
            }
             if ((x>=segC[0]) && (x<=segC[2]))                    
            {
             waitForIt(segC[0], segC[1], segC[2], segC[3]);       //segundo mais
             t_temp.sec+=1;
          if (t_temp.sec==60)
            t_temp.sec=0;
            }
            }


        if ((y>=houD[1]) && (y<=houD[3]))                         //second row
          {
           if ((x>=houD[0]) && (x<=houD[2]))                      //press hour down
             {
              waitForIt(houD[0], houD[1], houD[2], houD[3]);
                 t_temp.hour-=1;
          if (t_temp.hour==255)
            t_temp.hour=23; 
              }
           if ((x>=minD[0]) && (x<=minD[2]))                       //press min down
              {
               waitForIt(minD[0], minD[1], minD[2], minD[3]);
               t_temp.min-=1;
          if (t_temp.min==255)
            t_temp.min=59;
              }
               if ((x>=segB[0]) && (x<=segB[2]))                      
              {
               waitForIt(segB[0], segB[1], segB[2], segB[3]);        //segundo menos
               t_temp.sec-=1;
          if (t_temp.sec==255)
            t_temp.sec=59;
              }
          }


        if ((y>=dayU[1]) && (y<=dayU[3]))                           //third row
          {
          if ((x>=dayU[0]) && (x<=dayU[2]))                          //press day up
            {
             waitForIt(dayU[0], dayU[1], dayU[2], dayU[3]);
             t_temp.date+=1;
          t_temp.date=validateDate(t_temp.date, t_temp.mon, t_temp.year);
             }
           if ((x>=monU[0]) && (x<=monU[2]))                          //press month up
             {
              waitForIt(monU[0], monU[1], monU[2], monU[3]);
              t_temp.mon+=1;
          if (t_temp.mon==13)
            t_temp.mon=1;
          t_temp.date=validateDateForMonth(t_temp.date, t_temp.mon, t_temp.year);
             }
            if ((x>=yeaU[0]) && (x<=yeaU[2]))                          //press year up
              {
               waitForIt(yeaU[0], yeaU[1], yeaU[2], yeaU[3]);
               if (t_temp.year==2100)
            t_temp.year=2000;
            t_temp.date=validateDateForMonth(t_temp.date, t_temp.mon, t_temp.year);
               }
          }

        if ((y>=dayD[1]) && (y<=dayD[3]))                               //fourth row
          {
          if ((x>=dayD[0]) && (x<=dayD[2]))                         //press day down
            {
             waitForIt(dayD[0], dayD[1], dayD[2], dayD[3]);
            t_temp.date-=1;
          t_temp.date=validateDate(t_temp.date, t_temp.mon, t_temp.year);
             }
           if ((x>=monD[0]) && (x<=monD[2]))                              //press month down
             {
              waitForIt(monD[0], monD[1], monD[2], monD[3]);
              t_temp.mon-=1;
          if (t_temp.mon==0)
            t_temp.mon=12;
          t_temp.date=validateDateForMonth(t_temp.date, t_temp.mon, t_temp.year);
              }
            if ((x>=yeaD[0]) && (x<=yeaD[2]))                              //press year down
              {
               waitForIt(yeaD[0], yeaD[1], yeaD[2], yeaD[3]);
                           t_temp.year=2099;
          t_temp.date=validateDateForMonth(t_temp.date, t_temp.mon, t_temp.year);
              }
          }
         clockScreen(false); 

        } 
.
.
.
}

void setup()
{
.
.
.
rtc.halt(false);
.
.
.
}

byte validateDate(byte d, byte m, word y)
{
  byte mArr[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
  byte od;

  if (m==2)
  {
    if ((y % 4)==0)
    {
      if (d==30)
        od=1;
      else if (d==0)
        od=29;
      else
        od=d;
    }
    else
    {
      if (d==29)
        od=1;
      else if (d==0)
        od=28;
      else
        od=d;
    }
  }
  else
  {
    if (d==0)
      od=mArr[m-1];
    else if (d==(mArr[m-1]+1))
      od=1;
    else
      od=d;
  }

  return od;
}

byte validateDateForMonth(byte d, byte m, word y)
{
  byte mArr[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
  byte od;
  boolean dc=false;

  if (m==2)
  {
    if ((y % 4)==0)
    {
      if (d>29)
      {
        d=29;
        dc=true;
      }
    }
    else
    {  
      if (d>28)
      {
        d=28;
        dc=true;
      }
    }
  }
  else
  {
    if (d>mArr[m-1])
    {
      d=mArr[m-1];
      dc=true;
    }
  }


  return d;
}

byte calcDOW(byte d, byte m, int y)
{
  int dow;
  byte mArr[12] = {6,2,2,5,0,3,5,1,4,6,2,4};

  dow = (y % 100);
  dow = dow*1.25;
  dow += d;
  dow += mArr[m-1];
  if (((y % 4)==0) && (m<3))
    dow -= 1;
  while (dow>7)
    dow -= 7;

  return dow;
}


Desculpem-me se estou sendo muito chato.
Desde já agradeço aos que puderem ajudar.
Abraço.
Fernando Garcia

----------


## Nuno Prazeres

Bom dia Fernando!

Provavelmente não é a ajuda que queres mas tenho usado o método clássico de me limitar à wire.h e usar o endereçamento standard e não tenho tido erros no dia da semana.

É aquele código que toda a gente usa e que começa pelos conversores de bcd.

A única dificuldade que tive foi a convertê-lo para o novo IDE1.0. 

Estou a escrever este post num telemóvel. Quando voltar ao PC, coloco aqui o código.

----------


## JoaoCAlves

Boas.

Não estive a bater o teu código, mas aconteceu-me o mesmo.

Basicamente o que eu tava a fazer mal, é que estava a editar as variaveis que tb eram actualizadas pelo rtc.

Para resolver o problema, criei umas variaveis temporárias as quais ficam em utilização na altura do acerto da hora. Qd termino o acerto, copio as temporárias para as reais e tá feito.

Valida se por acaso não estás a fazer o mesmo.

Abraço,

João.

----------


## Nuno Prazeres

Boas,

Estou a começar a fazer o código para o temporizador que me vai controlar as luzes.

Qual o esquema mais expedito para fazer tal coisa?

Vou ter 4 canais ligados com relay.

Apenas num deles farei o pwm.

Estava a pensar usar uma variável a que chamo "Sunset" que representa o por do sol artificial e inicializar um contador de minutos diariamente a essa hora. Depois teria uma hora de início e outra de fotoperíodo para cada canal.
O tal sunset facilita-me a vida porque o valor do contador de minutos fica independente da hora do dia. Se usar por exemplo algo como Contaminutos = 60 * RTC_Hour + RTC_Minute; ficava com os fotoperíodos truncados na meia noite.

Quanto ao pwm ainda não sei como será mas vi alguém a usar a função "map" para o efeito.

----------


## TiagoKosta

Boas,

Esse problema também me surgiu e eu resolvi da seguinte forma:

Se a hora de ligar for inferior à de desligar
então relay liga enquanto hora real for superior à hora de ligar e inferior à de desligar.
Se a hora de ligar for superior à de desligar
então relay liga enquanto a hora real for superior à hora de ligar e inferior ou igual a hora real de 23:59:59 e liga novamente enquanto a hora real superior ou igual 0:0:0 e inferior a hora de desligar!
Dá para perceber?  :Smile: 

Como estou a trabalhar não tenho aqui o código mas penso que dá para perceber.

Qualquer dúvida diz qualquer coisa.

Tiago Costa

----------


## Nuno Prazeres

Penso que entendi! :-)

Obrigado

----------


## Fernando Garcia

Nuno, o que acha de criar uma tabela e fazer o PWM à partir dela.
Veja o Modelo que estou usando:

----------


## Nuno Prazeres

Obrigado Fernando. Fica bem mais rigoroso mas é capaz de dar um valente trabalho.
Eu quero o meu código o mais simples possível daí ter optado por um LCD 16x2 e apenas um canal de leds com pwm.

----------


## Fernando Garcia

Com um lCD 16x2 você não precisa mostrar os valores na tela para edição.
Caso você queira mudar os valores edita na IDE e faz o upload novamente.
Também pode usar só a parte referente a uma cor de led.
Aqui está um pedaço do código:

byte bled[96] = {
12, 12, 12, 12, 12, 12, 12, 12, //0 e 2
12, 12, 12, 12, 12, 12, 12, 12, //2 e 4
12, 12, 12, 12, 12, 21, 30, 39, // 4 e 6
48, 57, 66, 75, 84, 93, 102, 111, // 6 e 8 
120, 129, 138, 147, 156, 165, 174, 183, // 8 e 10
192, 201, 210, 219, 228, 237, 246, 255, // 10 e 12
255, 246, 237, 228, 219, 210, 201, 192, // 12 e 14
183, 174, 165, 156, 147, 138, 129, 120,  // 14 e 16
111, 102, 93, 84, 75, 66, 57, 48,  // 16 e 18
39, 30, 21, 12, 12, 12, 12, 12,  //18 a 20
12, 12, 12, 12, 12, 12, 12, 12, // 20 e 22
12, 12, 12, 12, 12, 12, 12, 12 // 22 a 24
};

void LED_levels_output()
{
int sector, sstep, t1, t2 ;
int b_out, w_out;

 if (min_cnt>=1440) {min_cnt=1;}   // 24 hours of minutes 
 sector = min_cnt/15;              // divided by gives sector -- 15 minute
 sstep = min_cnt%15;               // remainder gives add on to sector value 

  t1 =sector;
  if (t1==95) {t2=0;}
   else {t2 = t1+1;}

  if (sstep==0) {
    bled_out = bled[t1];
    wled_out = wled[t1];
  } else {
    bled_out = check(&bled[t1], &bled[t2], sstep);
    wled_out = check(&wled[t1], &wled[t2], sstep);
  }

   // Serial.println(bled_out);
  //Serial.println(wled_out);

  if (BUCKPUCK) {
    b_out = bled_out;
    w_out = wled_out;
  } else {
    b_out = bled_out;
    w_out = wled_out;
  }

  analogWrite(ledPinBlue, b_out);
  analogWrite(ledPinWhite, w_out);
}

int check( byte *pt1, byte *pt2, int lstep)
{
  int result;
  float fresult;

  if (*pt1==*pt2) {result = *pt1;}   // No change
    else if (*pt1<*pt2)                //Increasing brightness
    { fresult = ((float(*pt2-*pt1)/15.0) * float(lstep))+float(*pt1);
     result = int(fresult);
     }
     //Decreasing brightness
    else {fresult = -((float(*pt1-*pt2)/15.0) * float(lstep))+float(*pt1);
     result = int(fresult);                     
    } 
    return result;
}

void loop()
 {
  unsigned long currentMillis = millis();

  if (myTouch.dataAvailable())  {
    processMyTouch();
  }

  if (currentMillis - previousMillis > 5000)    //check time, temp and LED levels every 5s
    {
      previousMillis = currentMillis;  
      RTC.get(rtc,true);

      checkTempC();

      min_cnt= (rtc[2]*60)+rtc[1];
      LED_levels_output();

      if (dispScreen == 0) {
        mainScreen();    }

    }

----------


## Nuno Prazeres

Obrigado.

Penso que entendi o código.

Agora para fazer algo tão rigoroso optaria por usar uma função que modelizasse a intensidade ao longo do dia. Pelo que vi, a intensidade da luz segue uma função bastante parecida com uma distribuição normal (curva de Gauss).

Já agora... A função checkTempC() serve para baixar a intensidade dos leds se o dissipador aquecer demasiado?

----------


## Fernando Garcia

Bom dia!
Os valores de PWM foram inseridos por mim, eu quiz que a potência fosse subindo ate alcançar o valor máximo ao meio dia. Você pode configurar como quiser.
A função checkTempC é uma parte do meu código que faz o controle do aquecedor, do chiller e da velocidade das ventoinhas que resfriam o dissipador dos leds.
Nada impede de criar uma condicional que multiplique a potência de saída dos leds por um valor menor que 1, caso a temperatura do dissipador seja "X" °C.

----------


## Fernando Garcia

Nuno, considerando que os algoritmos do Pedro Ferrer estejam certos, a variação da luminosidade segue uma distribuição de Gauss.




Ps. Você me fez lembrar das aulas de algebra linear e do método de Gauss-Jordan que eu não acertava nunca.

----------


## Pedro Ferrer

Boa tarde




> Até o momento consegui compilar o programa e fazer o upload mas, não consigo acertar o relógio porque toda a vez que toco na tela o relógio é atualizado pelo rtc e se eu mudo aforma de atribuir as variáveis o horário impresso fica pausado e não cosigo mudar nada.
> Também o horário da tela inicial (mainScreen) não é apresentado de forma correta.


Não sei se é o caso...
Mas não te esqueças que para acertar as horas, deverás fazer um STOP ao RTC, acertar então as horas e lançares um START ao RTC.

Abraço
Pedro Ferrer

----------


## Fernando Garcia

Olá pessoal!
Obrigado pelas respostas.
Já consegui resolver os problemas do relógio.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá pessoal!
Cá estou mais uma vez.
Alguém sabe me dizer como faço para que o botão volte aos estado 1 quando for tocado pela segunda vez?

Estado 1:

  printButton ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda

 

Estado 2:

        if ((x>=segU[0]) && (x<=segU[2]) &&  (y>=segU[1]) && (y<=segU[3]))
        {
         tempsegunda=1;      
         printButtonTpa ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
        }



Grato.
Fernando Garcia

----------


## Nuno Prazeres

> Ps. Você me fez lembrar das aulas de algebra linear e do método de Gauss-Jordan que eu não acertava nunca.


Lol!

Peço desculpa então!  :Smile:

----------


## Carlos Mogas da Silva

> Olá pessoal!
> Cá estou mais uma vez.
> Alguém sabe me dizer como faço para que o botão volte aos estado 1 quando for tocado pela segunda vez?


É só alterares aqui:

if ((x>=segU[0]) && (x<=segU[2]) && (y>=segU[1]) && (y<=segU[3]))
{
   if (tempsegunda == 1) {
       printButton ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
       tempsegunda = 0;
   } else {
       printButtonTpa ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
       tempsegunda = 1;
   }
}

----------


## Fernando Garcia

Carlos, bom dia!
Obrigado pela resposta.
Já tentei esta opção e o resultado é este:




Deram-me esta sugestão:

"I would either use "if / else" statements with a counter, or use boolean "true / false." You're already using "if" statments, so just define a new integer constant (ie - int counter= 0 ; ), include a statement that adds (ie - counter++ ; ), then throw in another conditional statement (ie - if (counter>1) {counter= 0;}) So it will either be "state 1" or "state 2."

Mas, meus infinitos conhecimentos de programação não me permitem que eu consiga entender.
Abraço.
Fernando Garcia

----------


## Carlos Mogas da Silva

> "I would either use "if / else" statements with a counter, or use boolean "true / false." You're already using "if" statments, so just define a new integer constant (ie - int counter= 0 ; ), include a statement that adds (ie - counter++ ; ), then throw in another conditional statement (ie - if (counter>1) {counter= 0;}) So it will either be "state 1" or "state 2."


É exactamente isto que estás a fazer com o código que te dei. Acontece que aquele pedaço de código está *sempre* a ser executado, ou seja, está constantemente a trocar a cor. A ideia é aquilo só ser executado quando for pressionado aquele bocado do ecrã.

Fiz aquilo de cabeça sem ver o resto do código. Se me puderes mostrar o resto, principalmente a parte que é sempre executada (que está em ciclo a fazer o desenho), e a parte que te detecta o toque no ecrã, consigo ajudar melhor.

----------


## Paulo R Pinto

voces são uns cranios..........sinto-me mesmo burro, pois não percebo nada de nada de programação, mas tenho acompanhado o projecto, e acho brutal

----------


## Fernando Garcia

> voces são uns cranios..........sinto-me mesmo burro, pois não percebo nada de nada de programação, mas tenho acompanhado o projecto, e acho brutal


Paulo, quando comecei a ler estes tópicos não sabia fazer nem um pisca led.

Estou fazendo apenas por observação de outros códigos.
E quando não tenho um exemplo para me basear ocorre o que o meu professor de cálculo numérico costumava nos dizer "Pan! Blue screen".

----------


## Fernando Garcia

> É exactamente isto que estás a fazer com o código que te dei. Acontece que aquele pedaço de código está *sempre* a ser executado, ou seja, está constantemente a trocar a cor. A ideia é aquilo só ser executado quando for pressionado aquele bocado do ecrã.
> 
> Fiz aquilo de cabeça sem ver o resto do código. Se me puderes mostrar o resto, principalmente a parte que é sempre executada (que está em ciclo a fazer o desenho), e a parte que te detecta o toque no ecrã, consigo ajudar melhor.


Carlos, obrigado mais uma vez.
Aqui esta o código.

void tpaScreen(boolean refreshAll=false)//--------------------------------------------------------tela = 7
{

  int x, y;
  int res=0;
  temp2hora =hora ;
  temp2minuto = minuto;
  temp2segundo = segundo;
  temp2segunda = segunda;
  temp2terca = terca;
  temp2quarta = quarta;
  temp2quinta = quinta;
  temp2sexta = sexta;
  temp2sabado = sabado;

 clearScreen();

  printHeader("Conf. dias e horario para a TPA");

  printButton ("+", houU[0], houU[1], houU[2], houU[3], true);   //hour up
  printButton ("-", houD[0], houD[1], houD[2], houD[3], true);   //hour down
  printButton ("+", minU[0], minU[1], minU[2], minU[3], true);   //min up
  printButton ("-", minD[0], minD[1], minD[2], minD[3], true);   //min down 
  printButton ("+", segC[0], segC[1], segC[2], segC[3], true);   //min up
  printButton ("-", segB[0], segB[1], segB[2], segB[3], true);   //min down 

  if (temp2segunda==1)
  {
  printButtonTpa ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
  }
  else
  {
  printButton ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
  }
  if (temp2terca==2)
  {
  printButtonTpa ("TERCA", terC[0], terC[1], terC[2], terC[3]); //botao terca
  }
  else
  {
  printButton ("TERCA", terC[0], terC[1], terC[2], terC[3]); //botao terca
  }
  if(temp2quarta==3)
  {
  printButtonTpa ("QUARTA", quaR[0], quaR[1], quaR[2], quaR[3]); //botao quarta
  }
  else
  {
  printButton ("QUARTA", quaR[0], quaR[1], quaR[2], quaR[3]); //botao quarta
  }
  if (temp2quinta==4)
  {
  printButtonTpa ("QUINTA", quiN[0], quiN[1], quiN[2], quiN[3]); //botao quinta
  }
  else
  { 
  printButton ("QUINTA", quiN[0], quiN[1], quiN[2], quiN[3]); //botao quinta
  }
  if(temp2sexta==5)
  {
  printButtonTpa ("SEXTA", sexT[0], sexT[1], sexT[2], sexT[3]); //botao sexta
  }
  else
  {
  printButton ("SEXTA", sexT[0], sexT[1], sexT[2], sexT[3]); //botao sexta 
  }
  if (temp2sabado==6)
  printButtonTpa ("SABADO", sabA[0], sabA[1], sabA[2], sabA[3]); //botao sabado
  else
  {
  printButton ("SABADO", sabA[0], sabA[1], sabA[2], sabA[3]); //botao sabado
  }

  printButton("SALVAR", prOK[0], prOK[1], prOK[2], prOK[3]);
  printButton("INICIO", iniC[0], iniC[1], iniC[2], iniC[3]);
  printButton("MENU", menU[0], menU[1], menU[2], menU[3]);

  setFont(LARGE, 255, 255, 255, 0, 0, 0);
   myGLCD.print("   :     ", 70, 48);  
   myGLCD.print("   :     ", 160, 48);

 if (temp2hora<10)
 {
  myGLCD.printNumI(0, 70, 48);
  myGLCD.printNumI(temp2hora, 86, 48);
 }
  else
  {
  myGLCD.printNumI(temp2hora, 70, 48);
  }

if (temp2minuto<10)
  {
    myGLCD.printNumI(0, 160, 48);
    myGLCD.printNumI(temp2minuto, 176, 48);
  }
  else
  {
  myGLCD.printNumI(temp2minuto, 160, 48);
  }
  if (temp2segundo<10)
  {
  myGLCD.printNumI(0, 250, 48);
  myGLCD.printNumI(temp2segundo, 266, 48);
  }
  else
  {
  myGLCD.printNumI(temp2segundo, 250, 48);
  }

  myGLCD.setFont(SmallFont);
  myGLCD.print("HORA:", 10, 51);
  myGLCD.print("DIAS DA SEMANA",120, 102);

  // Print current time and date
  setFont(LARGE, 255, 255, 255, 0, 0, 0);
    while (res==0)
  {
  if (myTouch.dataAvailable())
  {
  myTouch.read();
  x=myTouch.getX();
  y=myTouch.getY();

    if ((y>=houU[1]) && (y<=houU[3])) // Buttons: Time UP
    {
      if((x>=houU[0]) && (x<=houU[2]))
      {
        waitForIt(houU[0], houU[1], houU[2], houU[3]);

        temp2hora+=1;
        if (temp2hora>=24)
          temp2hora=0;
        if (temp2hora<0)
          temp2hora=23;          
        if (temp2hora<10)
        {
          myGLCD.printNumI(0, 70, 48);
          myGLCD.printNumI(temp2hora, 86, 48);
        }
        else
        {
          myGLCD.printNumI(temp2hora, 70, 48);
        }      
      }
      else if ((x>=minU[0]) && (x<=minU[2]))
      {
        waitForIt(minU[0], minU[1], minU[2], minU[3]);
        temp2minuto+=1;
        if (temp2minuto>=60)
          temp2minuto=0;
        if (temp2minuto<0)
          temp2minuto=59;
        if (temp2minuto<10)
        {
          myGLCD.printNumI(0, 160, 48);
          myGLCD.printNumI(temp2minuto, 176, 48);
        }
        else
        {
          myGLCD.printNumI(temp2minuto, 160, 48);
        }   
      }
      else if ((x>=segC[0]) && (x<=segC[2]))
      {
        waitForIt(segC[0], segC[1], segC[2], segC[3]);
        temp2segundo+=1;
        if (temp2segundo>=60)
          temp2segundo=0;
        if (temp2segundo<0)
          temp2segundo=59;
        if (temp2segundo<10)
        {
          myGLCD.printNumI(0, 250, 48);
          myGLCD.printNumI(temp2segundo, 266, 48);
        }
        else
        {
          myGLCD.printNumI(temp2segundo, 250, 48);
        }       
      }
    }
    else if ((y>=houD[1]) && (y<=houD[3])) // Buttons: Time DOWN
    {
      if ((x>=houD[0]) && (x<=houD[2]))
      {
        waitForIt(houD[0], houD[1], houD[2], houD[3]);
        temp2hora-=1;
        if (temp2hora>=24)
          temp2hora=0;
        if (temp2hora<0)
          temp2hora=23;
        if (temp2hora<10)
        {
          myGLCD.printNumI(0, 70, 48);
          myGLCD.printNumI(temp2hora, 86, 48);
        }
        else
        {
          myGLCD.printNumI(temp2hora, 70, 48);
        }            
      }
      else if ((x>=minD[0]) && (x<=minD[2]))
      {
        waitForIt(minD[0], minD[1], minD[2], minD[3]);
        temp2minuto-=1;
        if (temp2minuto>=60)
          temp2minuto=0;
        if (temp2minuto<0)
          temp2minuto=59;
        if (temp2minuto<10)
        {
          myGLCD.printNumI(0, 160, 48);
          myGLCD.printNumI(temp2minuto, 176, 48);
        }
        else
        {
          myGLCD.printNumI(temp2minuto, 160, 48);
        } 
      }
      else if ((x>=segB[0]) && (x<=segB[2]))
      {
        waitForIt(segB[0], segB[1], segB[2], segB[3]); 
        temp2segundo-=1;
        if (temp2segundo>=60)
          temp2segundo=0;
        if (temp2segundo<0)
          temp2segundo=59;
        if (temp2segundo<10)
        {
          myGLCD.printNumI(0, 250, 48);
          myGLCD.printNumI(temp2segundo, 266, 48);
        }
        else
        {
          myGLCD.printNumI(temp2segundo, 250, 48);
        }
      }
    }
  }

        if ((y>=200) && (y<=238) && (x>=325) && (x<=393))
        {
          res=1;
         waitForIt(prOK[0], prOK[1], prOK[2], prOK[3]); //funcao salvar
         hora =temp2hora;
         minuto =temp2minuto;
         segundo =temp2segundo;
         segunda =temp2segunda;
         terca =temp2terca;
         quarta =temp2quarta;
         quinta =temp2quinta;
         sexta =temp2sexta;
         sabado =temp2sabado;
         SalvartpaEEPROM();
         dispScreen=0;
         clearScreen();
         mainScreen(true);
        }
        if ((y>=2) && (y<=42) && (x>=325) && (x<=393))
        {
          res=2;  
         waitForIt(iniC[0], iniC[1], iniC[2], iniC[3]); //volta ao inicio
         dispScreen=0;
         clearScreen();
         mainScreen(true);
        }
        if ((y>=52) && (y<=92) && (x>=325) && (x<=393))
        {
        res=3;
        waitForIt(menU[0], menU[1], menU[2], menU[3]); //volta ao menu
        dispScreen=1;
        clearScreen();
        menuScreen();
        }
        if ((x>=segU[0]) && (x<=segU[2]) &&  (y>=segU[1]) && (y<=segU[3]))
        {
         if (temp2segunda==1)
        {
         printButton ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
         temp2segunda =0;
        }
        else
        {
        printButtonTpa ("SEGUNDA", segU[0], segU[1], segU[2], segU[3]); //botao segunda
        temp2segunda=1;
        }   
        }
        if ((x>=terC[0]) && (x<=terC[2]) &&  (y>=terC[1]) && (y<=terC[3]))
        {
         if (temp2terca==2)
         {
         printButton ("TERCA", terC[0], terC[1], terC[2], terC[3]); //botao terca
         temp2terca=0;
        }
        else
        {
         printButtonTpa ("TERCA", terC[0], terC[1], terC[2], terC[3]); //botao terca
         temp2terca=2;
        }
        }
        if ((x>=quaR[0]) && (x<=quaR[2]) &&  (y>=quaR[1]) && (y<=quaR[3]))
        {        
        if (temp2quarta==3)
        {     
        printButton ("QUARTA", quaR[0], quaR[1], quaR[2], quaR[3]); //botao quarta
        temp2terca=0;
        }
        else
        {
        printButtonTpa ("QUARTA", quaR[0], quaR[1], quaR[2], quaR[3]); //botao quarta
        temp2terca=3;
        }
        }
        if ((x>=quiN[0]) && (x<=quiN[2]) &&  (y>=quiN[1]) && (y<=quiN[3]))
        {

         if (temp2quinta==4)
         {     
         printButton ("QUINTA", quiN[0], quiN[1], quiN[2], quiN[3]); //botao quinta 
         temp2quinta=0;
         }
         else
         {
         printButtonTpa ("QUINTA", quiN[0], quiN[1], quiN[2], quiN[3]); //botao quinta 
         temp2quinta=4;
         }
         } 
         if ((x>=sexT[0]) && (x<=sexT[2]) &&  (y>=sexT[1]) && (y<=sexT[3]))
         {
         if (temp2sexta==5)
         {      
         printButton ("SEXTA", sexT[0], sexT[1], sexT[2], sexT[3]); //botao sexta
         temp2sexta=0;
         }
         else
         {
         printButtonTpa ("SEXTA", sexT[0], sexT[1], sexT[2], sexT[3]); //botao sexta
         temp2sexta=5;
         }
         }
         if ((x>=sabA[0]) && (x<=sabA[2]) &&  (y>=sabA[1]) && (y<=sabA[3]))
         { 
         if (temp2sabado==6)  
         {     
         printButton ("SABADO", sabA[0], sabA[1], sabA[2], sabA[3]); //botao sabado
         temp2sabado=0;
         }
         else
         {
         printButtonTpa ("SABADO", sabA[0], sabA[1], sabA[2], sabA[3]); //botao sabado
         temp2sabado=6;          
         }
         }        
    }   
}

----------


## Fernando Garcia

Penso que já é hora de adicionarem a opção inserir código como em outros fóruns com plataforma Vbulletin que participo assim, não ficamos com estes posts imensos.

----------


## Carlos Mogas da Silva

> Penso que já é hora de adicionarem a opção inserir código como em outros fóruns com plataforma Vbulletin que participo assim, não ficamos com estes posts imensos.


Podes crer  :Wink: 

Para corrigires o problema (acho eu, e assim de cabeça), a seguir à linha:
    while (res == 0) {
acrescenta:
         x = y = 0;
ou se não ser (depende dos compiladores):
         x = 0; y = 0;

----------


## Fernando Garcia

Carlos, fiz o que sugeriu e melhorou. Ao menos agora consigo salvar as opções.
Sabe me dizer o que faço para que a configuração dos dias da semana não interfira na configuração do horário?




Grato.
Fernando Garcia

----------


## Carlos Mogas da Silva

OK, fiz umas alterações para te ajudar nesse sintilar dos botões. Podes ver aqui: http://pastebin.com/kctfcYTk

Agora, não percebo a "interferencia" :/ Podes explicar o que faz e o que devia fazer? Não percebo pelo video...

----------


## Fernando Garcia

Carlos, muito obrigado!
O problema da cintilação foi totalmente resolvido.
Impressionante como poucas linhas de código eliminam muitas horas de pesquisa.
Quanto a interferência, repare aos 1:12 do vídeo quando aproximo a câmera do horário.
Quando tocado ele fica com a configuração dos botões da semana ou seja, fonte pequena e fundo azul/verde.

Abraço.
Fernando Garcia

----------


## Carlos Mogas da Silva

> Carlos, muito obrigado!
> O problema da cintilação foi totalmente resolvido.
> Impressionante como poucas linhas de código eliminam muitas horas de pesquisa.
> Quanto a interferência, repare aos 1:12 do vídeo quando aproximo a câmera do horário.
> Quando tocado ele fica com a configuração dos botões da semana ou seja, fonte pequena e fundo azul/verde.
> 
> Abraço.
> Fernando Garcia


Desde que entendas as alterações, estás a aprender  :Smile:  Se não entendeste, avisa que tento explicar.

Em relação ao problema da fonte, preciso que me mostres o código do setFont e do clearScreen sff.

EDIT: E já agora do printNumI. Ou então podes-me dizer onde arranjar o código que eu vejo de lá...

----------


## Fernando Garcia

Olá!
No post 367 deste tópico tem o link para meu código. Não posso posta-lo agora pois, estou acessando do celular.
A função "PrintButton" é a mesma para o estado 1 e 2 mudando apenas as cores.
A "ClearScreen" está próxima.
Grato.
Fernando Garcia
Ps. O código do link não tem as últimas alterações.

----------


## Carlos Mogas da Silva

> Olá!
> No post 367 deste tópico tem o link para meu código. Não posso posta-lo agora pois, estou acessando do celular.
> A função "PrintButton" é a mesma para o estado 1 e 2 mudando apenas as cores.
> A "ClearScreen" está próxima.
> Grato.
> Fernando Garcia
> Ps. O código do link não tem as últimas alterações.


Obrigado, falha minha que não fui ver se já tinhas postado o código.

Problema em principio corrigido nesta última versão: http://pastebin.com/9Gv2pm8n
Retirado o setFont antes do while e colocado dentro de cada if para cada botão da hora. (sempre que alteras a cor dum botão ele muda a cor com que está a escrever)

----------


## Fernando Garcia

Carlos, muito obrigado mais uma vez.
Aos que quiserem ver o programa completo podem consultá-lo aqui: http://pastebin.com/u/FernandoGarcia
A função tpa automática está quase completa, faltando acertar a sequência em que as bombas são ligadas.
Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
Como faço para criar um hierarquia dentro deste código para que a última instrução não anule a primeira visto que as condições iniciais são iguais as finais.
Também gostaria de saber como faço para que a tarefa não não seja interrompida quando a condição minuto não for mais atendida. Já tentei criar um intervalo mas, ocorre que se a tarefa for concluida antes que o intervalo termine ela é repetida.

void checktpa()
{
  t=rtc.getTime();
  if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min))
   {
    if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0))
    {
    digitalWrite(bomba1,HIGH);  //estagio 1
    digitalWrite(bomba2,LOW);
    digitalWrite(bomba3,LOW);    
    }
   if ((analogRead(sensor1)>400)   && (analogRead(sensor2)>400))
    {
     digitalWrite(bomba1,LOW); //estagio 2
     digitalWrite(bomba2,HIGH); 
     digitalWrite(bomba3,LOW);
    }
     if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400))
     {
      digitalWrite(bomba1,LOW); // estagio 3
      digitalWrite(bomba2,LOW);
      digitalWrite(bomba3,HIGH);
     }   
     if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0))
     {
      digitalWrite(bomba1,LOW); // estagio 0
      digitalWrite(bomba2,LOW);
      digitalWrite(bomba3,LOW);
     }
   }
 } 
A execução deste código está no loop pois, quando coloco no setup ela não é executada.
Fiz uma ilustração para ajudar a entender.



Grato.
Fernando Garcia

----------


## JoaoCAlves

Boas.

Não estou a conseguir perceber os diagramas. Qual é a posição dos sensores no aquario? E qual é a acção esperada de fase em fase?

----------


## Fernando Garcia

Olá!
João, as etapas da troca são estas:

1º O arduino aciona uma bomba que tira água da minha quarentena e envia ao esgoto;
2° O sensor de nível detecta que já retirou o volume desejado envia um INPUTao arduino para ele desligar a bomba;
3° O arduino aciona a segunda bomba que tira água do sump e envia para a quarentena;
4° O segundo sensor de nível detecta que já foi retirado o volume desejado e envia um INPUT ao arduino para que ele desligue a segunda bomba;
5° O Arduino aciona a terceira bomba que retira água de um reservatório e envia para o sump;
6 O terceiro sensor detecta que o sump esta no nível desejado e envia um INPUT para que o arduino desligue a terceira bomba.
Grato.
Fernando Garcia

----------


## JoaoCAlves

Esquema.jpg

Coloquei esquema em anexo para dar nome ás coisas.

Os nomes são estes que representei em relação ao teu esquema?

Se são, acho que devias colocar mais sensores, + 2 para ser mais especifico. Isto para o caso do reservatório ser de enchimento manual.

Deduzo que a sump, seja mt maior que a quarentena, até pq, ao tirar agua da sump, tira-se agua do circuito inteiro do aquario. Por este motivo, acho que é mais seguro colocar um sensor a sinalisar o limite de saida de àgua para o esgoto (em baixo) e outro no topo para sinalisar o limite de enchimento da quarentena ( em cima). Estes passos apenas para o tanque de quarentena.

O reservatório devia ter um sensor no fundo, isto para evitar que a bomba3 possa trabalhar em seco.

Qt ao fluxo que indicas, dependendo das quantidades de agua transferida da sump para o de quarentena, corres o risco de tirar agua a mais e deixar a bomba de retorno para o aqua a trabalhar em seco e interromper assim a circulação de agua entre a sump e o aquario. Claro que se for durante um dia, não é grave, mas se for no periodo de férias, é uma catastrofe!  :Wink: 

Apenas uma ideia!  :Wink:

----------


## Fernando Garcia

João, seu esquema está correto. Obrigado pela resposta.
Já tinha pensado em colocar um sensor para evitar que a bomba do reservatório trabalhe com ele vazio mas, acabei desistindo pois, assumi o compromisso de deixa-lo sempre cheio. Agora voltando a analisar a situação é uma ótima opção para evitar que a troca se inicie sem ter água para repor no sump.

O volume de água que vai para o esgoto é limitado pelo sensor 1 e o volume de água que entra na quarentena bem como o volume que sai do sump são limitados pelo sensor 2, se eu colocar um sensor para controlar o volume máximo da quarentena ele ficará em redundância com o sensor 2.

Tenho a pretensão de tirar cerca de 7 l por dia e em caso de viagem desativar as trocas.

Quanto ao código ainda continuo com as dúvidas supra citadas.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas.

Ok, percebo a tua ideia. 

Então, e agora que já percebi o que representas, tenta esta opção: (alterações a bold)

"
void checktpa()
{
t=rtc.getTime();
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && *t.seg<=5*)
*tpa=1;*
{
if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) *&& tpa==1*)
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
*tpa=2;*
}
if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) *&& tpa==2*)
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
*tpa=3;*
}
if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) *&& tpa==3*)
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
*tpa=4;*
}
if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) *&& tpa==4*)
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
}
} 

void loop()
checktpa();

"

Basicamente, resume-se a criar uma variavel que condicione tb a entrada nos varios estados mas não seja dependente dos switchs.

Assim, qd chega á hora, a variavel tpa é escrita a 1, fazendo com que entres no 1º if caso os switches estejam na posição que referes. Ao entrar, muda a variavel para poder ser usada no estado seguinte, e assim por diante. O ultimo estado possivel é o tpa=4, quebrando assim o loop uma vez que para voltar a entra no 1º if tem que estar em 1. A unica forma de colocar a 1 é com o if que faz match ao tempo!

Incluí os segundos no if do tempo de inicio para fazer com que a variavel só seja escrita a 1 durante 5 segundos. Senão corre-se o risco de a meio do processo ela voltar a 1.

Que te parece?

Em relação aos comandos "(analogRead(sensor2)==0)", estás a usar uma resistência pull-down (10k a 100k) nos pinos dos sensores certo? É que se não estiveres, é bem possivel que nunca obtenhas zero a ler o sensor! Mas mesmo que estejas, por segurança fazia "(analogRead(sensor2)<=100)"

Abraço

----------


## Pedro Ferrer

Boa tarde

Acho um erro usar sensores para definir a quantidade de água a retirar... o processo fica pouco flexível...
Que se tenha sensores para limitar funcionamentos de equipamentos... certo!
Mas é bem melhor usar temporizadores em qualquer recolha de água... a qualquer momento, esses 7L poderão ser 8L... e basta alterar o temporizador.

Abraço
Pedro Ferrer

----------


## Nuno Prazeres

O sistema está muitíssimo complexo. Ainda que acredite que vai resultar, sugeria fazer uma versão simplificada primeiro e só depois de algum tempo de funcionamento partir para o projeto completo.

Concordo com o que diz o Pedro mas acrescento que o melhor mesmo é fazer as duas coisas: temporizador e boias. A redundância irá proteger o sistema de uma falha de um simples componente.

----------


## Fernando Garcia

João, obrigado pela resposta.
Testei várias vezes o seu código e não sei por qual razão ele só funciona desta forma:

void checktpa()
{
t=rtc.getTime();
int tpa=0;

if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.sec<=5)
{
if ((analogRead(sensor1)<100) && (analogRead(sensor2)>400) && (analogRead(sensor3)<100))
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400))
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
}
if ((analogRead(sensor2)<100) && (analogRead(sensor1)<100) && (analogRead(sensor3)>400))
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
if ((analogRead(sensor3)<100) && (analogRead(sensor2)>400) && (analogRead(sensor1)<100) && tpa==4)
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
}
}

Se eu colocar outros valores para a variável "tpa" ele não sai do estágio 1.
Há dois problemas no código acima.
O primeiro é: quando a condição minuto não é atendida ele não muda de estágio.
O segundo é: ele só muda de estágio quando a condição do segundo for atendida ou seja se um estágio terminar quando o relógio marcar 6 segundos a bomba ficará 1 minuto a mais ligada.  
Atribuir o valor de 4 para a tpa evita que a última condição anule a primeira.

----------


## Fernando Garcia

> Boa tarde
> 
> Acho um erro usar sensores para definir a quantidade de água a retirar... o processo fica pouco flexível...
> Que se tenha sensores para limitar funcionamentos de equipamentos... certo!
> Mas é bem melhor usar temporizadores em qualquer recolha de água... a qualquer momento, esses 7L poderão ser 8L... e basta alterar o temporizador.
> 
> Abraço
> Pedro Ferrer


Pedro, obrigado pela resposta.

Acho mais arriscado ficar depende da constância da vazão da bomba pois, uma redução na tensão ou redução da seção da tubulação pode fazer com que  a tarefa seja executada de forma errada além disso, a altura da coluna d'agua acima da bomba influencia na sua bomba.
caso eu queira aumentar o volume da troca é só alterar a altura dos sensores.

----------


## Fernando Garcia

> O sistema está muitíssimo complexo. Ainda que acredite que vai resultar, sugeria fazer uma versão simplificada primeiro e só depois de algum tempo de funcionamento partir para o projeto completo.
> 
> Concordo com o que diz o Pedro mas acrescento que o melhor mesmo é fazer as duas coisas: temporizador e boias. A redundância irá proteger o sistema de uma falha de um simples componente.


Nuno, obrigado pela resposta.

Ainda tenho tempo para fazer muitos testes pois, meus aquários estão em fase de montagem e vai demorar um bocado de tempo para concluí-los.

----------


## JoaoCAlves

> João, obrigado pela resposta.
> Testei várias vezes o seu código e não sei por qual razão ele só funciona desta forma:
> 
> void checktpa()
> {
> t=rtc.getTime();
> int tpa=0;
> 
> if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.sec<=5)
> ...


Boas.

Só vejo um motivo para isso acontecer, é os if's dos sensores estarem dentro do 1º if!!

Aqui parece que não, mas se é isso, é só tirá-los fora da 1ª condição

----------


## JoaoCAlves

Pois, esquece, intrepertei mal as chavetas.

Experimenta assim!

"
void checktpa()
{
t=rtc.getTime();
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
}

if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) && tpa==1)
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=2;
}
if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) && tpa==2)
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
tpa=3;
}
if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) && tpa==3)
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) && tpa==4)
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
}

void loop()
checktpa();

"

----------


## Fernando Garcia

Olá!
Estão todas dentro do " if " referente ao dia da semana e o horário apenas.

----------


## Fernando Garcia

Assim também não funciona.
Obrigado pela ajuda.

----------


## JoaoCAlves

declaras-te a variavel "tpa" como variavel global certo?

Não tou a perceber pq não funciona...

----------


## JoaoCAlves

> O sistema está muitíssimo complexo. Ainda que acredite que vai resultar, sugeria fazer uma versão simplificada primeiro e só depois de algum tempo de funcionamento partir para o projeto completo.
> 
> Concordo com o que diz o Pedro mas acrescento que o melhor mesmo é fazer as duas coisas: temporizador e boias. A redundância irá proteger o sistema de uma falha de um simples componente.


Sim, essa é sempre a melhor abordagem. Se falha alguma coisa, o tempo pode minimizar desgraças ou até emsmo evita-las.

----------


## Fernando Garcia

está desta forma:

void checktpa()
{
t=rtc.getTime();
int tpa=0;
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
}

----------


## JoaoCAlves

Ok, não assim não dá! qd sais da função perdes o estado da variavel.

Declara a variavel no inicio do programa!  :Wink:  antes mesmo do void setup() e depois tira esse int tpa=0 dentro da função!!

----------


## Fernando Garcia

> Sim, essa é sempre a melhor abordagem. Se falha alguma coisa, o tempo pode minimizar desgraças ou até emsmo evita-las.


Uma maneira que pensei em limitar pelo tempo total da troca foi criar um intervalo desta forma:

if ((segunda==t.dow) && (hora==t.hour) && (minuto>t.min) && (minuto<t.min+15))

Mas, se a troca terminar antes a tarefa se repete.

----------


## JoaoCAlves

Pois, assim não dá.

tens que criar uma variavel para guardar os millis, e depois fazer a diferênça.

Já meto um exemplo

----------


## Fernando Garcia

> Ok, não assim não dá! qd sais da função perdes o estado da variavel.
> 
> Declara a variavel no inicio do programa!  antes mesmo do void setup() e depois tira esse int tpa=0 dentro da função!!


 :yb624: !! É um mistério, também não funciona.
Obrigado pela paciência.

----------


## JoaoCAlves

iiikkk bom na tou a perceber...

Tenat isto, mudei os if's para else if, não dando assim, estou a ficar sem ideias...

Meti o safetimer a 900000 millis, ou seja, 15 minutos. Ajustas ao que achares conveniente.

"
long duracaotpa=0;
int tpa=0;

void checktpa()
{
t=rtc.getTime();
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
duracaotpa=millis();
}

if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) && tpa==1 && ((millis() - startMillis) < 900000))
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=2;
}
else if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) && tpa==2 && ((millis() - startMillis) < 900000))
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
tpa=3;
}
else if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) && tpa==3 && ((millis() - startMillis) < 900000))
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
else if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) && tpa==4 && ((millis() - startMillis) < 900000))
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
else if ((millis() - startMillis) >= 900000)
{
digitalWrite(bomba1,LOW); //desliga as bombas todas e mete tpa=0 para não entrar no ciclo outra vez
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=0
}
}

void loop()
checktpa();

"

----------


## JoaoCAlves

Mas já agora, explica lá exactamente o que acontece!

----------


## Nuno Prazeres

> Sim, essa é sempre a melhor abordagem. Se falha alguma coisa, o tempo pode minimizar desgraças ou até emsmo evita-las.


De programação e eletrónica não mas de desgraças percebo eu bem...  :yb620:

----------


## Pedro Ferrer

Boa noite

Uma coisa que tenho aprendido é que por meias palavras no dia a dia ainda nos entendemos... agora meias palavras em programação... simplesmente não dá...

Como e onde declaraste as variáveis:
segunda
hora 
minuto

O teu RTC tem segunda-feira como dia da semana!?
Que horas tem o teu RTC!?

Pedro Ferrer

----------


## JoaoCAlves

Hummm pois, bom eu estou a assumir que essa parte está toda salvaguardada!  :Big Grin:

----------


## Fernando Garcia

Pedro, o código todo está aqui:

http://pastebin.com/2xhcEs6j

Edit: Os dias da semana eu traduzi na lib DS1307.h
O relógio está funcionando normalmente e consigo alterá-lo quando quiser pelo "Touch".

----------


## Pedro Ferrer

Boa noite

Sim e!?

Volto a questionar...
O teu RTC tem segunda-feira como dia da semana!?
Que horas tem o teu RTC!?

Que valor tem o tua var 'Segunda' ? 1?

Pedro Ferrer

----------


## Fernando Garcia

"Sim e!?

Volto a questionar...
O teu RTC tem segunda-feira como dia da semana!?"

Sim, tem.

"Que horas tem o teu RTC!?"

segunda, 13 de fevereiro de 2012  21:11

"Que valor tem o tua var 'Segunda' ? 1?"

Segunda	1
Terca	        2
Quarta	3
Quinta	4
Sexta	        5
Sabado	6
Domingo	7

----------


## JoaoCAlves

> mas já agora, explica lá exactamente o que acontece!


:d

----------


## Fernando Garcia

Quando imponho esta condição:

if (segunda==t.dow)

estou comparando se a igualdade 1=1 é verdadeira  e não se segunda=segunda.
Só para tentar esclarecer um pouco mais.

----------


## JoaoCAlves

Ok, mas qd dizes que o código não funciona, que acontece ao certo? Ele começa o ciclo? liga a bomba 1 ? Ou nem entra no ciclo? Já experimentas-te este ultimo teste que te enviei atrás?

----------


## Fernando Garcia

> :d


João, qual o valor você atribuiu para a variável startMillis?

----------


## JoaoCAlves

Desculpa, gafe!!!

tirei isso do meu código e não mudei, substitui startmillis por duracaotpa.

Deverá ficar assim:

"
unsigned long duracaotpa=0;
int tpa=0;

void checktpa()
{
t=rtc.getTime();
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
duracaotpa=millis();
}

if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) && tpa==1 && ((millis() - duracaotpa) < 900000))
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=2;
}
else if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) && tpa==2 && ((millis() - duracaotpa) < 900000))
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
tpa=3;
}
else if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) && tpa==3 && ((millis() - duracaotpa) < 900000))
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
else if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) && tpa==4 && ((millis() - duracaotpa) < 900000))
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
else if ((millis() - duracaotpa) >= 900000)
{
digitalWrite(bomba1,LOW); //desliga as bombas todas e mete tpa=0 para não entrar no ciclo outra vez
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=0
}
}

void loop()
checktpa();

"

----------


## Fernando Garcia

João e Pedro, muito obrigado pela atenção.
João, agora o código funciona perfeitamente.
Faltava os "else" mesmo.
Vou acrescentar um botão no menu da tpa para configurar a duração máxima que ela poderá ter.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Ahhhhhhhh fixe!

Ok, força nisso!  :Wink: 

abraço

----------


## Pedro Ferrer

Bom dia

Agora que isso funciona...

Não gosto de usar a função millis()... neste tipo de situações.
Bem sei que é muito prático, nomeadamente no que diz respeito à 'Hora INI' e 'Hora FIM'. 
Ainda para mais, se ambas as horas tiverem dias diferentes... 'Hora INI' dia 1, 'Hora FIM' dia 2...
Mas torna-se pouco flexível...

Da forma como isso está estruturado, mudando a 'Hora INI' ou a 'Hora FIM' não tem qualquer efeito... visto que quem manda, é o temporizador uma vez entrando no ciclo.
Mais, não está comtemplado que a variável possa rebentar aquando da TPA...

Continuo a afirmar que prefiro usar as horas decimais.

(...)

Supondo que a TPA começa às 20h... 
TPA água suja demoraria 6min e 30seg
TPA água limpa demoraria ~10min com paragem por sensor de osmoregulação
Usando o coeficiente cagaço, dever-se-ia definir uma 'Hora Máx FIM' de reposição..., pois o sensor de osmoregulação pode falhar, o sensor nível máx. pode falhar...
assim sendo, talvez as 20h20, fosse uma boa margem de finalização do procedimento...

Não sei se disse algo de novo, mas fica a dica. 

Abraço
Pedro Ferrer

----------


## JoaoCAlves

Boas Pedro.

Para mim esta é a melhor forma de fazer delays e pequenos temporizadores.
Sim, a função millis é um unsigned long. Qd chega ao fim volta a zero. Podes ter o galo de isso acontecer de facto, mas é mt pouco provavel.

Mas se quiseres é facil precaver isso. Basta fazeres algo do género:

if ((pow(2, 32) - timer) < millis())
duracaotpa= millis() - (timer*2);
else
duracaotpa= millis();

if ((pow(2, 32) - timer) < millis())
shiftedmillis= millis() - (timer*2);
else
shiftedmillis= millis();

Aplicas isto da seguinte forma:

unsigned long duracaotpa=0;
unsigned long timer=0;
unsigned long shiftedmillis=0;
int tpa=0;

void checktpa()
{
t=rtc.getTime();
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
if ((pow(2, 32) - timer) < millis())
duracaotpa= millis() - (timer*2);
else
duracaotpa= millis();
}

if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) && tpa==1 && ((shiftedmillis - duracaotpa) < timer))
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=2;
}
else if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) && tpa==2 && ((shiftedmillis - duracaotpa) < timer))
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
tpa=3;
}
else if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) && tpa==3 && ((shiftedmillis - duracaotpa) < timer))
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
else if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) && tpa==4 && ((shiftedmillis - duracaotpa) < timer))
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
else if ((shiftedmillis - duracaotpa) >= timer)
{
digitalWrite(bomba1,LOW); //desliga as bombas todas e mete tpa=0 para não entrar no ciclo outra vez
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=0
}
}

void loop()

if ((pow(2, 32) - timer) < millis())
shiftedmillis= millis() - (timer*2);
else
shiftedmillis= millis();

checktpa();

"

Claro que se tb quiseres indexar ao rtc, podes faze-lo!  :Big Grin:

----------


## Pedro Ferrer

Bom dia

João... 19 (eu li 19!? ) minutos não é um pequeno temporizador... eh eh

Abraço
Pedro Ferrer

----------


## Pedro Ferrer

Boa tarde

Outro dado a ter em conta, é que deverá existir a função 'Manutenção'.
Não nos podemos esquecer que a TPA, poderá e deverá sem alguns momentos realizada de forma manual...
Assim, neste modo, alguns dos sensores, em alguns momentos, não seriam tidos em conta.

Abraço
Pedro Ferrer

----------


## Fernando Garcia

Bom dia!
Pedro, acho que seria muita sorte ou falta dela o "millis" estourar durante uma tpa.
Pelo que li o "millis" demora cerca de 50 dias para estourar ou seja, 50*24*3600*1000 = 4 320 000 000 ms.

João, onde conseguiu encontrar este valor de 2^32 como limite para o "millis"?

Como o arduino conseguirá fazer esse cálculo diante do exposto abaixo?

" Know that integer constants default to int, so some constant calculations may overflow (e.g. 60 * 1000 will yield a negative result).
Choose variable sizes that are large enough to hold the largest results from your calculations
Know at what point your variable will "roll over" and also what happens in the other direction e.g. (0 - 1) OR (0 - - 32768)"


Obrigado pela ajuda, vou considerar todas as sugestões.
Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Boa tarde

Há erros...
E a há sorte...

Tudo conjugado é a receita ideal para um desastre...

Abraço
Pedro Ferrer

----------


## Fernando Garcia

> Boa tarde
> 
> Outro dado a ter em conta, é que deverá existir a função 'Manutenção'.
> Não nos podemos esquecer que a TPA, poderá e deverá sem alguns momentos realizada de forma manual...
> Assim, neste modo, alguns dos sensores, em alguns momentos, não seriam tidos em conta.
> 
> Abraço
> Pedro Ferrer


Pedro, penso que na ocasião de se fazer uma troca com maior volume esta deverá ser feita de forma manual para aproveitar e sifonar o fundo do sump ou o substrato do aquário.

Por hora o meu menu está assim:

----------


## Fernando Garcia

João, esquece o que eu falei sobre o limite da variável achei estas informações:

"Tipos de Variáveis

"boolean" - Sendo Verdadeiro(true) ou Falso(false). Existe também Alto(HIGH) e Baixo(LOW).
"int" - Sendo os números inteiros(de -32768 a 32767).
"unsigned int" - Sendo os números inteiros positivos(de 0 a 65535).
"long" - Sendo os números inteiros(de -2147483648 a 2147483647).
"unsigned long" - Sendo os números inteiros positivos(de 0 a 4294967295).
"float" - Sendo os números inteiros com decimais(-3.4028235*(10 elevado a +38) a 3.4028235*(10 elevado a +38)).
"char" - Sendo um caractere - Obs: Existe o "string" que é um conjunto de caracteres.
No site mostra INPUT(Entrada) e OUTPUT(Saída) como tipos de variáveis, mas seria mais como definição dos pinos, isto é, os pinos podem ser definidos como entradas e/ou saídas."

http://arduino-projetos.blogspot.com...1_archive.html

----------


## Pedro Ferrer

Fernando, acho que não entendeste a minha questão…
Ao fazeres a TPA manual, a bóia de nível máx. vai ser actuada… caso tenhas osmoregulação… vais ter água doce a entrar no aquário… dai estar a chamar-te à atenção de que deverias ter o modo ‘Manutenção’…

Abraço
Pedro Ferrer

----------


## Fernando Garcia

> Fernando, acho que não entendeste a minha questão…
> Ao fazeres a TPA manual, a bóia de nível máx. vai ser actuada… caso tenhas osmoregulação… vais ter água doce a entrar no aquário… dai estar a chamar-te à atenção de que deverias ter o modo ‘Manutenção’…
> 
> Abraço
> Pedro Ferrer


Pedro, eu já tinha pensado neste problema.
A minha idéia é colocar uma solenóide que ficará fechada durante a troca para evitar a reposição de água doce (osmoregulação como vocês chamam) durante as trocas. Além disso, tenho um registro abaixo do reservatório que a qualquer momento poderá ser fechado.
Quanto ao timer o que você acha de zerá-los cada vez que a troca muda de estágio?

João, qual valor será atribuido para a variável "timer" neste caso.

if ((pow(2, 32) - timer) < millis())
duracaotpa= millis() - (timer*2);

Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Boa tarde

A variável será uma 'unsigned long, visto que irá receber o valor millis() anterior...

Abraço
Pedro Ferrer

----------


## JoaoCAlves

> Bom dia!
> Pedro, acho que seria muita sorte ou falta dela o "millis" estourar durante uma tpa.
> Pelo que li o "millis" demora cerca de 50 dias para estourar ou seja, 50*24*3600*1000 = 4 320 000 000 ms.
> 
> João, onde conseguiu encontrar este valor de 2^32 como limite para o "millis"?
> 
> Como o arduino conseguirá fazer esse cálculo diante do exposto abaixo?
> 
> " Know that integer constants default to int, so some constant calculations may overflow (e.g. 60 * 1000 will yield a negative result).
> ...


Boas Fernando.

2^32 representa o numero máximo atingivel com uma variavel do tipo long (4bytes). 

4 bytes * 8 = 32bits

2^32bits = 4.294.967.296

ou seja 4.294.967.296 millis. Isto claro, usando "unsigned long". Se for só "long", o 1º bit, o de maior peso, fica o bit de sinal (+ ou -). Nesta situação restam 31bits para valor propriamente dito ficando:

2^31 = 2.147.483.648

ou seja, podes guardar até +/- 2.147.483.648 com uma variavel do tipo long.

A ideia deste calculo,

if ((pow(2, 32) - timer) < millis())

é verificar se a variavel "timer" cabe dentro dos restantes valores possiveis dos millis sem que haja overflow.

depois se o resultado da condição for verdadeiro é aplicado o offset.

A escolha dos nomes das variaveis não foi mt feliz, faz confusão.

Corrigindo:


unsigned long marcadoriniciotpa=0;
unsigned long duracaomaximatpa=0;
unsigned long shiftedmillis=0;
int tpa=0;

void checktpa()
{
t=rtc.getTime();
if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
if ((pow(2, 32) - duracaomaximatpa) < millis())
marcadoriniciotpa= millis() - (duracaomaximatpa*2);
else
marcadoriniciotpa= millis();
}

if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) && tpa==1 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=2;
}
else if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) && tpa==2 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
tpa=3;
}
else if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) && tpa==3 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
else if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) && tpa==4 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
else if ((shiftedmillis - marcadoriniciotpa) >= duracaomaximatpa)
{
digitalWrite(bomba1,LOW); //desliga as bombas todas e mete tpa=0 para não entrar no ciclo outra vez
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=0
}
}

void loop()

if ((pow(2, 32) - duracaomaximatpa) < millis())
shiftedmillis= millis() - (duracaomaximatpa*2);
else
shiftedmillis= millis();

checktpa();



A variavel "duracaomaximatpa" define o tempo máximo admitido, e esta é a variavel onde introduzes o valor que pretendes. Se for 15 minutos, metes 900000.

A variavel "marcadoriniciotpa" define o inicio e é a variavel que é comparada com os millis que estão a decorrer (shiftedmillis). Consoante o valor inicial dos millis, esta variavel vai ser aplicada com offset ou não.

A variavel "shiftedmillis" são os millis actuais com ou sem offset, mais uma vez, dependendo do valor inicial da função millis().

ok?

Qt à tua outra pergunta, não tem problema, porque já estás a trabalhar com variaveis "unsigned long".

Mas se por ventura der raia, podes forçar o valor pow(2,32) com sendo unsigned long da sehuinte forma:

if (((pow(2, 32)ul) - duracaomaximatpa) < millis())

O "ul" indica ao compilador que é um valor para ser guardado numa variavel unsigned long.

Abraço

----------


## Fernando Garcia

Boa tarde!

João, agora acho que entendi intuito deste código.

Bom, fiz vários teste eos resultados foram:
1° Se colocar o colocar a variável "shiftedmillis" no loop o código não é executado.
2° Se colocar dentro do "void checktpa" abaixo das condições de dia da semana o código é executado mas, o tempo de execução nunca expira. Ocorre algo deste tipo,  "shiftedmillis" assume um valor igua a 2 e "marcadoriniciotpa" assume um valor igual a 1 logo, essa condição  ((shiftedmillis - marcadoriniciotpa) >= duracaomaximatpa) nunca é atendida.
Vou continuar tentando encontrar uma forma do código ser executado da forma correta.
Obrigado à todos.
Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas.

Estavam erros no código, ainda estava a chamar a suposta variavel timer.

Copia tudo novamente e vê o resultado.

Abraço

----------


## Fernando Garcia

Olá!
João, nos testes que fiz eu tinha trocado a variável "timer" pela "duracaomaximatpa."

Abraço.
Fernando Garcia

----------


## JoaoCAlves

humm, ok.

Só testando mesmo, não vejo razão para te dar esses valores.

Declaras-te as variaveis todas? fora da função?

que valor colocas-te na variavel duracaomaximatpa?

----------


## JoaoCAlves

Boas.

Já percebi o que está a acontecer.

A função pow(2,32) está a fazer overflow. o resultado desta função é 4.294.967.296. Mas a variavel aguenta no mmáximo 4.294.967.295.

Experimenta substituir as formulas por isto:

if (((pow(2, 32)-1) - duracaomaximatpa) < millis())

Se mesmo assim não der, o que é possivel de acontecer pq para fazer a subtração por 1, ele tem que guardar o resulta da função 1º, faz:

if ((4294967295ul - duracaomaximatpa) < millis())


Isto deverá resolver o problema.

----------


## Fernando Garcia

Bom dia!
João, sua última dica também não resolve.  :Icon Cry: 

Obrigado.

----------


## JoaoCAlves

Fernando, fixa o valor da variavel duracaomaximatpa no inicio do programa, não faças por menu agora.

----------


## Fernando Garcia

Olá!

João, obrigado pela ajuda.

Aqui está o código http://pastebin.com/EjG6M5De da forma como o arduino está executando.

Aqui estão as informações impressas na porta serial.

14:07:53
Sensor 1:
0
Sensor 2:
991
Sensor 3:
0
marcadoriniciotpa:
0
shiftedmillis:
60016
duracaomaximatpa:
60000
Bomba1: desligada
Bomba2: desligada
Bomba3: desligada

10 segundos depois.

Dia da semana
Quarta
Horario
14:08:03
Sensor 1:
0
Sensor 2:
992
Sensor 3:
0
marcadoriniciotpa:
70022
shiftedmillis:
70020
duracaomaximatpa:
60000
Bomba1: desligada
Bomba2: desligada
Bomba3: desligada

3 minutos depois.

Dia da semana
Quarta
Horario
14:11:13
Sensor 1:
0
Sensor 2:
997
Sensor 3:
0
marcadoriniciotpa:
72850
shiftedmillis:
260091
duracaomaximatpa:
60000
Bomba1: desligada
Bomba2: desligada
Bomba3: desligada

----------


## Fernando Garcia

Agora se colocar a variável "shiftedmillis" dentro do void().

Dia da semana
Quarta
Horario
14:21:59
Sensor 1:
0
Sensor 2:
988
Sensor 3:
0
marcadoriniciotpa:
0
shiftedmillis:
0
duracaomaximatpa:
60000
Bomba1: desligada
Bomba2: desligada
Bomba3: desligada

10 segundos depois

Dia da semana
Quarta
Horario
14:22:09
Sensor 1:
0
Sensor 2:
989
Sensor 3:
0
marcadoriniciotpa:
86820
shiftedmillis:
86820
duracaomaximatpa:
60000
Bomba1: ligada
Bomba2: desligada
Bomba3: desligada

3 minutos depois

Dia da semana
Quarta
Horario
14:25:09
Sensor 1:
0
Sensor 2:
990
Sensor 3:
0
marcadoriniciotpa:
86820
shiftedmillis:
86820
duracaomaximatpa:
60000
Bomba1: ligada
Bomba2: desligada
Bomba3: desligada

----------


## JoaoCAlves

OK parece-me tudo normal, o problema parece ser o tempo definido. Colocas-te 60000, isto são 60s, 1 minuto. Poe um valor mais alto, poe mesmo os 900000 para testar, isto dá 15 minutos.

Outra coisa que vi, o valor the shiftedmillis é inferior ao inicio.

Iverte isto:


void loop()

if ((pow(2, 32) - duracaomaximatpa) < millis())
shiftedmillis= millis() - (duracaomaximatpa*2);
else
shiftedmillis= millis();

checktpa();

ou seja, poe assim:


void loop()


checktpa();

if ((pow(2, 32) - duracaomaximatpa) < millis())
shiftedmillis= millis() - (duracaomaximatpa*2);
else
shiftedmillis= millis();

----------


## JoaoCAlves

Se mesmo assim não der, tenta isto:

unsigned long marcadoriniciotpa=0;
unsigned long duracaomaximatpa=0;
unsigned long shiftedmillis=0;
int tpa=0;

void checktpa()
{
t=rtc.getTime();

if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && t.seg<=5)
{
tpa=1;
if ((4294967295ul - duracaomaximatpa) < millis())
marcadoriniciotpa= millis() - (duracaomaximatpa*2);
else
marcadoriniciotpa= millis();
}

if ((4294967295ul - duracaomaximatpa) < millis())
shiftedmillis= millis() - (duracaomaximatpa*2);
else
shiftedmillis= millis();

if ((analogRead(sensor1)==0) && (analogRead(sensor2)>400) && (analogRead(sensor3)==0) && tpa==1 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,HIGH); //estagio 1
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=2;
}
else if ((analogRead(sensor1)>400) && (analogRead(sensor2)>400) && tpa==2 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,LOW); //estagio 2
digitalWrite(bomba2,HIGH);
digitalWrite(bomba3,LOW);
tpa=3;
}
else if ((analogRead(sensor2)==0) && (analogRead(sensor1)==0) && (analogRead(sensor3)>400) && tpa==3 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,LOW); // estagio 3
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,HIGH);
tpa=4;
}
else if ((analogRead(sensor3)==0) && (analogRead(sensor2)>400) && (analogRead(sensor1)==0) && tpa==4 && ((shiftedmillis - marcadoriniciotpa) < duracaomaximatpa))
{
digitalWrite(bomba1,LOW); // estagio 0
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
}
else if ((shiftedmillis - marcadoriniciotpa) >= duracaomaximatpa)
{
digitalWrite(bomba1,LOW); //desliga as bombas todas e mete tpa=0 para não entrar no ciclo outra vez
digitalWrite(bomba2,LOW);
digitalWrite(bomba3,LOW);
tpa=0
}
}

void loop()



checktpa();

----------


## Fernando Garcia

Boa tarde!

João, colocando a variável "shiftedmillis" no loop realmente não funciona.
Modifiquei o código conforme a sua última sugestão e funciona perfeitamente.
Todas as vezes que tentei tirar a variável do loop colquei desta forma:

if ((segunda==t.dow) && (hora==t.hour) && (minuto==t.min) && (t.sec<=5))
{
tpa=1;

if ((4294967295ul - duracaomaximatpa) < millis())
{
marcadoriniciotpa= millis() - (duracaomaximatpa*2);
}
else
{
marcadoriniciotpa= millis();
}

if ((4294967295ul - duracaomaximatpa) < millis())
{
shiftedmillis= millis() - (duracaomaximatpa*2);
}
else
{
shiftedmillis= millis();
}
}

Por isso nunca funcionava.

Agradeço pela ajuda de todos.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Ok, está explicado então.

o que estava a contecer é que neste passo:

(*(shiftedmillis - marcadoriniciotpa*) < duracaomaximatpa)

a subtração a bold dava valor negativo e rebentava. O valor de shiftedmillis era calculado 1º, e por isso tinha um valor mais baixo.

Desta forma, garantiu-se que é sempre calculado depois da variavel marcadoriniciotpa.

Abraço e boa continuação!  :Wink:

----------


## Fernando Garcia

Olá pessoal!

Minha próxima tarefa é plotar um gráfico da variação de temperatura do dia em que ele está sendo consultado nesta tela.



Para isto estou usando a biblioteca tinyFat.h,  esta biblioteca possui apenas as opções de ler e escrever variáveis do tipo CHAR e para armazenar as leituras de temperatura converti a variável do tipo FLOAT para uma do tipo CHAR com esta função:

char buf[25];
String floatparastring1;
floatparastring1 = dtostrf(tempC,2,1,buf);  //converte float para char 

em seguida gravei os dados no cartão SD com esta função:

  if (file.exists("LOGTDIA.TXT"))
  {
    file.openFile("LOGTDIA.TXT", FILEMODE_TEXT_WRITE);
    file.writeLn(dtostrf(tempC,2,1,buf));
    file.closeFile();   
  }

O programa criou um TXT e gravou as leituras de temperatura a cada minuto desta forma.

27.6
27.6
27.6
27.6
27.7
27.7
27.7

No processo de leitura dos dados para desenhar o gráfico tenho que transformar as leituras de temperatura em uma variável do tipo FLOAT novamente e para isto usei esta função:

float temperatura; 
char textbuf[81];

  file.openFile("LOGTDIA.TXT", FILEMODE_TEXT_READ);
  file.readLn(textbuf, 80);

  temperatura =atof(textbuf);

Com isto consegui obter apenas o primeiro valor escrito no TXT convertido para FLOAT.

Para fazer o desenho  preciso de vários pares ordenados por isso, terei que separar a cadeia de caracteres em grupos de 4 bytes.

Agora minha dúvida é qual a melhor função para criar essas cadeias menores à partir de uma única cadeia?
Há uma maneiras mais simples de chegar ao objetivo final que é desenhar uma gráfico com a função (myGLCD.drawPixel(x,y) :Wink: ?

Desculpem-me se escrevi alguma besteira.


Grato.
Fernando Garcia

----------


## JoaoCAlves

Nunca mexi com nada disto, mas parece-me que a chave para conseguires ler a tabela de dados, é encontrares o caracter "return".

Se conseguires ler este caracter, consegues sempre separar os valores.

----------


## Pedro Ferrer

Boa noite




> Nunca mexi com nada disto, mas parece-me que a chave para conseguires ler a tabela de dados, é encontrares o caracter "return".


Ou seja, o caracter '\r'

while (inchar != '\r')
{
      index++;
}

Abraço
Pedro Ferrer

----------


## Fernando Garcia

Bom dia!

Uma das soluções é usar algo parecido com isto:

#include <iostream>
#include <string>
using namespace std;

const int arr_size_max = 1000;

int main(void)
{
    char str [] = "Ola,reefforum";
    char* tokchar;

    int i = 0;

     string output[arr_size_max];

     tokchar = strtok(str, ",");

     while(tokchar)
     {
                   output[i] = tokchar;
                   tokchar = strtok(NULL, ",");

                   i++;
     }
      int arr_element;
      cout << "Qual parte voce quer?\n";
      cin >> arr_element;
      cout << "\n\n" << output[arr_element];

      cin.sync();
      cin.get();
      return 0;
}

----------


## Fernando Garcia

Olá!
Alguém sabe me informar onde consigo a biblioteca "String.h" para download?

Grato.
Fernando Garcia

----------


## António Vitor

http://www.arduino.cc/cgi-bin/yabb2/...num=1140449122



> OK hold your horses 
> 
> usually string manipulation is a bad habit inherited by languages with lots of memory to waste...      
> 
> all the string functions from c are available... 
> The LCD code is here http://arduino.berlios.de/index.php/Tutorial/LCD8Bits
> it's very simple to do a function that takes a string and loops calling LcdDataWrite() for each character (you'll end up with an equivalent of printString() for the LCD)

----------


## Pedro Ferrer

Boa tarde Fernando

Penso que já a tenhas... em C:\arduino\arduinoIDE\hardware\tools\avr\avr\inclu  de

Abraço
Pedro Ferrer

----------


## Fernando Garcia

> http://www.arduino.cc/cgi-bin/yabb2/...num=1140449122



Antônio, muito obrigado pela resposta.
Já estou sofrendo com o problema de falta de memória. É só enviar um char[1000] que o arduino trava.
Estou procurando meios para não ter que trabalhar com caracteres mas, as bibliotecas do cartão sd não ajudam muito.


Abraço.

----------


## Fernando Garcia

> Boa tarde Fernando
> 
> Penso que já a tenhas... em C:\arduino\arduinoIDE\hardware\tools\avr\avr\inclu  de
> 
> Abraço
> Pedro Ferrer


Pedro, obrigado.
Não sabia que a biblioteca já era nativa da IDE.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
Alguma sugestão para que eu consiga aplicar a conversão de char para float em cada saida de output[i] e que eles para pela condições"if" ?
Vou colocar o código pra dar uma idéia melhor do quero fazer.
Ele não compila por causa dos erros de conversão causados pelos [j], [k] e [l].


void tempgScreen()
  int x, y, z;
  t = rtc.getTime();
  int h;
  float temperatura; 
  int grafico;
  char textbuf[1441];

  file.openFile("LOGTDIA2.TXT", FILEMODE_TEXT_READ);
  file.readLn(textbuf, (1440));

  char*tokchar;
  int i=0;
  String output[1441];
  tokchar =strtok(textbuf,"\n");

  while (tokchar)
  {
    output[i] = tokchar;
    tokchar = strtok(NULL, "\n");
    i++;
  }

for (int j=0; j<=(strlen(tokchar)/4); j++)
{
for(int k=0; k<=(strlen(tokchar)/4); k++)
{
for(int L=0; L<=(strlen(tokchar)/4); L+=6)
{
  temperatura [j] =atof(output[L]); // aplicar esta função para todas as temperaturas armazenadas no txt.

  if (temperatura[j] < 22.5)
  {
  grafico [j] = 190;
  }
  else if (temperatura[j] >27.5)
  {
  grafico[j] =30;
  }
  else
  {
  grafico[j]  = (190-((temperatura[j]-22.5)*30));
  }


  setFont(SMALL, 255, 255, 255, 0, 0, 0);
  myGLCD.drawPixel((40+k),grafico[j]);
}
}
}
}

Grato.
Fernando Garcia

----------


## Baltasar Parreira

Penso que tenhas de fazer um "cast" ou seja na var que é char meteres assim para transformar em float:

float NewVar = float(OldCharVar);


No entanto tenho duvidas se o "cast" aceita passar de texto para numérico, mas testa.
Existe outro comando para conversão mas tens de procurar info sobre ele pois já não me lembro se era também para isso, refiro-me ao ATOI().

----------


## António Vitor

por acaso também tive esse problema mas como nao pego no meu controlador há muitissimo tempo, não me lembro, mas envolve o ATOI, acho... não tenho simplesmente pachorra...e como funciona...
Estive para implementar coisas como nuvens, e relampagos, mas só se for nas férias, e se as férias forem em casa, por a mulher estar a trabalhar...mas com o puto mais novo e a minha filha mais velha, acho que é mesmo para esquecer, fica assim em stand bye...

hehe

----------


## Fernando Garcia

Olá!

A função correta a ser utilizada na conversão é a atof (array to float) a atoi (array to integer) não serve pois, a variável (temperatura) que quero gravar é do tipo float.

O problema destas funções é que elas convertem apenas o primeiro valor do TXT.

Abraço.
Fernando Garcia

----------


## António Vitor

Fui dar uma vista de olhos no meu código...arghh....
 :Big Grin: 




> if (key==4&maxi==1){
>     redVal =255;
>     blueVal=255;
>     volume=(4*((255-redVal)/(10)));
> itoa(volume, volumen, 10);
> 
> if (volume<10){
>     lcd.commandWrite(0x80+12);  //line=2, x=0
> lcd.printIn("0");
> ...


este é o contrário do que to queres...
mas itoa é integer to ascii
i-integer 
to 
a-ascii

procura saber mais sobre estes comandos:
SEE:

ASCII to INTEGER  ATOI()  INTEGER to ASCII ITOA()  ASCII to FLOAT  ATOF() 
ATOF é capaz de servir não sei. nunca usei...

----------


## António Vitor

> Olá!
> 
> A função correta a ser utilizada na conversão é a atof (array to float) a atoi (array to integer) não serve pois, a variável (temperatura) que quero gravar é do tipo float.
> 
> O problema destas funções é que elas convertem apenas o primeiro valor do TXT.
> 
> Abraço.
> Fernando Garcia


tava a te responder demorei mais um bocado, e fostes lá ter...

----------


## António Vitor

http://dereenigne.org/electronics/ar...loat-to-string

acho que isto responde...andei à procura do sprintf e deve lá uma solução pró teu caso...não sei...
 :Wink: 

dtostrf...

agora tu é que tens de te desenrascar...
mais info aqui:
http://forum.jeelabs.net/node/677

----------


## António Vitor

http://www.confusion.com.mx/2012/01/...denas-arduino/
em espanhol

----------


## António Vitor

Gostaria de te ajudar mais, mas... eu nem consigo compilar o meu código na ultima versão do arduino...sei lá porquê...
bem...if it ain't broken don't try to fix it...
CAGUEI...
 :Big Grin: 

é muito giro programar no arduino e que tal, mas as horas que passei à procura de bugs deixaram-me com fobia danada...
dá-me até arrepios em voltar a programar aquilo...

----------


## Fernando Garcia

> Gostaria de te ajudar mais, mas... eu nem consigo compilar o meu código na ultima versão do arduino...sei lá porquê...
> bem...if it ain't broken don't try to fix it...
> CAGUEI...
> 
> 
> é muito giro programar no arduino e que tal, mas as horas que passei à procura de bugs deixaram-me com fobia danada...
> dá-me até arrepios em voltar a programar aquilo...


Olá!
Obrigado pelas respostas.

Provávelmente o problema esta relacionado com a incompatibilidade de bibliotecas.
Experimente escrever um código bem simples e para a biblioteca que chamares vá ao arquivo .cpp troque #include <WProgram.h> por #include <Arduino.h>.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá pessoal!

Já consegui desenhar o gráfico de temperatura, tive que mudar para a biblioteca sdfat para poder fugir das grandes strings.
Aqui está o código que faz o desenho:

  int x, y, z, grafico;
  int16_t n;
  char buf[7];
  float temperatura;
  int j=0;
  file.open(&root, "LOGTDIA.TXT", O_READ);
  while ((n = file.read(buf, sizeof(buf))) > 0)
 {
if (strlen(buf)==9)
{
 j++;
}
 temperatura = atof(buf);

 if ((temperatura) < 22.5)
 {
 grafico = 190;
 }
 else if ((temperatura) >27.5)
 {
 grafico =30;
 }
 else
 {
 grafico = (190-((temperatura-22.5)*30));
 } 
 setFont(SMALL, 255, 0, 255, 0, 0, 0);
 myGLCD.drawPixel((39+j),grafico);
}
 file.close();
}



Agora estou precisando de sugestões para criar a condição para que o programa grave a temperatura apena uma vez a cada 6 minutos.
Se eu impor esta condição

if ((t.min==0) || (t.min==6) || (t.min==12) || (t.min==18) || (t.min==24) || (t.min==30) || (t.min==36) || (t.min==42) || (t.min==48) || (t.min==54)  && (t.sec==0)

o programa grava várias vezes a temperatura pois, ele verifica as condições muitas vezes durante 1 segundo.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
Eu estava preocupado no sincronismo para que os valores fossem gravados nos seguintes horários às 00:00, 00:06, 00:12, 00:18 e assim por diante.
Mas, pensando bem não faz diferença alguma  que o gráfico tenha seu primeiro valor às 00:03 por exemplo.
Então vou usar a função millis() mesmo.
Logo posto o código inteiro atualizado.
Abraço.
Fernando Garcia

----------


## Fernando Garcia

Código atualizado:

http://pastebin.com/u/FernandoGarcia

EDIT: Aos interessados em montar o controlador podem obter a lista de "hardwares" necessários aqui:
http://www.reefcorner.org/forum/topi...83&whichpage=2

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
O gráfico anterior foi criado com dados manipulados por mim por isso, resolvi postar um novo gráfico que condiz com a realidade.
Ajustei o relógio do arduino para que eu estivesse em casa quando o gráfico estivesse perto de ser concluído pois, pouco antes das 00:00 ele é deletado para dar início a um novo gráfico.

Os dados são referentes a temperatura ambiente da minha casa em dois dias frios em São Paulo das 16:50 de ontem as 16:30 de hoje.
Os dados são gravados a cada 6 minutos.



Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá pessoal!

Gostaria de saber se alguém aqui utiliza sensores de nível comprados no ebay e se recomendam algum vendedor deste produto.
Tenho aqui 2 sensores de nível de um fabricante brasileiro mas, custa R$ 38,00 e no ebay podemos encontrar por cerca de R$ 3,60 ($2,00).

Aproveitando quero deixar aqui a indicação de um produto que descobri hoje pelo google.


Trata-se de um suporte e sensor de nivel fabricados pela Digital Aquatics.
O kit custa $25,00.

http://www.store.digitalaquatics.com...hp?pid157.html
http://www.ebay.com/itm/Digital-Aqua...item2a1afbdb0b





Pode-se adicionar um segundo sensor.



Abraço.
Fernando Garcia

----------


## Baltasar Parreira

Olá, uso dessas bóias/sensores a muitos anos sem qualquer problema, são 100% eficazes e fáceis de usar/instalar.

Se quiseres mais sofisticado procura pois até vais encontrar as ópticas tal como a Tunze usa no osmolator deles.

----------


## Fernando Garcia

> Olá, uso dessas bóias/sensores a muitos anos sem qualquer problema, são 100% eficazes e fáceis de usar/instalar.
> 
> Se quiseres mais sofisticado procura pois até vais encontrar as ópticas tal como a Tunze usa no osmolator deles.


Baltasar, obrigado pela resposta.

Lembra de quem comprou da última vez?

----------


## Baltasar Parreira

> Baltasar, obrigado pela resposta.
> 
> Lembra de quem comprou da última vez?



Ninguém em especifico, são todos iguais é mesmo uma questão de no momento ver quem está a vender com melhores condições de entrega em termos de rapidez e melhor preço.

Os ópticos será isto por exemplo (não encontro igual ao da Tunze mesmo agora): http://www.ebay.co.uk/itm/Optical-in...item3f15285e3c

----------


## Fernando Garcia

Obrigado Baltasar.

----------


## Pedro Ferrer

Boa noite

Igual ao da Tunze, eu tenho este:
http://www.sensortechnics.com/en/pro...switches-/olp/

Acontece que como hoje ninguém faz stocks, o que no tempo em que o comprei era vendido à unidade, hoje tem como MOQ (Minimum Order Quantity) a quantia de 5 unidades...

Aqui fica o relato do seu funcionamento.
http://www.reefforum.net/showthread....l=1#post142662

Abraço
Pedro Ferrer

----------


## Fernando Garcia

> Boa noite
> 
> Igual ao da Tunze, eu tenho este:
> http://www.sensortechnics.com/en/pro...switches-/olp/
> 
> Acontece que como hoje ninguém faz stocks, o que no tempo em que o comprei era vendido à unidade, hoje tem como MOQ (Minimum Order Quantity) a quantia de 5 unidades...
> 
> Aqui fica o relato do seu funcionamento.
> http://www.reefforum.net/showthread....l=1#post142662
> ...


Obrigado Pedro.

----------


## Fernando Garcia

> Ui, muitas!!
> 
> - Medidor salinidade (necessário desenvolver hardware),
> 
> - medidor/controlador ORP, PH (necessário desenvolver hardware),
> 
> - Controlador das bombas / wavemaker. (código já feito, circuito planeado, falta montar e testar). Nesta fase vai ser feito para bombas 24Vdc. (Resun 15000 e oceanprop 15000 e penso que as tunze entram neste bolo tb). Depois quero controlar bombas 220V tb.
> Com isto quero tentar implementar marés.
> 
> ...


Olá!

João, em que ponto está o seu projeto de wavemaker?

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas Fernando.

Está novamente a andar.

Já optimizei a um bom nivel o programa, terminei antes de ontém. Agora Já consigo andar no programa sem estar 2 minutos a fazer scroll!  :Big Grin: 

Tava mt código repetido.

Já criei tb as funções de recovery caso algo corra mal e perca a calibraçao do touch, mas ainda tou a afinar pormenores.

O código do wavemaker está feito no seu essencial, é só juntar ao código do controlador. Nesta fase tenho os menus novos desenhados em papel, prontos para receber o wavemaker e todas as outras features. É só implementar no código tb. 

É ainda prioritario a inclusão dos ajustes do pwm máximo e minimo nos menus, para de uma vez por todas ajustar a luz da calha.

A moonlight, vai ser instalada na próxima vez que desmontar a calha para limpar, já tenho os led's para isso.

O Hardware do wavemaker vai ser testado em breve, antes ainda quero terminar o novo driver para led's que me vai fazer mt falta.

Basicamente, está a andar, mas não tenho tido mt disponibilidade para tudo, vai aos poucos...  :Wink: 

Depois vai ser o PH, a electrónica está a chegar, depois é testar. O PH vai ser todo calibrado via arduino.

Continuo a dar pouca prioridade à reposição, mas tb vai ter que andar. Já tive 2 acidentes pq não tenho isto automatizado e esqueço-me da agua ligada.

O controlo da temperatura é tb prioritário, o meu ATC800 permite grandes variações de temperatura, o que não é nada bom.

Enfim, vai andando!  :Wink:

----------


## Fernando Garcia

Olá!
Irá usar mesmo as bombas de 24v DC?

Quantos litros tem seu tanque?

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Sim, vou.

Tem cerca de 500ltrs reais.

----------


## Fernando Garcia

> Sim, vou.
> 
> Tem cerca de 500ltrs reais.


Quase o mesmo volume do meu.
Estive a olhar o código que postou no outro tópico.
Pelo que percebi estás a trabalhar com PWM randômico, vai continuar nesta linha ou vai fazer algo mais customizável?
Irá usar 3 bombas de 15000 l/h?

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Esse modo vai ser uma opção, mas vou criar outros. a ideia é trabalhar aos pares, mas vai ser possivel ter 3 bombas, duas a simular marés, e uma em random por exemplo. Basicamente, escolhe-se por canal qual o programa utilizado.

A ideia é utilizar 4 de 15000.

----------


## Fernando Garcia

Olá pessoal!
As principais funções que eu precisava para o meu controlador já foram implementadas. Nestes últimos dias estive planejando escrever mais uma função para ele, desta vez quero inserir a função "wavemaker".
Estive procurando quais as bombas de baixo custo eu poderia utilizar, encontrei as koralias 12v.
Procurando por informações na internet encontrei algumas divergências quanto ao tipo de corrente que elas utilizam até chegar a este tópico de 2009 http://www.nano-reef.com/forums/inde...c=209211&st=20 onde concluiram que as bombas são 12v AC.

No site Premium Aquatics (http://premiumaquatics.com/aquatic-supply/hydor-dc.html) constava que as bombas eram 12 DC como  a informação de que eram 12v AC era de 2009 pensei que talvez houvesse uma nova geração de bombas que trabalhem em 12v DC.
Então mandei um email para a loja para confirmar isto e a resposta foi: 




> Fernando,
> 
>             The controllable Hydor pumps are indeed AC 12 Volt.


Enviei um email pedindo que fizessem a alteração no site que já foi atendida.

Isso deve ser algum jogo de mercado da Hydor pois, cobram pouco pelas bombas e muito pelo controlador.

Continuando minha pesquisa encontrei um controlador feito por um Japonês que é compatível com as Koralias mas, ele não disponibilizou muitas informações sobre o projeto.

http://club240.ie-t.net/?p=680
http://club240.ie-t.net/?p=685

Bom, indo ao que realmente interessa.

Encontrei este circuito que controla a intensidade de uma lâmpada e que pode ser utilizado para controlar motores:



http://blog.eletronlivre.com.br/2010...automacao.html

Aqui tem uma explicação mais detalhada de como funciona o circuito.

http://blog.eletronlivre.com.br/2011...m-arduino.html

Perguntas:

O que o autor do texto abaixo quer dizer exatamente com interromper o ATMEGA?
No intervalo de 8 ms o arduino consegue processar todo o resto do código?
Está interrupção influência na função millis()?




> Para controlarmos o instante de disparo do TRIAC, quando o ATMEGA recebe uma interrupção externa (INT0), iniciamos o TIMER1 com um valor em us (microsegundos) que é inversamente proporcional a ultima leitura válida do sensor de distância, sendo que transcorrido esse período será gerada uma interrupção indicando o momento do disparo do TRIAC.
> O momento do disparo definirá a intensidade luminosa da lâmpada.
> A implementação da interrupção utilizando o TIMER1 é feita utilizando a biblioteca TIMER1.
> 
> Com a utilização do TIMER1 da forma descrita acima, liberamos o ATMEGA para executar outras funções durante o período entre a detecção de passagem por zero e o momento do disparo do TRIAC, ou seja , ganhamos até 8 ms por semi-ciclo. Esse tempo é aproveitado por exemplo para fazer a multiplexação dos displays de 7 segmentos que indicam a % da potência aplicada à lâmpada (método Loop), evitando assim a necessidade de mais componentes para controlar esses displays.



Neste vídeo temos um motor e uma lâmpada sendo controlados por um PIC mas, não há o projeto do circuito.




Durante o vídeo uma pessoa põe o dedo num componente branco comprido que me parece um resistor de potência.

Os amigos conhecedores de eletrônica poderiam identificar os componentes e dimensionar um circuito semelhante para funcionar com 12 v e 20w.

Minha intenção é fazer algo semelhante a isto:

http://efloyola.wordpress.com/2011/1...rduino-dimmer/





Abraço.
Fernando Garcia

----------


## Fernando Garcia

Vai um balde de água fria aí?

Procurando por outras soluções encontrei este vídeo:




Aparentemente contorna o problema de interrupção do ATMEGA.

http://benkrasnow.blogspot.com.br/20...ontrol-by.html

Indo até o blog do autor do vídeo...

http://benkrasnow.blogspot.com.br/20...ontrol-by.html

Um visitante perguntou:




> Hello Ben,
> Do you think that this arrangement would work with a permanent magnet synchronous motor (PMSM), 115V, about 500W?
> Thank you,
> SM


E ele respondeu:




> Anon, I don't think you can control the speed of a permanent magnet synchronous motor without varying the AC frequency. You will need a variable frequency drive (VFD) to control the speed. Similarly, regular induction motors cannot be speed-controlled by a simple "dimmer circuit" because the frequency of the AC determines the rotor speed.


Penso que as Koralias têm motores síncronos. 
http://www.feiradeciencias.com.br/sa...or_teoria1.asp

Portanto, será necessário alterar a frequência.

Nos links acima já tinha visto algo sobre esta questão mas, quando encontrei os circuitos fiquei tão empolgado que me esqueci deste detalhe.

No site japonês o criador do Namizo diz que a frequência utilizada pelo controlador varia de 35 a 60hz.

Então agora volto a estaca zero.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

> Olá pessoal!
> As principais funções que eu precisava para o meu controlador já foram implementadas. Nestes últimos dias estive planejando escrever mais uma função para ele, desta vez quero inserir a função "wavemaker".
> Estive procurando quais as bombas de baixo custo eu poderia utilizar, encontrei as koralias 12v.
> Procurando por informações na internet encontrei algumas divergências quanto ao tipo de corrente que elas utilizam até chegar a este tópico de 2009 http://www.nano-reef.com/forums/inde...c=209211&st=20 onde concluiram que as bombas são 12v AC.
> 
> No site Premium Aquatics (http://premiumaquatics.com/aquatic-supply/hydor-dc.html) constava que as bombas eram 12 DC como  a informação de que eram 12v AC era de 2009 pensei que talvez houvesse uma nova geração de bombas que trabalhem em 12v DC.
> Então mandei um email para a loja para confirmar isto e a resposta foi: 
> 
> 
> ...


Boas.

Ainda não me tinha deparado com este circuito, mas sinceramente não me parece a melhor forma de o fazer.

Enquanto que o conceito está correcto, ou seja, a controlo deve ser feito sempre a partir do inicio da onda, a forma como o faz não me parece razoavel, a não ser que esse micro seja dedicado ao wavemaker. De outra forma, estar a gerar um interrupt 50 x por segundo, pode ter grande impacto com as restantes tarefas de um controlador, qq que seja.

Acho que essa parte deve ser feita toda por hardware, e depois o pwm simplesmente ditar qt tempo a onda passa, variando desta forma a potência na bomba AC.

Abraço,
JAlves

----------


## Fernando Garcia

Olá!
Obrigado João pela resposta.

O jeito será construir um inversor de frequência com saída 127v para possibilitar a utilização de qualquer bomba como as Sunsun JVP-102b que custam só $20,00.
Aqui tem uma monografia que descreve o processo de desenvolvimento de um inversor de 127v e 5KW. 
Se alguém tiver interesse e puder ajudar.
http://www.dee.ufc.br/anexos/TFCs/20...%20Avelino.pdf
Penso que não seja nehum bicho de 7 cabeças.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas Fernando.

Antes de mais, obrigado pelo PDF, tem muita informação util.

Como tinha dito, ainda não pensei sequer nesta questão, mas tenho esperança de conseguir faze-lo de uma forma mais simples.

Electrónicamente, ainda não tenho qq ideia de como o vou controlar, mas a ideia, vai ser variar a potência media com o triac e de forma sincrona. Como chegar a isto, ainda não sei!  :Wink:

----------


## Fernando Garcia

Olá!

Bom, estou trocando idéias com um engenheiro elétrico e tudo indica que os motores são de indução.
Agora resta saber em qual destas duas situações elas se enquadram.




> Motor de Indução:
> 
> Método fase dividida: o motor é enrolado com dois enrolamentos o principal e o auxiliar, o auxiliar tem sua resistência maior que o principal, com isso os campos ficam defasados entre as bobinas e surge um campo magnético girante, levando o motor a partida. É importante salientar que o enrolamento auxiliar deve ser desligado quando o motor atinge 85% da velocidade nominal do mesmo, isso geralmente é feito através de um interruptor centrifugo que desliga o enrolamento ao atingir essa velocidade.
> 
> Método com capacitor de partida: Também faz uso de um enrolamento auxiliar só que ligado em serie com um capacitor de partida, que faz com que o atraso entre as bobinas seja maior que no método anterior, aumentando o conjugado de partida.
> Fonte: http://pt.wikipedia.org/wiki/Motor_m...u.C3.A7.C3.A3o


Aqui tem uma foto de uma motor de bomba.

http://www.alibaba.com/product-gs/34...ump_Motor.html

E mais detalhes deste tipo de motor.
http://www.alibaba.com/product-gs/43...ole_motor.html

Gostaria de saber se alguém tem uma bomba de circulação com defeito ou em desuso que possa desmontá-la e colocar as fotos do motor aqui.
A solução dos problemas provávelmente está neste arquivo.

http://search.4shared.com/postDownlo...de_induo_.html


Abraço.
Fernando Garcia

----------


## Fernando Garcia

> Boas Fernando.
> 
> Antes de mais, obrigado pelo PDF, tem muita informação util.
> 
> Como tinha dito, ainda não pensei sequer nesta questão, mas tenho esperança de conseguir faze-lo de uma forma mais simples.
> 
> Electrónicamente, ainda não tenho qq ideia de como o vou controlar, mas a ideia, vai ser variar a potência media com o triac e de forma sincrona. Como chegar a isto, ainda não sei!


João, boa tarde!
Dê uma olhada neste site:

http://www.mindspring.com/~tom2000/picaxe/VFContr.html

O circuito apresentado te parece válido?
Aqui tem um trecho da discussão sobre o projeto.

http://www.picaxeforum.co.uk/showthr...trol-Revisited

Eu não entendi muito bem.
Desculpe-me se estou colocando muita informação divergente.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

> Boas.
> 
> Ainda não me tinha deparado com este circuito, mas sinceramente não me parece a melhor forma de o fazer.
> 
> Enquanto que o conceito está correcto, ou seja, a controlo deve ser feito sempre a partir do inicio da onda, a forma como o faz não me parece razoavel, a não ser que esse micro seja dedicado ao wavemaker. De outra forma, estar a gerar um interrupt 50 x por segundo, pode ter grande impacto com as restantes tarefas de um controlador, qq que seja.
> 
> Acho que essa parte deve ser feita toda por hardware, e depois o pwm simplesmente ditar qt tempo a onda passa, variando desta forma a potência na bomba AC.
> 
> Abraço,
> JAlves



Olá!

João, tudo leva a crer que os motores são de indução de pólos sombreados sendo assim, podem ser controlados pelo sistema de detecção do início da senóide.

Aqui tem um exemplo:

Motores de pólos sombreado são iguais aos de gaiola porém, com tamanho menor segundo a wikipedia.




Acha que seria interessante colocar um arduino nano para fazer o controle das ondas e deixar o controlador principal apenas enviando sinais PWM  que serão convertidos para "delays" de disparo do triac? 

Ou seria mais intessante montar um circuito como o utilizado nesta "board": http://phaseanglecontrol.com/Manuals...ual_rev2.1.pdf


Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas Fernando.

Desculpa não te tar a responder, mas tem tado complicado.

O circuito de controlo de potência pode ser este:




O próprio optocoplador tem zero-cross detection, mas pode ser dispensado e usar um normal.

O que é preciso fazer é com um detector de passagem por zero, gerar um pico que sincronize o programa que vai gerar o sinal de controlo. Para fazer isto não se precisa de recorrer a interrupts a meu ver. Basta que o programa leia este sinal, e que caso o sinal que está a ser gerado desvie uns microsegundos que podem ser definidos, ajuste o inicio do sinal de controlo. Faz-se com isto um PLL por software.

A 16Mhz, desde que não se recorra a delays no programa, consegue-se ter tempos de loop baixos o suficiente para manter o controlo suficientemente preciso do triac mesmo estando o programa a executar mais rotinas.

Eu não sei o teu programa, mas o meu por exemplo, fiz uma rotina para medir isso em tempos, e na altura variava entre os 4 e os 12micro segundos.

Se pegarmos num sinal de 50Hz o periodo é de 1/50, ou seja, 20ms. Como queremos controlar a subida e descida da onda AC, temos que gerar o inicio do sinal de controlo a cada 10ms. 1% disto são 100microS e 0.1% são 10microS. Isto quer dizer que eu por exemplo, posso facilmente manter uma precisão de 0,1% a 0,2% a 50Hz sobre o inicio do ciclo de controlo.

Isto a meu ver é mais que aceitavel para controlar o sinal AC.

Depois de detectado e gerado o inicio do sinal, é só aplicar uma rotina de atraso variavel entre 0 e 10ms, em que 0ms representa 100% de potência e 10ms significam 0% de potência.

Abraço

----------


## JoaoCAlves

Diria ainda, que provavelmente pode-se usar directamente o circuito que indicas-te em 1ª mão, mas apenas não usando interrupts.

Senão existe estas opções em que a da figura 3 do link abaixo é uma excelente opção:

http://sound.westhost.com/appnotes/an005.htm

Abraço

----------


## Fernando Garcia

Olá!
João, obrigado pela resposta.
Vou comprar os componentes para fazer testes.

Agora para instigar a imaginação.

Que tal simular as ondas que uma vortech faz?










Os gráficos foram criados com valores "farejados" de uma MP10WES em modo master e estes eram os valores enviados para as demais em modo escravo.

http://forum.reefangel.com/viewtopic...&hilit=vortech


O eixo "Y" se refe a potência de saída em porcentagem.
O eixo "X" se refere ao tempo em milisegundos.
Os gráficos estão um pouco deslocados visto que a potência ultrapassa os 100%.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Mais uma idéia.

Viável, talvez...

Que tal colocar os peixes para "dançar".






Pensei em trocar os leds pelo pino analógico do arduino e usar  as leituras  nos valores de pwm.
Dependendo da música vai "estressar" a bomba e o circuito.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

:yb624:

----------


## Fernando Garcia

Olá!

Hoje fiquei feliz em saber que meu código está ajudando pessoas pelo mundo e vocês têm grande participação nisso.

Viva ao código aberto!!!!!!!!!!!!!!


Este vem da Ucrânia.






Qualquer semelhança é méra coincidência. Rs!






Abraço.
Fernando Garcia

----------


## Fernando Garcia

Agora deu vontade de trocar de LCD.





http://vizictechnologies.com/#/videos/4555425504
http://vizictechnologies.com/#/products/4554277969

----------


## Fernando Garcia

Olá pessoal!
Vos apresento mais um código baseado no Stilo 2.1.
O desenvolvimento deste projeto está descrito aqui: http://www.reefcentral.co.uk/showthr...e-Maker-etc%29




Vocês podem encontrar o código juntamente com a IDE 0022 e bibliotecas necessárias neste link: http://code.google.com/p/jarduino-aquarium-controller/

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Tá giro sim senhor!  :Wink:

----------


## Hugo Figueiredo

Está extraordinário, não há que ter medo das palavras!!! :Pracima: 
Então a parte da iluminação está um MUST!!!

Eu andava a "inventar" umas coisas de raiz (também porque gosto de programação), mas julgo que está aqui uma base muito sólida (não conheço bugs e afins que possam haver) para pegar e alterar em conformidade.

A grande vantagem dos OpenSource é mesmo essa!


No que me diz respeito vou pegar nesta base em vez de andar a tentar fazer tudo de raiz!
Muito bom!!! :yb677: 


P.S.: Fiquei só com uma pequena dúvida: Qual a vantagem de trabalhar com a "potência" dos leds na escala de 0-255 em vez de 0-100%, em leds unicolor?  :Admirado:

----------


## Fernando Garcia

> P.S.: Fiquei só com uma pequena dúvida: Qual a vantagem de trabalhar com a "potência" dos leds na escala de 0-255 em vez de 0-100%, em leds unicolor?


Hugo, dá na mesma a diferença é que para saber os valores de saída em porcentagem você terá que fazer uma interpolação linear ou regra de três como preferir.

0 % = 0

x    =  y 

100 % = 255

Onde x é igual ao porcentagem desejada e y é igual ao valor do PWM à ser configurado.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Existe uma vantagem. Devido ás contas mal feitas do arduino, podes não conseguir chegar a 255. Se trabalhares directamente de 0 - 255, evitas esses probs.

claro que se resolve, mas é mais um map....  :Big Grin:

----------


## Hugo Figueiredo

Ok, porque o pwm funciona de 0 a 255, tá bem!
É só uma questão de pormenor... :Pracima:

----------


## Nuno Prazeres

> Ok, porque o pwm funciona de 0 a 255, tá bem!
> É só uma questão de pormenor...


Eu tenho usado a função específica "map" para esse efeito. Agora se com 100% fica por 254 ou 253 em vez de 255, paciência...

----------


## Rui Manuel Gaspar

Boas  :Olá: ,




> Está extraordinário, não há que ter medo das palavras!!!
> Então a parte da iluminação está um MUST!!!
> 
> Eu andava a "inventar" umas coisas de raiz (também porque gosto de programação), mas julgo que está aqui uma base muito sólida (não conheço bugs e afins que possam haver) para pegar e alterar em conformidade.
> 
> A grande vantagem dos OpenSource é mesmo essa!
> 
> 
> No que me diz respeito vou pegar nesta base em vez de andar a tentar fazer tudo de raiz!
> ...



Tá mesmo muito bom. Só é pena não estar feito para o 3.2WC ...  :yb620: 

Hugo, estou mesmo sem tempo para isto. E acho que também não tenho conhecimentos de programação suficientes. 
Se rectificares isto para o 3.2 e quiseres partilhar ... Eu agradeceria com certeza!

Abraços,
Rui

----------


## Baltasar Parreira

Epa mudar aquilo para o 3.2WC não é complicado deixem-me ver um tempinho e faz-se eheheh...

----------


## JoaoCAlves

Sim, isso é só definir o type, tem um código, para identificar o ecran.

Tb estou á espera ds meus 2 3.2WC. Qd os tiver, vou migrar o controlador de testes e o do aqua para eta versão e começar a desenvolver o meu código neles.

----------


## Baltasar Parreira

João essa parte é fácil... eheheh.

É só ir a linha 92 e mudar para isto:

ITDB02       myGLCD(38,39,40,41,ITDB32WC);    //May need to add "ITDB32S" depending on LCD controller


Agora o que se devem estar a referir é que mesmo mudando isso o software não usa o ecrã todo, vais ter sempre um mini rectângulo encostado a esquerda pois as coordenadas e todos os prints feitos para o LCD estão limitados a resolução dos LCD mais pequenos.

----------


## JoaoCAlves

??

Epa, pensei que ele ajustasse logo a resolução em função do ecrãn escolhido!  :Big Grin:

----------


## Baltasar Parreira

Pois não o comando de print no LCD é por coordenadas de pixel, logo ao passar para um LCD com mais pixéis tens de recalcular tudo se quiseres usar a área total que tens disponível.

----------


## Fernando Garcia

Olá!
O código do Jamie está muito bem explicado.
O único problema que vejo é a quantidade de cores diferentes que ele usou nos leds.
Normalmente nos fóruns o pessoal usa o blue, royal blue e white sendo os 2 tipos de azuis controlados pelo mesmo canal.

O que é mais fácil ?

( ) Excluir os trechos que não se pretende usar no código.
( ) Retirar as partes que se pretende usar e colocar em outro código.
( ) Tanto faz.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Vos informo que o programa Jarduino sofreu atualizações, mais informações aqui http://www.reefcentral.co.uk/showthr...l=1#post250739.

A nova versão já está disponível aqui:
http://code.google.com/p/jarduino-aq...a.rar&can=2&q=

Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Boa noite

Espreitei o tópico no reefcentral e o grafismo está com excelente aspecto!
Muito bom mesmo!  :Palmas: 

Abraço
Pedro Ferrer

----------


## JoaoCAlves

Muito giro mesmo.

Tb quero ver se arranjo umas pics da lua para por no meu.

Para já vou portanto o meu código  :Big Grin:

----------


## Sérgio Paulo

Obrigado *Fernando Garcia*, estive a ver e realmente está um espetáculo.

O meu ainda está em standby, o nascimento do meu filhote veio alterar algumas prioridades.

 :Palmas: 

 :SbOk:

----------


## Fernando Garcia

Olá!
Adicionei uma nova função ao meu controlador.
Agora tenho os parâmetros online em tempo real.
Veja aqui: https://cosm.com/feeds/69337

Os interessados podem ver o código de exemplo aqui: http://pastebin.com/Fp52NUNk

Abraço.
Fernando Garcia

----------


## Hugo Figueiredo

O grafismo está realmente muito bom tendo em conta as potecialidades do monitor!

Essa interligação com o patchube também é um must have!!!

Mais um para os meus favoritos!  :Smile:

----------


## Fernando Garcia

Olá!
Recentemente adicionei ao meu controlador 4 "stamps" da Atlas ligados a um multiplexador.
Gostaria que me dessem sugestões de alternativas aos "delays" necessários para comunicação entre os "stamps" e o arduino.
Isso está me incomodando pois, tenho o arduino "parado" por 4 segundos a cada minuto.
Desde já agradeço.
Segue o código:


void check_parametros() 
{
int i;
unsigned long millis_agora = millis();

  if (millis_agora - millis_antes > 60000)
   {
    millis_antes = millis_agora;

    do{
    Open_channel(ph1);
    Serial3.print(tempC);
    Serial3.print('\r');
delay (1100);

    if(Serial3.available() > 3)
    {
      holding = Serial3.available();
      for(i=1; i <= holding; i++)
      {
        sensorstring[i]= Serial3.read();
      }     
      if(holding ==5)
      {
      PHT = ((sensorstring[1]-48)*100 + (sensorstring[3]-48)*10 + (sensorstring[4]-48));
      PHA = PHT/100;
      }
      else
      {
        PHT = ((sensorstring[1]-48)*1000 + (sensorstring[2]-48)*100 + (sensorstring[4]-48)*10 + (sensorstring[5]-48));
        PHA = PHT/100;
      }  
      PHT=0;
      Serial3.flush();
      break;
   }
  } while (done==1);
  done=0;

    do{
    Open_channel(ph2);
    Serial3.print(tempC);
    Serial3.print('\r');
delay (1100);

    if(Serial3.available() > 3)
    {
      holding = Serial3.available();
      for(i=1; i <= holding; i++)
      {
        sensorstring[i]= Serial3.read();
      }      
      if(holding ==5)
      {
      PHT = ((sensorstring[1]-48)*100 + (sensorstring[3]-48)*10 + (sensorstring[4]-48));
      PHR = PHT/100;
      }
      else
      {
        PHT = ((sensorstring[1]-48)*1000 + (sensorstring[2]-48)*100 + (sensorstring[4]-48)*10 + (sensorstring[5]-48));
        PHR = PHT/100;
      }  
      PHT=0;
      Serial3.flush();
      break;
    }

  } while (done==1);
  done=0;

  do{
    Open_channel(orp);
    Serial3.print("r"),
    Serial3.print('\r');
delay (1100);

    if(Serial3.available() > 3)
    {
      holding = Serial3.available();
      for(i=1; i <= holding; i++)
      {
        sensorstring[i]= Serial3.read();
      }
      ORPT = ((sensorstring[1]-48)*100 + (sensorstring[2]-48)*10 + (sensorstring[3]-48));
      ORP = ORPT; 
      ORPT=0;
      Serial3.flush();
      break;
    }
  } while (done==1);
  done=0;


   }
}


Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Boa noite 

Os 'delays' são sempre má escolha... ainda para mais num Loop... visto que não existe algo 'DoEvents'... onde o que acontece fora do Loop, no Arduino não está a ser tido em conta....
Porque não optas por ler à vez... ou seja... em vez de leres a totalidade dos resultados no mesmo ciclo de varrimento do PLC (CLP em português do Brasil), poderias ler de forma incremental...

Assim...
Reset Arduino
Inicialização
Setup()
Loop()

varrimento 1 (ciclo do cristal 16Mhz)
-> leitura sensor 1
(...)
varrimento 2
-> leitura sensor 2
(...)
varrimento 3
-> leitura sensor 3
(...)
varrimento 4
-> leitura sensor 4
(...)
varrimento 5
-> leitura sensor 1
(...)
varrimento 6
-> leitura sensor 2
(...)

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Para não se usar delay, basta alterar os timers, normalmente o timer usado é o 2, depois por interrupts a cada ciclo de interrupt ler os valores, assim o loop normal corre sempre sem problemas e qualquer delay.

----------


## Fernando Garcia

> Boa noite 
> 
> Os 'delays' são sempre má escolha... ainda para mais num Loop... visto que não existe algo 'DoEvents'... onde o que acontece fora do Loop, no Arduino não está a ser tido em conta....
> Porque não optas por ler à vez... ou seja... em vez de leres a totalidade dos resultados no mesmo ciclo de varrimento do PLC (CLP em português do Brasil), poderias ler de forma incremental...
> 
> Assim...
> Reset Arduino
> Inicialização
> Setup()
> ...


Pedro, bom dia!
Obrigado pela resposta.
Pensei em fazer isto pois, desta forma teria atraso de 1 segundo a cada minuto.
Ainda estou pensando numa maneira de fazer isto.
Abraço.

----------


## Fernando Garcia

> Para não se usar delay, basta alterar os timers, normalmente o timer usado é o 2, depois por interrupts a cada ciclo de interrupt ler os valores, assim o loop normal corre sempre sem problemas e qualquer delay.


Baltasar, bom dia!

Não entendo como essa função pode me ajudar.

Penso que o arduino após enviar o comando de leitura voltará para o loop normal e quando a resposta estiver disponível na porta serial ele verificará e depois retornará ao loop de onde parou. É isso?

Grato.
Fernando Garcia

----------


## Baltasar Parreira

Nope nao funciona assim.

Tens aqui um exemplo

(dentro do void setup)

   //-------------------- Set timer -------------------------------------
	                            /* Frame buffer interrupt  */
	TCNT2 = 0x00;			    /* Initial counter value 0 */
	TIMSK2 |= (1 << OCIE1A);	/* Enable CTC interrupt    */
	/* Every 1024th cpu cycle, a counter is incremented.
	 * Every time that counter reaches 5, it is reset to 0
	 * and the interrupt routine is executed.
	 * 1000000/1024/5 = 195 hz refresh
	 * There are 5 layers to update..
	 * 195 hz / 5 layers = 39 FPS
	 */
	OCR2A = 5;		        	/* Interrupt if counter hold value 5 */
	TCCR2A = 0x05; 			    /* Prescaler set to 1024 */
	TCCR2A |= (1 << WGM01); 	/* Clear Timer on Compare Match (CTC) mode */

   //--------------------------------------------------------------------    


como vês com isso ficas com um counter a cada X s, depois só tens de ir vendo quando esse counter está no ponto e fazeres as tuas leituras assim ()nota isto fica fora quer do void setup quer do loop:

// Timer A2 interrupt service routine, Refreshes the Video Zone
ISR(TIMER2_COMPA_vect){

/* fazes aqui o que queres ler ou fazer etc... */

   /* Enable interrupts */
   sei();

}

Com este código a cada X segundos o que estiver aqui dentro é executado independente do loop normal e se tens comandos de delay lá ou não.

----------


## Fernando Garcia

Baltasar, boa tarde!

Não consigo usar o exemplo que você me deu.

Encontrei um exemplo dado pelo usuário "davekw7x" neste tópicohttp://www.arduino.cc/cgi-bin/yabb2/...num=1278539360 que funciona.

Fiz uma adaptação para que a ação seja executada a cada 60 s.

[code]

// This ISR is run when Timer/Counter2 reaches OCR2A
ISR(TIMER2_COMPA_vect)
{
    ++int_count;

        if (int_count >= max_count) {
	  int_count = 0;
          counter++;
        }

          if(counter == 60)
          {
          counter = 0;
	  Serial.println(millis());
          digitalWrite(ledPin, led_state);
	  led_state = 1 - led_state;
          }   
}

[/code]

Quando juntei ao meu código ele até funciona mas, o processamento do touch é extremamente lento.

Obrigado pela atenção.

Abraço.
Fernando Garcia

----------


## Baltasar Parreira

Pois não sei eu uso aquele código as vezes, posso ter copiado alguma coisa mal pois tinha comentários desnecessários que apaguei e posso ter apagado parte boa do código, no entanto a lentidão pode ter a ver com o touch estar a usar algum ou todos os pinos que o timer2 mexe, nomeadamente esta info:

Timer2 (PWM 3 and 11)Used to drive PWM outputs for digital pins 3 and 11.

Se mudares os 60s para outro valor mais alto certamente o touch fica mais responsivo pois não salta tanto as leituras de valores a cada interrupt e deixa de fazer a parte do código do touch.

Talvez lendo isto percebas melhor o que são interrupts, timers etc em microcontroladores.


Aqui fica um link bem descritivo, sorry mas é em inglês: http://www.funnyrobotics.com/2011/06...nd-timers.html

----------


## Fernando Garcia

Olá!

Não tem problema de ser em inglês.
O Google ajuda.

No texto do link que você que você forneceu tem uma obervação que faz com que essa função não sirva para o meu propósito.

"Note also that due to the fact that interrupts are blocked and timers are stopped during the ISR processing, inside the attached function, delay() won't work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. "

O problema da lentidão estava na frequência das interrupções que era de apenas 10 micro segundos.

Fazendo algumas alterações consegui ter a interrupção em 64 segundos.

 TCCR2B |= (60 << CS20);

  if (int_count >= max_count) 
  {
    int_count = 0;
    counter++;
  }

  if(counter == 1)
  {
    counter = 0;
    Serial.println(millis());

   } 


Mas, o programa trava por conta dos delays e se eu removê-los não consigo ter as respostas dos "stamps" em tempo.

Grato.
Fernando Garcia

----------


## Baltasar Parreira

Nao isso é se usares o timer0, esse é que é responsavel pelo mills e etc...

----------


## Fernando Garcia

Olá!

Ainda não consegui encontrar uma alternativa aos "delays" irritantes.

Isso fica para outra hora.

Gostaria de saber dos amigos que compraram a placa de reles da Iteadstudio se tiveram problema com ela.
Um amigo que estou ajudando a montar o controlador instalou um chiller de cerca de 750 W e segundo ele a trilha inferior da placa derreteu.
Isso é muito estranho pois, a especificação da placa diz que ela suporta até 2500 W em 250 V.
Uma imagem da placa que me refiro.



Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas.

Pois, esse é sempre o perigo, ou o pcb tá bem dimensionado, ou caput...

Eu tenho um de 2 relés, mas nem é da itead, e duvido que suporte 10A nas pistas!!!

----------


## Fernando Garcia

Olá!

Boas notícias....?

Vem por aí Arduino Due!

http://www.forkrobotics.com/wp-conte...ArdunioDUE.pdf

http://www.forkrobotics.com/2012/10/...-announcement/

Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Óptimas notícias!!!
Era só uma questão de tempo.
A mim, permite a continuação de partes do projecto já programadas, mas que tive que abdicar da forma que pretendia por falta de precisão aritmética.

Pedro Ferrer

----------


## Fernando Garcia

Olá!

O Arduino due já está disponível para venda.

O preço é muito próximo do Max32.

Abraço

----------


## Baltasar Parreira

Humm... se é próximo acho que não compensa, pois só tem 256K comparado com os 512K do chipKIT MAX32.

----------


## Fernando Garcia

Olá!

Esse valor de 256 K se refere a que?

Abaixo estão as especificações.


Summary
Microcontroller	 	AT91SAM3X8E
Operating Voltage	 	3.3V
Input Voltage (recommended)	 	7-12V
Input Voltage (limits)	 	6-20V
Digital I/O Pins	 	54 (of which 12 provide PWM output)
Analog Input Pins	 	12
Analog Outputs Pins	 	2 (DAC)
Total DC Output Current on all I/O lines	 	130 mA
DC Current for 3.3V Pin	 	800 mA
DC Current for 5V Pin	 	800 mA
Flash Memory	 	512 KB all available for the user applications
SRAM	 	96 KB (two banks: 64KB and 32KB)
Clock Speed	 	84 MHz

Abraço.

----------


## Baltasar Parreira

Pois era a flash, mas pelos vistos mudaram o ATMEL usado certamente e agora tem 512K tal como o outro.

Inicialmente as especificações descritas quando falaram no DUO era mesmo só 256K, mas podia ser algum erro tambem, não sei ehehehe....

----------


## Pedro Ferrer

Olá

http://hackaday.com/2012/10/20/the-a...-finally-here/

----------


## Fernando Garcia

Olá!

Alguém pode fazer a gentileza de dar uma olhada neste código (http://pastebin.com/07jG1x94) e me dizer o que está errado.

Estou tentando comparar duas matrizes mas, não consigo fazer com que elas sejam iguais mesmo digitando os números corretos.

O trecho de comparação é este: 

          if (stCurrent == senha)
          {
            stCurrent[0]='\0';
            myGLCD.print("SENHA CORRETA", LEFT, 208);
          }

Obs. Retirei parte do código que não influenciam no resultado.


Grato.
Fernando Garcia

----------


## JoaoCAlves

Humm, não sei se podes comparar 2 arrays assim!

experimenta com um ciclo "for" comparar posição a posição do array. Ou até mesmo com um while!

----------


## Baltasar Parreira

Certo os array so podem ser comparaveis nas suas posicoes.

teras de fazer uma funcao para isso, algo no genero.

void chekPass(char input, char input2) {

for (i = 0; i < sizeof(input) < ;i++) {
     if (input[i] != imput[2]) 
     return false;
}

return true;
}

nao validei isto, mas resumindo varres o array principal ate ao limite do seu tamanho e vai comparando com o de entrada assim que houver algo que nao seja igual sais returnando falso, se chegar ao fim sem falhas entao tens um return true e ja sabes que as passwords sao iguais.

Deposi podes chamar facilmente assim:

if (chekPass(pass1, pass2))
// entao passs OK
else
// pass invalida


}

----------


## Fernando Garcia

Olá!
Obrigado pelas respostas.

Consegui de um jeito bem simples.

Só mudei isto.

char senha [7] = {'1','2','3','4','5','6','\0'};

          if ((stCurrent[0] == senha [0]) && (stCurrent[1] == senha [1]) && (stCurrent[2] == senha [2]) && (stCurrent[3] == senha [3]) && (stCurrent[4] == senha [4]) && (stCurrent[5] == senha [5]))
          {
            stCurrent[0]='\0';
            stCurrentLen=0;
            myGLCD.setColor(0, 0, 0);
            myGLCD.fillRect(0, 208, 319, 239);
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("SENHA CORRETA", LEFT, 208);
          }

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
Aqui o código completo.

http://pastebin.com/07jG1x94


Depois volto com um vídeo mostrando meu programa com a solicitação da senha implementada.

Abraço.

----------


## Baltasar Parreira

Sim essa é outra hipotese de validar uma a uma a posicao do array, mas lembrei talvez ainda outra mais facil que penso ser possivel, fazes um cast do array para string e sendo string já podes comparar directo com if (string1 == string2).

Mas nao me lembro se é possivel cast de array -> string.

----------


## Baltasar Parreira

Ok, fresquinho aqui ficam as primeiras imagens assim que saiu da caixa do DUO.

A primeira vista sem ser minuciosa não passa de um Mega R3 aparentemente mas olhando com mais cuidado reparamos que a vulgar ficha banal USB passou agora a ser uma USV micro-B para a de programação e que existe uma segunda micro-A que serve como USB host ou OTG para ligar dispositivos tipos ratos, teclados e etc.
Para alem disto que salta mais a vista existe um mini e mesmo nini push buttom para alem do normal reset que ser pressionado funciona como erase e limpa tudo no Atmel.

Todo o pinout e ports tem exactamente a mesma descrição, posição e nomes do Mega R3.

Claro que nem se fala a nível de performance a correr os programas e sem qualquer falha em tudo que seja contas aritméticas a trabalhar com floats de N casas decimais tal como o chipKIT MAX32 que só fica a trás agora do DUO por ter menos portas PWM pois tudo o resto  muito semelhante.

Uma das outras grandes novidades é que para operar o DUO temos de usar (ainda beta) um IDE versão 1.5 que tem um funcionamento muito semelhante mas com bastantes melhorias como por exemplo agora ao fazer upload de um sktech aparece tipo um progress bar na janela do log a dizer que % estamos do envio para a board.

Bem assim rápido e sem grandes testes a fundo ainda é udo.
Deixo só umas fotos mesmo tiradas pelo telemóvel para verem o aspecto geral e a prova do novo IDE.

----------


## Pedro Ferrer

Bom dia

Faltou dizer algo extremamente importante... é que *agora* a tensão do Arduino é de *3.3V* e não os *5V* sob pena de o danificar.
Ou seja, bóias... sensores... é preciso olhar com outros olhos.

Abraço
Pedro Ferrer

----------


## Baltasar Parreira

Correctíssimo Pedro, esqueci-me desse detalhe super importante, foi da hora...  :yb665: 

Fica aqui o link oficial com todos os detalhes e diferenças dos Arduinos anteriores : http://arduino.cc/en/Guide/ArduinoDue

----------


## Rui Manuel Gaspar

Boas,

Eu sabia que havia uma excelente razão para deixar os 3.3V na fonte de alimentação de PC para o meu aquário. 
Assim se mais tarde trocar, é só trocar o fio de alimentação e já está ....

 :Big Grin: 

Abraços,
Rui

----------


## Fernando Garcia

Olá!

Mais algumas observações acerca do DUO e da IDE 1.5.

1º O Duo não possui uma memória EEPROM logo, teremos que esperar que alguém escreva uma biblioteca para guardar dados não voláteis na FLASH.

2º A IDE 1.5 tem problemas com as sub pastas das bibliotecas. 
Se houver uma sub pasta como nome "Examples" ao invés de "examples" a IDE não reconhece a biblioteca. 
Também não reconhece a biblioteca se houver uma pasta como nome "tools" ou "Tools".


A falta de uma biblioteca para guardar dados é o que me impede de comprar um DUO no momento.

Abraço.

----------


## Baltasar Parreira

Correcto Fernando e eles já disseram que a próxima versão a sair rápido já tem isso corrigido dos nomes dos folders.

Para já estou com um problema mais grave que é nem conseguir adicionar qualquer lib que seja, ele pura e simplesmente ignora o que se adicionar.

Hummm... sobre a EEPROM não sabia, vou investigar melhor  :SbOk:

----------


## Fernando Garcia

http://arduino.cc/forum/index.php/topic,128498.0.html

----------


## Baltasar Parreira

Ok, problema das libs resolvido, saquei a versão actual do Github e compilei.

Esta versão agora já encontra os folders das libs e etc. tal como deve ser.
A ver se tem mais novidades.

----------


## Fernando Garcia

Olá!

Aqui fica o vídeo com a nova função que adicionei ao Ferduino (meu código agora tem nome. kkk).

Obrigado por todas as sugestões.




Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas.

Bom testado o sketch do fade tb.

A boa noticia, é que a função analogwriteresolution() funciona bem e pode-se por o pwm a 16 bit!!!!

Bye bye saltinhos nos leds!!  :Big Grin:

----------


## Fernando Garcia

Olá!

João e Baltasar um de vocês pode fazer a gentileza de testar o Ferduino ou o Jarduino para ver como se comportam com o DUO?
Talvez nem rode por falta da EEPROM.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Deixa acertar as libs 1º!  :Wink:

----------


## Fernando Garcia

Olá!

Obrigado João!

Gostaria que me dessem mais uma sugestão.

Desta vez estou escrevendo o código das dosadoras.

Aqui estão as imagens dos 2 menus para configuração da dosagem personalizada.





No primeiro menu pode-se escolher os dias da semana e também o horário inicial e final em que a dosagem será feita.

No segundo menu pode-se escolher o volume que será dosado no dia e também a quantidade de frações em que o volume será dividido. Além disso pode ativar ou desativar a função.

A questão é a seguinte:

Estou pensando em fazer os cálculos dos intervalos de dosagem e cada vez que uma dosagem for realizada atualizar o horário da próxima dosagem na EEPROM.

Ocorre que dizem que a EEPROM tem vida útil de 100.000 gravações/leituras.

Na pior das hipóteses eu teria 3 dosadoras dosando 24 x por dia que daria um total de 72 atualizações de horário.

Com isso eu teria um total de 26.280 gravações por ano.

E a vida útil da EEPROM seria cerca de 3,805 anos.

Acham que eu deveria usar este método ou colocar uma EEPROM externa?

Outra idéia?

Grato.
Fernando Garcia

----------


## Pedro Ferrer

> Olá!
> Estou pensando em fazer os cálculos dos intervalos de dosagem e cada vez que uma dosagem for realizada atualizar o horário da próxima dosagem na EEPROM.


Porque não guardas essa info num array?

Pedro Ferrer

----------


## Rui Manuel Gaspar

E para além de guardares num array montas uma mini UPS para não perderes os dados de quantas vezes já dosaste.

Abraços,
Rui

----------


## Fernando Garcia

> Porque não guardas essa info num array?
> 
> Pedro Ferrer


Olá!

Se o arduino for desligado o último horário de dosagem não será perdido?

Grato.
Fernando Garcia

----------


## JoaoCAlves

Usa a Ram do RTC, essa nunca se perde enquanto houver pilha!

----------


## Rui Manuel Gaspar

> Usa a Ram do RTC, essa nunca se perde enquanto houver pilha!


?????
Queres elaborar?

----------


## Pedro Ferrer

Sim

O RTC tem uma EEPROM. 
O seu acesso é que não é tão directo quanto a EEPROM do Arduino.

----------


## Fernando Garcia

> E para além de guardares num array montas uma mini UPS para não perderes os dados de quantas vezes já dosaste.
> 
> Abraços,
> Rui


Olá!
Rui, no meu projeto pretendo colocar um gerador a gasolina. Por isso não pretendo recorrer as baterias.

Abraço.

----------


## Fernando Garcia

> Usa a Ram do RTC, essa nunca se perde enquanto houver pilha!


Essa é uma boa idéia pois, estive pensando que mesmo se o valor for guardado na EEPROM a dosagem do dia em que faltar energia será comprometida. Caso o gerador não ligue antes do último horário gravado.

Depois vou dar uma procurada por este assunto.
Agora tenho que ir pra faculdade.

Aqui fica uma imagem do menu que acabei de escrever, ele resume todas as configurações do modo personalizado.



Abraço.
Fernando Garcia

----------


## JoaoCAlves

> ?????
> Queres elaborar?





> Sim
> 
> O RTC tem uma EEPROM. 
> O seu acesso é que não é tão directo quanto a EEPROM do Arduino.


Boas.

Não é eeprom, é mesmo ram, se tirares a pilha perde-se o que lá está.

As libs têm rotinas para lidar com a ram, 56 bytes.

exemplo:
http://code.google.com/p/ds1307new/

----------


## Pedro Ferrer

Mas vocês que usam Touch screens com cartões SD, porque não o usam para a questão em causa?

----------


## JoaoCAlves

Nunca me preocupei com isso, pq não tou sempre a mexer na eeprom.

Tipicamente, só la mexo se alterar a calibração do touch, ou se alterar as horas de começo e fim dos ciclos.

Como isso é mt estático, não vale a preocupação!  :Wink:

----------


## Fernando Garcia

Olá!

O Henning está convocando "betatesters" para a biblioteca que substituirá a ITDB02_Touch se houver algum interessado dê uma olhada no link abaixo:

http://www.henningkarlsen.com/electronics/index.php

Abraço.

Fernando Garcia

----------


## Fernando Garcia

Olá!

Fica aqui a imagem de mais um menu que fiz.



Abraço.
Fernando Garcia

----------


## Rui Manuel Gaspar

Boas Fernando,

Porque é que não validas directamente o resultado em vez de estares com mensagens de erro?

Tipo quando carregas o botão "-" se hora final menor que hora inicial então hora final igual a 24. E ao contrário também se hora inicial = a hora final então hora inicial igual a 24.

Abraços,
Rui

----------


## Fernando Garcia

Olá!

Acho que durante o ajuste do horário em algum momento os horários serão incorretos então, seria um pouco irritante ter as horas voltando a zero.

A pessoa teria que ficar prestando atenção se deve apertar o mais ou o menos, visto que quando a hora é menor que zero ela passa a ser 23 e quando é maior que 23 passa a ser zero.

Prefiro validar no momento em que se for salvar o horário.

Abraço.

----------


## Pedro Ferrer

Definir intervalos de horário é uma filosofia para o doseamento... da qual não partilho...
Eu tenho 24h livres de doseamento. 
Para mim tornou-se fácil o doseamento de n bombas com n doseamentos sem que existissem conflitos de químicos.

----------


## Fernando Garcia

Olá!

Se a pessoa que estiver usando o código tiver a mesma opinião que você, poderá fazer as seguinte configurações:

Inicial: 00:00

Final: 23:59

Quantidade de doses: 24


Abraço. 
Fernando Garcia

----------


## Rui Manuel Gaspar

> Olá!
> 
> Acho que durante o ajuste do horário em algum momento os horários serão incorretos então, seria um pouco irritante ter as horas voltando a zero.
> 
> A pessoa teria que ficar prestando atenção se deve apertar o mais ou o menos, visto que quando a hora é menor que zero ela passa a ser 23 e quando é maior que 23 passa a ser zero.
> 
> Prefiro validar no momento em que se for salvar o horário.
> 
> Abraço.


Não porque se passasse a 0 era só andar para trás e retornava o último valor. Tenho essa configuração para ATO e temperatura e funciona muito bem.




> Definir intervalos de horário é uma filosofia para o doseamento... da qual não partilho...
> Eu tenho 24h livres de doseamento. 
> Para mim tornou-se fácil o doseamento de n bombas com n doseamentos sem que existissem conflitos de químicos.


Pois Pedro mas se tiveres para dosear um aditivo qualquer que influencie o pH? podes queres dosar durante a noite ou dia para compensar.



> Olá!
> 
> Se a pessoa que estiver usando o código tiver a mesma opinião que você, poderá fazer as seguinte configurações:
> 
> Inicial: 00:00
> 
> Final: 23:59
> 
> Quantidade de doses: 24
> ...


Então e no caso de 00:00 a 23:59 com 1 doseamento? a que horas é que é feito o doseamento.

Abraços,
Rui

----------


## Pedro Ferrer

> Então e no caso de 00:00 a 23:59 com 1 doseamento? a que horas é que é feito o doseamento.
> Rui


Depende... esse valor depende das condições de trabalho do grupo de bombas... e do algoritmo
No caso de haver apenas 1 bomba... com 1 doseamento... o horário poderá ser 00:00...

No meu caso, num grupo de 3 bombas, com 2 bombas com doseamento 0, a bomba solicitada para 1 doseamento será actuada às 08:00... :SbSourire19:

----------


## Fernando Garcia

> Então e no caso de 00:00 a 23:59 com 1 doseamento? a que horas é que é feito o doseamento.
> 
> Abraços,
> Rui


Olá!

O cálculo é o seguinte:

(23 * 60 + 59) - (0 * 60 + 0) = 1439 minutos

1439 / 1+1 = 719,5 minutos

719,5 % 60 = 59,5 minutos

719,5 - 59,5 = 660 minutos

660 / 60 = 11 horas

Hora de dosagem:

00  + 11 = 11 horas

Minuto de dosagem:

0 + 59, 5 = 59,5 minutos

Como minuto é uma variável do tipo inteiro o horário exato será: 

11:59

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Ficam aqui dois vídeos da dosadora em ação.







Abraço.
Fernando Garcia

----------


## Hugo Figueiredo

Fernando, o teu projeto está uma categoria!!!
Muitos parabéns!!!

É só fios e mais fios...  :Smile:

----------


## JoaoCAlves

Boas!

Mt fixe, continua!  :Wink:

----------


## Fernando Garcia

Olá!

Seguindo a sugestão do Pedro resolvi armazenar o horário das dosagens no cartão SD.

O programa que lê os horários é o da imagem abaixo.



Ocorre que tive que colocar um contador para evitar que a dosagem seja feita várias vezes numa mesma hora de forma indevida.

Em alguns casos 2 dosagens durante a mesma hora é normal como podem observar na imagem.

A pergunta é:

Como fazer para contornar este problema visto que quando são 19 horas o *contator1* sempre pára em 20 e consequentemente a dosagem das 19:58 nunca será feita.

Grato.
Fernando Garcia

----------


## Fernando Garcia

> Fernando, o teu projeto está uma categoria!!!
> Muitos parabéns!!!
> 
> É só fios e mais fios...


Obrigado Hugo.

----------


## Fernando Garcia

> Boas!
> 
> Mt fixe, continua!


Obrigado João.

----------


## JoaoCAlves

Boas.

Tá um pouco dificil perceber o teu código, podes explicar as vars? n1?n11?buf1?buf11?

Que tipo de vars são?

Int's?

----------


## Fernando Garcia

Olá!

As variáveis são essas:

  int16_t n1;
  int16_t n11;
  char buf1[5];
  char buf11[5];
  int hora1;
  int minuto1;
  int contador1 = 0;
  int contador2 = 0;

As 4 primeiras não são muito importantes só servem para ler o "array" que vem da leitura do TXT.

Grato.
Fernando Garcia

----------


## Pedro Ferrer

Boa noite

Sugestão...
Em vez de 3 colunas, crias 4... uma das quais com o estado '0' ou '1'... onde '0' doseamento não realizado e onde '1' doseamento realizado...
Assim sendo, poderias manter as 3 colunas, substituindo a coluna 'contador' pela coluna 'estado'.
Uma vez o doseamento realizado, fica '1' e este já não é respeitado... terias 1 problema, pois terias de forma diária repor este estado a '0'... 

Outra solução, seria realizares uma pesquisa por horas, e guardar num array, os minutos de doseamento dessa hora...
Ex:
19:01
19:58

int arrayTempBomba1[24]
arrayTempBomba1[0]=1
arrayTempBomba1[1]=58

Assim reduzias tempo de pesquisa no SD Card, pois tens um ciclo 'while'...

Mas não entendi bem porque te queixas que...
"contador1 sempre pára em 20 e consequentemente a dosagem das 19:58 nunca será feita."

Abraço
Pedro Ferrer

----------


## JoaoCAlves

Existe ainda outra hipotese qt a isso, é colocar o segundo.

Mesmo que seja sempre 0, mas tem que fazer match em hora, minuto e segundo.

----------


## Fernando Garcia

Olá!
Obrigado pelas respostas.
Vejam se com esta imagem fica mais claro o que estou tentando dizer.



A dosagem das 19:58 não será feita pois, a condição 1 é atendida quando contador1 é igual a 20 e o programa para de ler o arquivo das horas.

Grato.
Fernando Garcia

EDIT: A imagem ficou um pouco espremida mas, se olharem a URL (http://farm9.staticflickr.com/8070/8...e6873daf_b.jpg) dá para ver melhor. Só apertar o CTRL +.

----------


## Fernando Garcia

> Existe ainda outra hipotese qt a isso, é colocar o segundo.
> 
> Mesmo que seja sempre 0, mas tem que fazer match em hora, minuto e segundo.


Colocar os segundos acho que complica mais pois, tenho "delays". Se por acaso a condição dos segundos for atendida durante um delay de uma outra função a dosagem não será feita.

Para evitar mais de uma dosagem no mesmo minuto estou usando a função "millis".

Grato.

----------


## Pedro Ferrer

Boa noite

Hum... já percebi, e seguindo a ideia do João, caso usasses o segundo...(HH:MM:SS) terias isso resolvido...
Eu, ao contrário de vocês, não uso esse tipo de tratamento de horas...(tipo militar... ou parecido...)... uso sempre horas decimais... bem sei que uso mais recursos... mas neste caso até te daria jeito...
Bom, mas como não usas assim, se criares uma coluna 'segundos', no seguimento da colunas 'horas' e 'minutos', terias isso resolvido... mas aí terias outro problema, pois suponho que abras o ficheiro no cartão SD de minuto a minuto... e não de segundo a segundo...

Bom, criando uma variável de HoraBomba1_old e outra MinutoBomba1_old, conseguirias controlar se o doseamento obtido pela tua condição de pesquisa no ficheiro tinha sido efectuado ou não...
Ex:


MinutoBomba1_old=1;
MinutoActual=58;

if (HoraBomba1_old == 19 && MinutoBomba1_old != MinutoActual ){
   MoveNext_Recordset();
   MinutoBomba1_old = MinutoActual;
   ActualizaBombas(Bomba1);
}

(...)

if (HoraActual != HoraBomba1_old){
   HoraBomba1_old = HoraActual ;
}

Bla bla bla...

É natural que exista falhas no meu raciocínio, que com certeza serão devidamente filtradas...  :Smile: 

Abraço
Pedro Ferrer

----------


## Rui Manuel Gaspar

> Colocar os segundos acho que complica mais pois, tenho "delays". Se por acaso a condição dos segundos for atendida durante um delay de uma outra função a dosagem não será feita.
> 
> Para evitar mais de uma dosagem no mesmo minuto estou usando a função "millis".
> 
> Grato.


.


Boas, 

basta uma variável booleana ou estou a ver mal a coisa. Se no minuto dosea ... e variavel = true. Se no minuto a seguir variavel = false ...

É assim que eu tenho para não calcular a posição do sol várias vezes no mesmo segundo ...

Outra coisa que nunca percebi no teu código Fernando. Porque raio usas delays????? Não tenho um único no meu programa e não vejo absoluta necessidade de usar um.

Abraços,
Rui

----------


## JoaoCAlves

Pois, isso não ajuda e é contornavel.

Fernando, mete um millis no inicio do loop e faz a diferênça e escreve no sdcard. Para ver qt tempo leva o teu loop e variações.

----------


## Pedro Ferrer

> É assim que eu tenho para não calcular a posição do sol várias vezes no mesmo segundo ...


Cada cabeça, sua sentença...




> uint8_t mSegundos;
> mSegundos=rtc[SEGUNDOS];
> 
> if (mSegundos != SegundosOld){
>     SegundosOld = mSegundos;
>     GestaoBombas(rtc[ANO],rtc[MES],rtc[DIAMES],rtc[HORAS],rtc[MINUTOS],rtc[SEGUNDOS]);
> }


Simples...

----------


## Fernando Garcia

Olá!

Obrigado pelas respostas.

Acrescentar os segundos da forma como o programa está escrito não vai adiantar pois, os segundos também podem se repetir.
Além disso, a leitura das horas sempre pára quando a condição 1 for satisfeita pela primeira vez.

Vejam como ficaria o código.

http://pastebin.com/HcJLXcpn

Ainda estou tentando assimilar as sugestões do Pedro mas, ainda não enxerguei a solução.

O código com todas as alterações que fiz estão aqui: https://github.com/FernandoGarcia/Ferduino

Se puderem dar uma olhada em:

void check_dosagem_automatica_1()
void check_dosagem_automatica_2()
void check_dosagem_automatica_3()

Com a adição do código das dosadoras o código aumentou quase 20 KB pois, todo o código se repete 3 vezes.
Quando concluir o código vou começar a procurar meios de otimizá-lo.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

> .
> 
> 
> Boas, 
> 
> basta uma variável booleana ou estou a ver mal a coisa. Se no minuto dosea ... e variavel = true. Se no minuto a seguir variavel = false ...
> 
> É assim que eu tenho para não calcular a posição do sol várias vezes no mesmo segundo ...
> 
> ...


Olá!
Este foi um problema que relatei no post #537 (http://www.reefforum.net/showthread....l=1#post198840).
Se der uma olhada neste "datasheet" (http://atlas-scientific.com/_files/EC_Circuit_3.0.pdf) na página 7 verá que o tempo que leva entre enviar o comando de leitura para um "stamp" e receber sua resposta é de aproximadamente 1 segundo.
Como tenho 4 "stamps" tenho um delay de 4 segundos/minuto.
Se reparar no vídeo da senha de acesso que postei anteriormente, em dois momentos tive que esperar a leitura dos "stamps" para continuar.
Isso é extremamente irritante.

Os demais "delays" só acontecem durante a calibração das dosadoras ou na dosagem manual mas, isso pode-se remover usando o "millis".

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Mas não precisas de fazer delay.

Mete um millis e compara com 1000. Após ter passado 1000, l~es o valor que o stamp retornou.

Mas assim, não paras o micro naquele sitio.

----------


## Fernando Garcia

> Mas não precisas de fazer delay.
> 
> Mete um millis e compara com 1000. Após ter passado 1000, l~es o valor que o stamp retornou.
> 
> Mas assim, não paras o micro naquele sitio.


Olá!

Já tentei usar o "millis" mas, não deu certo.

Veja o código que escrevi:

http://pastebin.com/gMgz5h0Q

Abraço.
Fernando Garcia

----------


## JoaoCAlves

a condição no if escrever==2 3 ou 4, onde é colocada? pelo que vejo, aí nunca vais ter match!




Edit:Já vi ignora

----------


## JoaoCAlves

Não pdoes fazer isto dentro da função:

int i;
unsigned long millis_agora = millis();
unsigned long millis_agora_1 = millis();
unsigned long millis_agora_2 = millis();
unsigned long millis_agora_3 = millis();
unsigned long millis_agora_4 = millis();
int ler;
int escrever;
int pausa;

Sempre que entras na função, actualizas os millis de cada var!

----------


## Fernando Garcia

Olá!

Agora não entendi.

Que eu saiba não posso atualizar o "millis_antes_1".

fora do "if (millis_agora - millis_antes > 60000)"

Abraço.

----------


## JoaoCAlves

Não é isso, qd declaras as var "millis_agora_1" até 4 e igualas a millis() dentro da função, tás a fazer isto cada vez que ele entra na função. Essa vars t~em que ser globais e não locais, tens que a declarar no inicio do prog, não na função.

----------


## Fernando Garcia

Está da mesma forma que o restante do código.

Veja o loop() do Ferduino no Github.

Este código está do mesmo jeito.

http://arduino.cc/playground/Code/St...rceblock&num=1

Abraço.

----------


## JoaoCAlves

Mas, não tou a perceber onde nesse código definem as vars dentro de funções. Em todo o caso, cada caso é um caso. Para a tua questão, parece-me que o que te indiquei é pelo menos parte do prob.  :Wink:

----------


## Fernando Garcia

> Mas, não tou a perceber onde nesse código definem as vars dentro de funções. Em todo o caso, cada caso é um caso. Para a tua questão, parece-me que o que te indiquei é pelo menos parte do prob.


Completei o código, veja se te ajuda a me ajudar.

http://pastebin.com/gMgz5h0Q

As respostas que obtenho são:

Ler PHA:
60001
ler = 1
61001
Ler PHA:
120002
ler = 1
122002

Edit: achei um erro.

Abraço.

----------


## JoaoCAlves

Bem, não tou a conseguir perceber o código, não tenho stamps, não sei como funcam. Sorry.

Não percebo por exemplo, pq fazes o 1º if a comparar com 60000, e depois fazes mais 61000, 62000 etc. Eu faria isso tudo de uma vez.

Queres medir de minuto a minuto, ok, o 1º if com 60000, e depois mandava os comandos a todos os stamps.

Dizes que tens que esperar 1s para voltar a ler, tudo bem.

No processo anteriror, no fim guardas o millis.

Executas depois a função de leitura 1s depois, só tens que ir comparando o millis com o valor anterior.

ok?

----------


## Fernando Garcia

Olá!

João, obrigado pela sua paciência de ficar olhando o meu código.

Se eu enviar os comandos de leitura em sequência aparentemente os dados se perdem no multiplexador.

Ainda estou tentando achar os erros.

No momento consigo essas respostas:

PHA:7.80
Ler PHR:
61101
ler = 2

Agora não sei porque não passa por esta condição: 

if((Serial3.available()) && (ler == 2))

Abraço.

----------


## JoaoCAlves

vê mo que te devolve o Serial3.available()

----------


## Baltasar Parreira

Bem metendo a colher assim mesmo sem olhar para qualquer código feito, pois para mim pelo que ouço parece-me uma "aproach" do mais errado possível e desnecessária eheheh... sendo assim pessoal volto a falar em timers, com timers isso tudo se resolve.

Pores um timer de X em x minutos ou o tempo que quiseres. cada leitura que fazes guardas no array de exemplo 5 posições e por cada leitura metes no índice 0 e empurras para fora a ultima posição (a leitura mais velha) depois no ecrã ou quando precises de mostrar valores fazes sempre a media das 5 ou as leituras que tiveres/quiseres e assim tens sempre em qualquer altura o valor mais correcto em função do intervalo de tempo dessas X leituras.

Acabam-se os delays pois só da chatice e param execução de código deixando certas tarefas presas sem se conseguir fazer mais nada durante essas operações.

----------


## Fernando Garcia

Olá!

Obrigado por todas as sugestões.

A melhor forma que encontrei para ler os "stamps" sem usar os grandes "delays" foi separando as leituras.

Já atualizei o código.

http://pastebin.com/gMgz5h0Q

Agora estou testando a estabilidade dele juntamente com o Ferduino.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

E o resultado dos testes é:

Leituras instáveis.

Mudando um pouco de assunto...

Antes do laçamento da IDE 1.0.2, sempre que eu queria fazer um upload do programa eu tinha que enviar o programa uma vez;
Esperar que o arduino apagasse o programa anterior;
Desligar o cabo usb e fazer o upload novamente.

Agora com a IDE 1.0.2 esse problema foi corrigido.

Fica a dica para quem sofre com este problema.

Abraço.

Fernando Garcia

----------


## Baltasar Parreira

Boas, o problema do IDE deve-se ou a Megas com bootloader (e quando refiro bootlaoder não o do chip Atmega, mas o responsável pela ligação USB) velho ou no Avrdude tool, eu pura e simplesmente apanhei o Avrdude do IDE anterior 023 e desapareceu esse problema, mais tarde noutro Mega fiz update do bootloader para uma versão mais recente e também resolveu.

Quanto ao problema das leituras continuo sem perceber para que tanta complicação aquilo e uma simples leitura serial do mais básico, mesmo usando multiplex para endereçar mais que um stamp no mesmo port serial.
Alguém que opine mas vejam bem o exemplo do stamp PH por exemplo para perceberem o básico mesmo que é: http://atlas-scientific.com/_files/c...ode-EZ-COM.pdf


No Mega nem precisas de usar SoftSerail pois ele tem ports serial por hardware adicionais que se podem usar para alem do vulgar por onde é feito o upload de código.

----------


## Fernando Garcia

Olá!

O programa para ler os "stamps" é realmente simples.

Acabo de enviar um exemplo para o Github.

O ponto crítico do programa é este:

    Serial3.print("r");
    Serial3.print('\r');
    delay(1100);

Ainda não consegui fazer o programa funcionar sem esse "delay".

Abraço.

----------


## Baltasar Parreira

Fernando nao estou a perceber para que estas a mandar a letra "r" e muito menos um cariage return logo depois?

Podes explicar?

----------


## Fernando Garcia

Olá!

Dê uma olhada nas páginas 5 e 6 deste "datasheet" (http://atlas-scientific.com/_files/pH_Stamp_4.0.pdf).

Na página 5 diz:

"All commands must be followed by a carriage return <CR>."

O "r" é o comando para que o "stamp" responda com apenas uma leitura.

Abraço.

----------


## Baltasar Parreira

Sim eu sei, quando me refiro não percebo é porque o stamp trabalha sozinho e esta sempre a fazer leituras para ele mesmo, logo não precisas disso para nada, só tens na altura que queres,ler dele os últimos dados e não precisas de lhe enviar comando nenhum, pura e simplesmente ouvir o que ele te diz ate ao CR e tens uma string de parâmetros recentes, depois tratas isso como bem queres e ele continua na sua leitura constante não interferindo em anda com o Arduino etc.

----------


## Fernando Garcia

Olá!

Bom, meu conhecimento de programação é muito limitado como vocês já sabem.

Vou tentar explicar qual o problema que vejo em enviar um comando de leitura continua para os "stamps".

Imagino que se todos os "stamps" estiverem enviando dados ao mesmo tempo para a porta serial 3.
Eles vão se acumulando  e no momento de ler a porta serial, não vou saber qual o "stamp" que enviou a informação disponível naquele momento.
Se eu não tivesse 2 circuitos de PH talvez fosse mais fácil.

Algo deste tipo:

    if(Serial3.available() > 3) 
    {
      holding = Serial3.available();
      for(i=1; i <= holding; i++)
      {
        sensorstring[i]= Serial3.read();
      }

      if(holding ==5)
      {
        valor = (((sensorstring[1]-48)*100 + (sensorstring[3]-48)*10 + (sensorstring[4]-48))/100);
      }
      if(holding ==6)
      {
        valor = (((sensorstring[1]-48)*1000 + (sensorstring[2]-48)*100 +(sensorstring[4]-48)*10 + (sensorstring[5]-48))/10);
      }
      if(holding == 7)
      {
        valor = (((sensorstring[1]-48)*10000 + (sensorstring[2]-48)*1000 +(sensorstring[3]-48)*100 + (sensorstring[5]-48)*10 + (sensorstring[6]-48))/100);
      }

      if(valor <= 15)
      {
        PH = valor;
      }
      if(valor > 15 )
      {
        ORP = valor;
      }
    }

No caso da leitura do circuito de EC o tratamento teria que ser outro. Já que a resposta do "stamp" contém 3 tipos de informação.

Aqui um esquema da ligação dos circuitos.



Abraço.
Fernando Garcia

----------


## Baltasar Parreira

Não interessa Fernando, pois eles ao estarem a trabalhar sozinhos estão a acumular essa informação e mandam para o espaço ou nada se assim me faço entender, ao seleccionares no múltiplos o canal que queres só vais ler no serial a info do stamp seleccionado independente que haja mais 1000 que seja a trabalhar, só tens de recolheres esses dados que sabes de que stamp vem e tratar de acordo com o que pretenderes ou pura e simplesmente guardar em VAR ou ARRAY para quando precisares de usar a info processares isso.

Imagina o seguinte tens 3 ou mais baldes de tinta de N cores com torneiras a e ligação de todos por mangueiras para dentro de um grande reservatório, as tintas estão sempre a queres sair pela torneira, certo? mas só quando abres uma certa vais ter essa cor no reservatório grande e nunca nada de outras desde que não abras mais que uma torneira ao mesmo tempo.

Revê isso tudo bem e usa o código básico de leitura que deixas de ter problemas e precisar de delays.

----------


## Fernando Garcia

Olá!

já entendi o que você quer dizer.

Algo do tipo:

const int multiplexPIN1 = A14; // S0
const int multiplexPIN2 = A15; //S1

void setup()
{
  pinMode(multiplexPIN1, OUTPUT);
  pinMode(multiplexPIN2, OUTPUT);
    digitalWrite(multiplexPIN1, LOW);
    digitalWrite(multiplexPIN2, LOW);

  Serial3.print("c");
  Serial3.print('\r');
}

Void loop()
{

  while (Serial3.available()) 
{                                         
         char inchar = (char)Serial3.read();                              
         sensorstring += inchar;                                              

 if (inchar == '\r') 
{
Serial.print(sensorstring);
 Serial.println("");
}                  
}
}

Agora a questão é:

Como converto *sensorstring* em um float ou int sempre que *inchar* for igual a * '\r'* ?

Também neste caso dá para colocar um contador e um somador para depois fazer a média  de x em x valores. Pode dar um exemplo?

Abraço.
Fernando Garcia

----------


## Baltasar Parreira

Hummm, mas para quê usar floats? Vais fazer contas com isso ou é só para visualização e informação, neste caso apresentas a string que recebes ou parte dela. Se fores calcular medias ou algo retiras da string o valor que queres e fazes um CAST para transformar e depositar numa var float o valor, algo tipo:

float myPHval = (float)partOfMyStringVar; 

Se bem como disse eu ia guardando as ultimas 5 leituras no array e a cada nova leitura deitando fora a mais velha, mas isso só procurando como se faz um array push/move de posições em C++ ehehe, não me lembro bem como.

----------


## Hugo Figueiredo

Viva Fernando!
Tens o código em algum lado?

Gostava de experimentar!!! :tutasla:

----------


## Fernando Garcia

> Hummm, mas para quê usar floats? Vais fazer contas com isso ou é só para visualização e informação, neste caso apresentas a string que recebes ou parte dela. Se fores calcular medias ou algo retiras da string o valor que queres e fazes um CAST para transformar e depositar numa var float o valor, algo tipo:
> 
> float myPHval = (float)partOfMyStringVar; 
> 
> Se bem como disse eu ia guardando as ultimas 5 leituras no array e a cada nova leitura deitando fora a mais velha, mas isso só procurando como se faz um array push/move de posições em C++ ehehe, não me lembro bem como.


Olá!

As valores são utilizados em outras funções.

Abraço.

----------


## Fernando Garcia

> Viva Fernando!
> Tens o código em algum lado?
> 
> Gostava de experimentar!!!


Olá!

https://github.com/FernandoGarcia/Ferduino

Abraço.

----------


## Fernando Garcia

Olá!

Depois de muita luta e com base na sugestão do Baltasar consegui remover os "delays" da leitura dos "stamps".

Como eu imagina os primeiros valores se misturam na porta serial.

A solução foi ler todos os valores e depois descartar as primeiras leituras desta forma:

    for(int i= 12;i <=19; i++)
    {
      float_valor_1 += atof(inParse[i]);
    }
    float_valor_1 /= 8;

Em compensação consegui fazer uma média de 8 leituras.

Aqui tem o código completo:

https://raw.github.com/FernandoGarci...tiplexador.txt

Neste código tive que criar duas matrizes de 150 bytes cada e agora meu arduino só tem cerca de 288 bytes livres de memória ram.  :Icon Cry: 

Agora vou voltar a mexer com o código da dosagem.

Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Bom dia




> Neste código tive que criar duas matrizes de 150 bytes cada e agora meu arduino só tem cerca de 288 bytes livres de memória ram.


Qual o teu arduino??
288 bytes é extremamente pouco... e estás sujeito a ter problemas no ciclos 'For' ou outros por falta de memória...

O meu Arduino é o Mega 2680 e tenho mais de 2000 bytes (agora não sei ao certo)  e tenho muito código, muitas variáveis... já estive na tua situação e tive que optimizar os textos... e ganhei mais de 2000 bytes... :SbSourire19: 

Abraço
Pedro Ferrer

----------


## Fernando Garcia

Olá!

O meu é o Arduino Mega 2560.

Não sei ainda o que fazer para otimizar meu código.

Vou ter que arrumá-lo muito em breve pois, ainda nem terminei meu programa.

Talvez eu tenha que partir para uma solução como esta:

http://andybrown.me.uk/wk/2011/08/28...o-mega-design/
http://andybrown.me.uk/wk/2011/08/28...o-mega-design/
http://andybrown.me.uk/wk/2011/08/28...mega-software/

O Arduino Due também seria a solução mas, pelo visto vai demorar muito tempo para fazerem as bibliotecas que preciso.

Abraço.
Fernando Garcia

----------


## Pedro Ferrer

Bom dia

Continuo a apostar que o teu problema é nos textos da aplicação.
Parece-me que não tenhas algoritmos assim tão complexos... e a forma como usas as variáveis (foges aos floats)... isso me faz desconfiar dos textos...

Usas o PROGMEM para guardares os textos?

Abraço
Pedro Ferrer

----------


## Fernando Garcia

Olá!

Tenho poucas "Strings" no meu programa e as matrizes que tenho são pequenas.

A maior matriz que tenho (500 bytes) é usada pelo "ethernet shield" mas, já está declarada como PROGMEM.

Fiz um teste desativando as funções das dosadoras e a diferença é 1000 bytes.

Para tais funções foram usadas 232 variáveis.

O tamanho dos nomes das variáveis influenciam na quantidade de memória RAM consumida?

Aqui tem alguns nomes declarados no meu programa:

float dose_dosadora_1_personalizada = 0.0;
float dose_dosadora_2_personalizada = 0.0;
float dose_dosadora_3_personalizada = 0.0;
float dose_dosadora_1_automatica = 0.0;
float dose_dosadora_2_automatica = 0.0;
float dose_dosadora_3_automatica = 0.0;
int hora_inicial_dosagem_personalizada_1 = 0;
int minuto_inicial_dosagem_personalizada_1 = 0;
int hora_final_dosagem_personalizada_1 = 0;
int minuto_final_dosagem_personalizada_1 = 0;

Grato.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Esse fim de semana fiz um vídeo para demonstrar todas as funções que já implementei no meu controlador.
Espero que gostem.




Abraço.

----------


## Hugo Figueiredo

Fernando, a tua dedicação a este projeto é simplesmente extraordinária!!!
Os meus sinceros parabéns!!! :yb677: 

Tens algum manual ou documento que indique as ligações que fizeste a nível de arduino?
Do género: doseadora 1 ligada à portas X; temperatura ligada à porta Y, etc...

Como já tinha referido e se o permitires vou pegar neste teu código como base para o meu controlador de aquário, quando chegar a altura e o tempo de arrancar com isso!

Mais uam vez, os meus parabéns, está espetacular!!! :tutasla:

----------


## Fernando Garcia

Olá!

Obrigado Hugo.

As ligações dos equipamentos Vs pinos do Arduino podem ser conferidas no próprio código.

const int ledPinBlue = 8;     //Pino que liga os leds azuis
const int ledPinWhite = 9;    //Pino que liga os leds brancos
const int aquecedorPin = 42;   // Pino que liga o aquecedor
const int chillerPin = 43;   // Pino que liga o chiller
const int alarmPin = A13;  // Pino que aciona o alarme de temperatura da agua baixa ou alta
const int fanPin = 13;     // Pino que controla a velocidade das ventoinhas do dissipador
const int sensor1 = A0;       //Pino analogico que verifica se ha tensao na boia da quarentena.
const int sensor2 = A1;       //Pino analogico que verifica se ha tensao na boia inferior do sump.
const int sensor3 = A2;       //Pino analogico que verifica se ha tensao na boia superior do sump.
const int sensor4 = A3;       //Pino analogico que verifica se ha tensao na boia inferior do reservatório.
const int sensor5 = A4;       //Pino analogico que verifica o nivel do reef.
const int sensor6 = A5;       //Pino analogico que verifica o nivel do fish only.
const int bomba1Pin = A9;    // Bomba que tira agua da quarentena.
const int bomba2Pin = A10;    // Bomba que tira agua do sump.
const int bomba3Pin = A11;    // Bomba que coloca água no sump.
const int solenoide1Pin = 48; // Liga a reposicao de agua doce.
const int reatorPin = 49;     // Pino que liga o CO2 do reator.
const int ozonizadorPin = A12; // pino que liga o zonizador
const int multiplexadorS0Pin = A14; // Pino S0 de controle dos stamps
const int multiplexadorS1Pin = A15; // Pino S1 de controle dos stamps
const int dosadora1 = 10;     // Bomba dosadora 1
const int dosadora2 = 11;     // Bomba dosadora 2
const int dosadora3 = 12;     // Bomba dosadora 3

Alguns circuitos de interface estão na pasta "circuitos auxiliares".

Logo vou montar um manual para o meu controlador.

Abraço.

----------


## Hugo Figueiredo

Fantástico!!! :Olá:

----------


## Fernando Garcia

> Fantástico!!!


Obrigado!

----------


## Fernando Garcia

Olá!

Alguns dias atrás falei sobre o lançamento da nova biblioteca do Henning e agora ela já está disponível para "download".

http://henningkarlsen.com/electronics/index.php

Infelizmente as biliotecas antigas foram removidas.

Aqui um vídeo mostrando o desempenho do Ferduino com a nova biblioteca.




Abraço.

----------


## Fernando Garcia

Olá!

Pessoal, já consegui resolver o problema.

Ao invés de gravar dois arquivos de texto (um com as horas e outro com os minutos) , optei por gravar somente um com o horário de dosagem transformado em minutos.

Exemplos:

Dosagem às 19:01

O valor gravado no TXT foi: (19 * 60) + 01 = 1141.

Dosagem às 20:55

O valor gravado no TXT foi: (20 * 60) + 55 = 1255.

Dessa forma nunca terei números repetidos.

E no momento da verificação 

Fiz assim:

t = rtc.getTime();

int minutos_agora = (t.hour * 60) + t.min;

file.open(&root, "HDA1.TXT", O_READ);

while ((n = file.read(buf, sizeof(buf))) > 0)
{
minuto01 = atoi(buf);

if(minuto01 == minutos_agora)
{
Serial.println("Dosando 1:");

Serial.println(rtc.getTimeStr(FORMAT_LONG));
}
}
file.close();

Obrigado pelas sugestões.

Abraço.

----------


## Fernando Garcia

Olá!

O código das dosadoras está concluído.

Já coloquei no Guithub.

Também dividi o programa em vários arquivos, acho que ficou mais fácil de encontrar um trecho de código para fazer uma modificação.

Próximo passo, colocar código para o PCF8575.

https://www.sparkfun.com/products/8130?

Já tenho o circuito faltam os pinos.

Encontrei uma biblioteca mas, não sei se funciona.

http://skyduino.wordpress.com/librai...f8574-pcf8575/

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas.

Fogo, os pinos do mega não te chegam??? Grande abuso esse programa!  :Wink:

----------


## Fernando Garcia

Olá!
Faz tempo que tenho poucos pinos disponíveis.

Tenho apenas este pinos livres [PWM (7,44,45,46) TX/RX(14,15,18,19) ANALÓGICO(A6, A7, A8)].
Inclusive se reparar uns 3 posts atrás, estou usando pinos analógicos como "output".

Abraço.

----------


## Fernando Garcia

Olá!

Enquanto não compro os pinos do PCF estou inventando mais algumas coisas.

Desta vez criei mais 2 menus.

Este serve para desabilitar todas as dosagens. Da forma como estava escrito ou tinha a dosagem do modo personalizado ou a do modo automático.
Agora dá para não ter dosagens.





Este é para configurar a iluminação mínima e máxima da luz noturna.



Lá se foi mais um pino...  :SbSourire: 

Outra coisa que estou providenciando é o sistema que mede o consumo de energia elétrica de todo o aquário e mostra o valor à ser pago.

Abraço.
Fernando Garcia

----------


## Baltasar Parreira

Fernando, atenção que se queres um rigor mais real, existe dias de lua nova conforme a altura do calendário em que a lua não tem qualquer luz, ou seja 0% mesmo.

----------


## Fernando Garcia

> Fernando, atenção que se queres um rigor mais real, existe dias de lua nova conforme a altura do calendário em que a lua não tem qualquer luz, ou seja 0% mesmo.


Olá Baltasar!

Por acaso hoje é um dia que a lua está/estará com 0 % de iluminação.



Não sei se é interessante deixar o aquário totalmente sem luz.

Da forma como o programa está escrito ele nunca ficará totalmente sem luz.

Veja a equação:

PWM_ luz_noturna = (iluminação_minima *(1 - ciclo_lunar)) + (iluminação_máxima * ciclo_lunar) + 0.5; 

No caso dos valores da foto anterior o PWM seria:

PWM_ luz_noturna = (40 *(1 - 0.00)) + (255 * 0.00) + 0.5; 

PWM_ luz_noturna = 40 + 0.5

PWM_ luz_noturna = 40.5.


Abraço.
Fernando Garcia

----------


## JoaoCAlves

Boas Fernando, para recriares realmente o ciclo da lua, tens que contar com os 0%.

Por isso, acho que faz sentido sim, ajustares o máximo de luz com lua (que será o minimo do ciclo do dia para esse canal), mas o minimo, deverá poder ser 0%.  :Wink:

----------


## Fernando Garcia

Olá!

Sendo assim fica ao gosto do freguês.

A palavra NUNCA foi mal colocada no post anterior.

É só setar o PWM mínimo em 0.

O resultado será 0.5 PWM, e o programa provávelmente vai arredondar para baixo.  :SbOk: 


E como andam os testes com o Arduino Due? Vi que vocês criaram muitos tópicos no arduino.cc.

Abraço.
Fernando GArcia

----------


## JoaoCAlves

O UTFT já bumba à bastante tempo.

Já temos a nova SDFATLIB a bumbar tb.

Mesmo a 14MHZ no SPI, a demo do slideshow do henning carrega cada imagem em 370ms.

A 42Mhz (com um sdcard reader directo ao header do SPI do DUE), estou a carregar as fotos em 295ms!!!!

A lib é brutal mesmo!

Estou a finalizar a função para gravar as configs no SDcard e acabar com a história da eeprom. Depois disto, vou continuar o meu prog em Due mesmo!

----------


## Fernando Garcia

Olá!

Pelo que entendi não foi o Henning que adaptou a biblioteca.
Vocês enviaram as modificações para que ele coloque na biblioteca oficial?

Vi que o desenvolvedor da SDFATLIB reclamou do desempenho da SPI, mas 370 ms é muito bom.

Quanto ao descarte da EEPROM.h  acho que é possível.

Eu me enrolo um pouco com a questão das transformações ASCII, decimal, char e etc.

Para conseguir ler os valores das configurações da dosadora tive que criar alguns artifícios na hora da gravação.



Para conseguir ler os valores eu tive que determinar quantos caracteres seriam gravados para depois poder usar a função ATOI ou ATOF.

Um membro (Oleg_il) de um fórum russo modificou o Jarduino e criou funções de restauração e backup das configurações do controlador.

As informações são guardadas num TXT e quando necessário são copiadas para a EEPROM novamente.

No seu caso ao invés de salvar na EEPROM era só atribuir os valores para as respectivas variáveis, toda vez que o Arduino reiniciar.

Não entendi muito bem como ele fez o código. Ele não usou os mesmos artifícios que eu.

Se quiser dar uma olhada :

http://www.aqualogo.ru/phpbb2/index....=29878&st=1180

http://www.aqualogo.ru/phpbb2/index....post&id=127775

Se eu for fazer isso meu código vai ficar quilométrico (já tem 11.000 linhas).

Abraço.

----------


## JoaoCAlves

Pois, mas é isso mesmo que quero evitar.

Eu quero uma função dinamica, que me procure a variavel num ficheiro e escreva o valor, tenha lá o tamanho que tiver. O mesmo para ler.

Por exemplo, isto que tá feito, é facil, se defenires que as strings são sempre 6 carateres, mas se quiseres gravar strings de tamanho variavel, complica.

Deixa espreitar o que esse homem andou a fazer.

Qt à UTFT, sim, fui eu e o Baltasar que andámos à cabeçada para meter aquilo a bumbar no due mantendo o pinout do mega, e por isso colocamos 2 posts com bugs pq  as funções originais do henning não funcavam por causa de erros nas macros no arduino.h.

Ele já tem com ele as alterações, mas não vai fazer nada enquanto não tiver hardware para testar. Até é possivel que ele altere alguma coisa depois.

Mas com comandos de escrita directa nos ports conseguimos uma boa velocidade de comunicação com o TFT. A UTFT_demo, corre no meu caso em 32s. O meu TFT é o ITDB32WD. No caso do baltasar, o TFT dele é o WC (mais antigo), mas curiosamente, obtem melhores tempos com o mesmo código. Suspeitamos que tenha a ver com o chip do TFT ser diferente.

----------


## JoaoCAlves

Pois, ok, o que ele faz é apagar o ficheiro e criar um novo.

Eu estou mesmo a tentar editar o ficheiro, ou seja abrir, procurar a var, e escrever o valor somente, e fechar.
Claro que estou a falar de um unico ficheiro de configuração que vai ter tudo, mesmo tudo o que guardaria na eeprom.

A mesma função vai fazer a leitura e a escrita, conforme os parametros passados.

Mas ainda tou com problemas, ainda não tá a bumbar.  :Wink:

----------


## Fernando Garcia

Aqui tem o trecho que me referi.



No lugar disto:

EEPROM.write(i, Result);

Poderia fazer um "FOR" e armazenar os valores em uma matriz.

Depois dizia por exemplo que a variável temperatura era a posição "x" desta matriz.

Poderia separar os floats dos int e usar ATOI ou ATOF se necessário.

Tudo isso sendo feito no Void setup();

Quando alterar algum valor, deleta o arquivo e o reescreve novamente.


Abraço.

----------


## JoaoCAlves

Sim claro, isso é uma forma de fazer, basicamente, como é feito com a eeprom. Mas o SDcard permite mais versatilidade, e quero tirar proveito disso.  :Wink:

----------


## António Vitor

Já estás a usar este João? Due?

http://hackaday.com/2012/10/03/final...wered-arduino/

----------


## António Vitor

E este não seria possivel?
http://beagleboard.org/

----------


## António Vitor

http://beaglebone.cameon.net/home/using-pwm-outputs tem 8 portos pwm... E metendo linux e algum software no linux seria bem mais simples, afinal é um computador normal... Estou tentado a fazer isto no meu proximo projecto leds' que só será realidade daqui a uns 2 anos
já a maior parte dos leds terão 5 anos na altura...

----------


## António Vitor

algumas dificuldades com o arduino seriam vencidas com hardware bem mais potente... 750 mhz... 500 mhz ARM versus 16 mhz....lol.... http://beagleboard.org/static/BONESRM_latest.pdf

http://beagleboard.org/hardware-xM este até tem saida dvi... ou seja liga-se normalmente a um lcd qualquer...
ISto é um salto qualitativo brutal ... tipo passar do xz spectrum para um pc com 3d...  :Big Grin: 
1 ghz?

Acho que o due peca por tarde e por pouca velocidade...

----------


## António Vitor

Fernando, que achas da hipótese de se usar o beagleboard nestas aventuras?
Não tenho nada contra o arduino...note-se...

http://www.wired.com/gadgetlab/2010/06/beagleboard/

----------


## Fernando Garcia

Olá!

João, acho que você vai ter que doar um Arduino Due como recompensa pela propaganda que o Henning fez do seu site.  :yb665: 

"To everyone asking about UTFT and Arduino Due:
I will most likely add support for the Arduino Due, but to do so requires me to have an Arduino Due for testing. As I cannot afford to buy one at the moment you will have to wait until I can afford it (or someone donates one  :Smile:  )."


"As the currect version of ITeads ITDB02 Mega shield no longer has an on-board DS1307 I highly recommend that you take a look at the Arduino Mega / Chipkit MAX32 Screw Shield with TFT and RTC from AquaLEDsource for a "easy-to-use" shield for this project. Links to their English and Portuguese webshops can also be found on the Links page."

Abraço.

----------


## Fernando Garcia

> Fernando, que achas da hipótese de se usar o beagleboard nestas aventuras?
> Não tenho nada contra o arduino...note-se...
> 
> http://www.wired.com/gadgetlab/2010/06/beagleboard/


Antônio, eu gostaria muito de usar uma placa com mais recursos mas, infelizmente meus conhecimentos de programação são muito limitados.

Além disso, meu objetivo é possibilitar pessoas leigas (hoje sou um pouco menos do que era quando comecei) a montarem seus próprios controladores.

A plataforma Arduino é bem difundida no mundo e possui linguagem relativamente simples.

Podemos encontrar milhares de exemplos pela internet que nos ajuda a criar nossos próprios códigos.

Também existe um outro fator importante que é o custo, essa placa que sugeriu custa 5 x mais que um Mega 2560.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Fica aqui uma dica para as pessoas que querem criar seus próprios tipos de fontes.

http://www.mikroe.com/glcd-font-creator/

O programa é relativamente simples.

Uma detalhe importante é que é necessário espelhar todos os caracteres após criá-los.

No site do Henning tem a explicação de como ele criou as fontes usadas em suas bibliotecas.

http://henningkarlsen.com/electronic..._fonts_101.php

Abraço.

Fernando Garcia

----------


## dugsseafdausy

buy cymbalta online no prescription  purchase cymbalta online order cipro no prescription  buy cipro cheap purchase clomid online  buy clomid cheap buy lasix cheap  buy lasix cheap

----------


## JoaoCAlves

> Já estás a usar este João? Due?
> 
> http://hackaday.com/2012/10/03/final...wered-arduino/


Yep! recomendo!!!




> E este não seria possivel?
> http://beagleboard.org/



Boas António, sim deve ser possvel claro, não há razão para não o ser. Mas agora era quase começar do zero, e o due faz tudo o que precisas!

----------


## JoaoCAlves

> Olá!
> 
> João, acho que você vai ter que doar um Arduino Due como recompensa pela propaganda que o Henning fez do seu site. 
> 
> "To everyone asking about UTFT and Arduino Due:
> I will most likely add support for the Arduino Due, but to do so requires me to have an Arduino Due for testing. As I cannot afford to buy one at the moment you will have to wait until I can afford it (or someone donates one  )."
> 
> 
> "As the currect version of ITeads ITDB02 Mega shield no longer has an on-board DS1307 I highly recommend that you take a look at the Arduino Mega / Chipkit MAX32 Screw Shield with TFT and RTC from AquaLEDsource for a "easy-to-use" shield for this project. Links to their English and Portuguese webshops can also be found on the Links page."
> ...


 :yb624:   :SbOk5: 

O novo programa do clock já contempla o shield, é só activar um define. Pelo que falei com ele, as proximas livrarias do UTFT tb virão já prontas para funcionar com o shield, por enquanto, é preciso mudar um Port de dados e o touch no caso do chipkit, e o touch para os arduino. Mas nada de complciado, e ficas com tudo arrumadinho!!  :Wink: 

Abraço

----------


## Fernando Garcia

> buy cymbalta online no prescription  purchase cymbalta online order cipro no prescription  buy cipro cheap purchase clomid online  buy clomid cheap buy lasix cheap  buy lasix cheap


Tem alguém precisando de remédio para depressão?

Espero que não.

Algum moderador poderia excluir a conta dessa pessoa que só entrou aqui para distribuir SPAM.

Aliás, não entendi nada do que ela escreveu.

Seria uma tradução mal feita?

----------


## Fernando Garcia

> O novo programa do clock já contempla o shield, é só activar um define. Pelo que falei com ele, as proximas livrarias do UTFT tb virão já prontas para funcionar com o shield, por enquanto, é preciso mudar um Port de dados e o touch no caso do chipkit, e o touch para os arduino. Mas nada de complciado, e ficas com tudo arrumadinho!! 
> 
> Abraço


Eu vi o código.

Agora só precisa encontrar um fabricante na China para poder baixar o preço.

O preço está mais salgado que a água do aquário (como falamos por aqui).

Abraço.

----------


## JoaoCAlves

Parece salgado eu sei, mas não é. Os chips são caros, e os terminais então...

----------


## Fernando Garcia

Olá!

Hoje o meu post é "globalizado".

A pedido do Lucian Brandabur da Romênia eu acrescentei uma nova função ao Ferduino.

Agora ele tem 5 temporizadores.

Aqui estão as imagens dos menus:





E lá se foram mais 5 pinos.  :yb665: 

O design dos menus foi inspirado no Sebduino desenvolvido pelo pessoal de um fórum Francês.

http://www.ilot-recif.fr/viewtopic.php?f=12&t=3012

Aproveito para agradecer ao meu amigo Vadim da Ucrânia que me enviou o código.

Aqui tem a imagem do menu do Sebduino a diferença para o original é que está em Russo + Inglês e não em Francês.  :yb624: 






Bom seria se todos falassem a mesma língua assim eu não usaria tanto o Google tradutor. :Cool: 


E mais uma vez, Viva ao código aberto!

Abraço.

----------


## Hugo Figueiredo

Fernando, o link do seu projeto paree estar quebrado...

----------


## Fernando Garcia

Olá!

Eu deletei aquele arquivo.

Pode encontrar os arquivos aqui: https://github.com/FernandoGarcia

Pode escolher entre Português, Francês ou Inglês.

As traduções ainda não estão completas.

Elas estão sendo feitas pelos meus amigos Lucas Denis da França e pelo Lucian Brandabur da Romênia.

Abraço.
Fernando Garcia

----------


## Hugo Figueiredo

Obrigado!

Se precisares de alguma ajuda no Inlês, diz!

----------


## Fernando Garcia

> Obrigado!
> 
> Se precisares de alguma ajuda no Inlês, diz!


Obrigado Hugo.

----------


## Fernando Garcia

Olá!

Já montei o circuito com o PCF8575, mas estou com 2 problemas.

O primeiro é que o RTC não funciona junto com ele.

Já verifiquei os endereços e são diferentes.

RTC = 0x68
PCF8575 = 0x20

Usando o código do link abaixo os leds piscam conforme o programa, mas o horário informado é sempre : 27:85:85

https://gist.github.com/21dfdc057cfbd1cc44a9

Neste mesmo código se eu comentar as funções refentes ao PCF8575 o RTC informa o horário correto.

O segundo problema é que o PCF8575 está fornecendo entre 1,6 e 2,6 volts na saída.

Já refiz as soldas e continua a mesma coisa.

Alguma sugestão para estes problemas?


Grato.
Fernando Garcia

----------


## JoaoCAlves

Boas.

"
    Low Standby-Current Consumption of 10 µA Max
    I2C to Parallel-Port Expander
    Open-Drain Interrupt Output
    Compatible With Most Microcontrollers
    400-kHz Fast I2C Bus
*Address by Three Hardware Address Pins for Use of up to Eight Devices*
    Latched Outputs With High-Current Drive Capability for Directly Driving LEDs
    Current Source to VCC for Actively Drivinga High at the Output
    Latch-Up Performance Exceeds 100 mA Per JESD 78, Class II
    ESD Protection Exceeds JESD 22
        2000-V Human-Body Model (A114-A)
        200-V Machine Model (A115-A)
        1000-V Charged-Device Model (C101)
"

Esse 0x20, foi o que defenis-te com recurso as estes 3 pinos?

Vê a pagina 5 deste doc. 

Ligas-te os pinos A0 a A2 à massa?

----------


## Fernando Garcia

> Boas.
> 
> "
>     Low Standby-Current Consumption of 10 µA Max
>     I2C to Parallel-Port Expander
>     Open-Drain Interrupt Output
>     Compatible With Most Microcontrollers
>     400-kHz Fast I2C Bus
> *Address by Three Hardware Address Pins for Use of up to Eight Devices*
> ...


Olá!

Obrigado pela resposta.

Os 3 pinos são SDA, SCL e INT o endereço 0x20 corresponde a SDA e SCL.

O INT não vou usar. Ele requer apenas um input LOW ou HIGH. 

Comprei o circuito montado na Sparkfun.

Aqui uma foto.



A0 - A2 são conectados ao VCC. Na página 9 do link que me mostrou diz que pode ser ao VCC ou GND.

Tenho os pinos SDA e SCL ligados ao VCC com resistores de 10K Ohm.

Abraço.
Fernando Garcia

----------


## JoaoCAlves

Fernando pelas fotos que mostras, estão no ar!! (limbo)

Tens que shuntar o pino do meio a um dos lados.

Se shuntares a VCC, o endereço a usar deverá ser 0x27
Se shuntares a GND, o endereço a usar deverá ser 0x20

Abraço

----------


## Fernando Garcia

shuntar  = Soldar?

----------


## Fernando Garcia

João, você está falando dessa informação que está no site da Sparkfun.

"Board has A0-A2 with solder pads like (|). connect middle to left (power) for a 1, or right (gnd) for a 0. (see picture shown above)"

Eu vi isso, mas não entendi.

----------


## JoaoCAlves

Não, falei pelo datasheet do chip mesmo, mas pelo que dizes, eles já diziam isso no manual da sparkfun!!  :Wink: 

Sim, shuntar é unir contactos. Uma palavra puxada do inglês... "shunt"

É escolheres. o A0-A1-A2, são os 3 ultimos bits do endereço, os 3 menos sgnificativos. como só vais ligar esse agora, não importa o que escolhes. Basicamente, defines o endereço com esses pinos, e depois metes no sketch no endereço o que puseres no pcb.

----------


## Fernando Garcia

João, obrigado!

Já fiz as soldas. liguei os "pads" centrais ao VCC.

O endereço mudou para 0x27 conforme você disse.

Fiz o upload do programa novamente e os problemas persistem.

Mais alguma sugestão?

Abraço.

----------


## JoaoCAlves

Os pull-ups de 10k, baixa para 4.7K. just in case....

----------


## Fernando Garcia

Já alterei os resistores.

 A tensão na saída continua baixa e o RTC informa o horário errado.

Mais alguma sugestão?

Obrigado mais uma vez.

Abraço.

----------


## JoaoCAlves

Tensão de saída onde?

----------


## Fernando Garcia

Nos pinos P[0-7] e P[10-17].

----------


## JoaoCAlves

Mas isso é normal, se ainda não conseguis-te comunicar com o device para defenires o estado das portas, parece-me normal!

FAz aí um esquema de como tens isso ligado.  :Wink:

----------


## Fernando Garcia

Eu consigo controlar os pinos.

Eu já testei usando a biblioteca do Skywood e também com este código e ambos funcionam.

https://gist.github.com/21dfdc057cfbd1cc44a9

Abraço.

----------


## JoaoCAlves

Mas pera, então estou perdido, qual é o problema mesmo? pensava que não comunicavas com o chip!

E não estou a conseguir perceber pq falas no RTC

----------


## Fernando Garcia

Estes...




> Olá!
> 
> Já montei o circuito com o PCF8575, mas estou com 2 problemas.
> 
> O primeiro é que o RTC não funciona junto com ele.
> 
> Já verifiquei os endereços e são diferentes.
> 
> RTC = 0x68
> ...

----------


## JoaoCAlves

Ok, ok.

Bom o que pode estar a acontecer, é haver um qq conflito com o RTC. Se calhar, está a existir alguma comunicação com o RTC que não estás a controlar!

A melhor forma de saberes isso ao certo, é colocares um código simples de comunicação com o RTC, o Baltasar tinha esse código que ele implementou em tempos.

Assim tens 100% controlo sobre o que se passa no BUS I2C.

O RTC não pode deixar de funcionar por causa de estar outro device agarrado ao BUS. Estou obviamente a assumir, que tens o BUS bem ligado.

----------


## Fernando Garcia

João, obrigado pela sugestão.

Eu encontrei um código aqui: http://blog.eletronlivre.com.br/2010...-real-rtc.html

E mesclei ele com o que eu estava usando.

O resultado é que o RTC funciona.

Com este código até consigo modificar a data e o horário do RTC.

Aqui está o código: https://gist.github.com/4390822


Agora o mistério é porque a biblioteca do Henning não funciona.

Abraço.
Fernando Garcia

----------


## Baltasar Parreira

Atenção o Arduino (chip ATMEL) tem pullups internos que são automaticamente activados no I2C assim que um comando pinMode(output); é colocado, como tens mais que um device no mesmo bus I2C podes ter de colocar os pull-up o mais perto do ultimo circuito no barramento e sendo assim não usar os internos do ATMEL.
Faz testes como todas as hipóteses, pull-ups internos, externos, os dois, a saída do Atmel, a entrada do ultimo PCB sinais I2C, etc.

Se for problema de software verifica o que as libs usam, todas usam a WIRE em regra geral, podes ter uma desactualizada e a lib do Henning necessitar da ultima WIRE, o outro código que dizes funcionar pode estar a usar comandos directos.

----------


## Fernando Garcia

Baltasar, a biblioteca Wire que estou usando é a que veio com a IDE 1.0.3. Não encontrei outra mais nova para download.

Removi no arquivo TWI.c os comandos que ativam os resistores pull up do Atmel.

"
  // activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);"

Também fiz os testes com e sem resistores ligados ao VCC do PCF e nada funciona.

Vou tentar com outra biblioteca do RTC.

Obrigado.

Abraço.

----------


## Fernando Garcia

A RTClib.h funciona  :yb620: 

Abraço.

----------


## Fernando Garcia

Olá!

Vejam a resposta que recebi do Henning.

"
Hello Fernando,

My DS1307 library requires exclusive access to the pins you select to
use. You will not be able to use other I2C devices on the same bus.

If you have other I2C devices on the I2C pins you can select any other
pin for the DS1307. My library is not locked to the hardware I2C pins
because it uses a software I2C protocol.

"

Eis a questão, devo modificar o shield do LCD ou trocar de biblioteca?

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
Adaptações técnicas feitas.





Agora o RTC funciona com a biblioteca do Henning e o PCF8575.

Conhecem algum transistor que consiga comutar com 1,5 a 3 volts?

Com a tensão que tenho agora não consigo ligar os reles.

Abraço.

Fernando Garcia

----------


## Baltasar Parreira

Humm.. não era preciso ser assim tão radical (acho), bastava usares a WIRE com comandos directos para RTC, procura algures por aqui o meu código que faz isso e assim podes ter tudo a funcionar.

Outro cenário pelo que percebi a lib do henning se faz I2C por software  deve permitir mudar para qualquer par de pins e assim teres os normais standard I2C para a outra board.

----------


## JoaoCAlves

Sim, e bastava usar outros pinos na lib, o init da lib tem essa hipotese!  :Wink:

----------


## Fernando Garcia

Olá!

O que eu fiz foi cortar os pinos do shield para poder ligar o RTC em outros pinos.

Com aqueles dois fios eu consigo mudar para qualquer outro pino.

Achei mais fácil modificar o hardware do que o software.

Alguma sugestão quanto ao transistor ou qualquer outra solução?

Grato.
Fernando Garcia

----------


## JoaoCAlves

Qual é o objectivo do transistor? Não apanhei, desculpa.

----------


## Fernando Garcia

Olá!

João, como o PCF só está fornecendo entre 1,5 e 3 volts na saída , não consigo ligar os relês que precisam de 5 volts.

Então se eu tiver um transistor ligado nos 5 v e conseguir comutá-lo com a tensão que PCF fornece, acho que resolvo o problema.

Obrigado.

----------


## JoaoCAlves

Ok, e qts mA consomem os relés? tens esses dados?

----------


## Fernando Garcia

São 20 mA.

----------


## JoaoCAlves

Ok, este serve!

BC639

----------


## JoaoCAlves

Pelo datasheet, 2mA na base são suficientes.

para calcular Rb:

R=U/I = (3-0,7)/0.002 = 1150 ohm (1k serve)

Com esta resistências tens corrente de colector até:

Ic = beta x Ib

considerando beta=140 que é o que costumo ter nestes transistores:

Ic = 140x 0.002 = 0,28A (280mA)

Portanto como só precisas de 20mA, com 1kohm na base tens mais que suficiente.

Abraço

----------


## Fernando Garcia

Obrigado João.

Eu sempre fico pensando que a tensão de saída é proporcional a tensão aplicada na base. Mas pelo que eu entendi o importante é a corrente,certo?


Abraço.

----------


## JoaoCAlves

Certo.

A tensão é em função do que aplicas a alimentar o colector. Só tens que garantir que o transistor aguenta essa tensão qd está ao corte, que é qd a tensão de alimentação fica toda entre o colector e o emissor. Claro a corrente máxima tb tem que ser respeitada. Mas neste caso, é o proprio relé que limita.

Não te esqueças que o relé fica entre o colector e VCC. Convém tb colocar um diodo inversamente polarizado aos terminais do relé por causa dos picos de tensão gerados pela bobine qd cortas a corrente de repente. o 1n4001 deverá chegar e sobrar, mas é mais facil normalmente encontrar o 4007. Alguns relés já têm este diodo dentro, se for o caso, não precisas.

----------


## Fernando Garcia

Obrigado João.

A ligação é semelhante a esta?



Abraço.

----------


## Fernando Garcia

Outra imagem.

No caso da placa com relês a ligação fica assim?

----------


## JoaoCAlves

humm
não, isso muda tudo....

Sendo assim, tens que usar um transistor PNP.

Mas ao que parece, esse pcb já lá tem o diodo de protecção

Tens o equema desse pcb dos relés?

----------


## Fernando Garcia

Aqui:

ftp://imall.iteadstudio.com/Modules/...el_5VRelay.pdf

----------


## JoaoCAlves

Ok, esquece.

Essa placa de relés, tem tudo o que precisas para funcionar!!!

Isso tem de bumbar!

O prob é outro qq.

O PCF dá 5V à saida, desde que alimentado com 5V. Já verificas-te que alimentção chega ao PCF? Mede com um multimetro com cuidado a tensão entre o pino 12 e 24 do chip. tens de lá ter 5V.

A unica possibilidade que vejo para isso não funcionar, é a corrente que o PCF dá não ser suficiente e ele baixar a tensão por protecção. Tu tens um led por porta em paralelo com a base do transistor.

Mas acho mt estranho, pelo datasheet da placa, o led está a consumir 2.5mA +-, não justifica!!!

vê bem as ligações, vê se tens as massas bem ligadas. O GND do relé tem que ir tb ao GND do pcb do PCF.

Valida isso bem.

abraço

----------


## Fernando Garcia

Na verdade os leds que acendem são os que estão na protoboard.




Os leds da placa de relê sequer acendem quando estão ligados no PCF.

A tensão medida no pinos soldados do PFC é 5,2 volts.

A tensão medidas nas "patas" do circuito entre os pinos 12 e 24 também é 5,2 volts.

Os circuitos estão sendo alimentados por uma fonte de PC.

Já tentei ligar o PCF nos 5 v do arduino e não resolve.

Abraço.

----------


## JoaoCAlves

Fernando, tens que garantir que os GND estão todos interligados. Se isso não acontecer, não funciona.

Não sendo isto, não estou a ver o que possa ser. Também não tenho hardware desse para poder testar. sorry.

abraço,

João

----------


## Pedro Ferrer

Boa tarde

Tenho 1 placa desse género.

No meu caso, tenho que ligar GND com GND, 5V com 5V... para alimentar a placa, mas...
Uso um CI ULN2803 (há outras soluções) para inverter o sinal e forma a actuar o relé... os 5V do Arduino, converto via CI ULN2803... pois é o sinal invertido à saída do CI (massa, GND...) que actua a placa.

Abraço
Pedro Ferrer

----------


## Fernando Garcia

Olá!

Feliz 2013 para todos vocês!

Um grande abraço.

Fernando Garcia

----------


## JoaoCAlves

Obrigado.

Bom ano para ti tb!  :Wink:

----------


## António Vitor

> Obrigado.
> 
> Bom ano para ti tb!


Sim um grande ano de 2013 para todos vamos ser optimistas, aliás sofrer por antecipação não resolve nada...

----------


## Fernando Garcia

Olá pessoal!

Com a ajuda do Henning criei uma função na biblioteca "UTFT.H" que simplifica a migração entre diferentes LCDs.

Gostaria que testassem este código:

[code]
#include <UTFT.h>

UTFT myGLCD(x,38,39,40,41);  // X é o modelo do seu LCD.

void setup()
{
  // Seta fator de escala para as coordenadas x e y
  myGLCD.setScaleFactor(1.00, 1.00); // X, Y
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawRect(0, 0, 319, 239);
}

void loop()
{
}
[/code]

Com o código acima eu obtenho esta imagem:




Para saber qual o fator de escala a ser usado é muito simples.

O programa acima foi escrito para um LCD de 320 x 240, se quiser usá-lo em um LCD de 400 x 240 é só fazer o seguinte cálculo.

Fator de escala:

X = 400 / 320
x = 1.25

Y = 240 / 240
Y = 1

Então no void setup() é só colocar:

myGLCD.setScaleFactor(1.25, 1.00);

E você obterá esta imagem:



Aqui está a biblioteca modificada.

https://skydrive.live.com/redir?resi...MWJ2Hf8DBRh3rk

Deixe me saber se isto funciona para vocês e continuarei com as modificações.

Abraço.

----------


## Hugo Figueiredo

Viva Fernando!

Podes postar aqui uma imagem da ligação arduino-stamp-board-sensor, para controlo do PH?

----------


## Fernando Garcia

Olá Hugo!

Aqui tem a imagem:

http://www.reefforum.net/showthread....l=1#post199824

Abraço.

----------


## JoaoCAlves

Porreiro, poupa mt trabalho em termos de portabilidade!  :Wink:

----------


## Hugo Figueiredo

Aquela plaquinha amarela que junta tudo tem mesmo de existir? É também da Atlas?

----------


## Fernando Garcia

Não Hugo.

Pode ligar o stamp direto no arduino.

Lembre-se de ligar o TX do stamp no RX do arduino e RX do stamp no TX do arduino.

Abraço.

----------


## Hugo Figueiredo

Mas colocaste por alguma razão esse "stamp" intermédio?

----------


## Fernando Garcia

Aqui o Jarduino ocupando a tela inteira como num passe de mágica!  :SbSourire2: 



Ainda precisando de ajustes.

----------


## Fernando Garcia

> Mas colocaste por alguma razão esse "stamp" intermédio?


A única razão para o PCB amarelo estar ali é para não gastar uma porta serial para cada stamp.

----------


## Fernando Garcia

> Mas colocaste por alguma razão esse "stamp" intermédio?


Nada de mariquice. kkkkkkk

----------


## Fernando Garcia

Done!  :Cool: 



https://skydrive.live.com/redir?resi...HXmdQER3xcxk_s

----------


## Sérgio Paulo

> Aqui o Jarduino ocupando a tela inteira como num passe de mágica! 
> 
> 
> 
> Ainda precisando de ajustes.


Boa noite Fernando Garcia,

Estás mesmo a utilizar os led´s UV ou simplesmente o controlo está lá mas não utilizas UV?

----------


## Hugo Figueiredo

> Nada de mariquice. kkkkkkk


hehe  :Smile: 
Nada mesmo, neste caso!!!  :Coradoeolhos:

----------


## Fernando Garcia

> Boa noite Fernando Garcia,
> 
> Estás mesmo a utilizar os led´s UV ou simplesmente o controlo está lá mas não utilizas UV?


Olá Sérgio!

 Esta imagem não é do meu código.

O meu código conta com o controle de apenas duas cores de led.

Ainda não me empenhei em melhorar o código dos leds.

Tenho outras prioridades.

Abraço.

----------


## Fernando Garcia

Olá!

Ontem o Henning lançou uma nova versão da biblioteca UTFT.

A velocidade é IMPRESSIONANTE mesmo no meu processador de míseros 8 bits.


Abraço.

----------


## Fernando Garcia

Duplicado.

----------


## JoaoCAlves

Boas.

Fixe, já suporta oficialmente o due?

qual é o speed no slideshow?

----------


## Fernando Garcia

"UTFT v2.0 has been released. Please see the library page for a full list of what has been done.
The most important updates are support for Arduino Leonardo and Arduino Due, optimized transfer speed for 16bit displays and support for more display modules.

There are also some new pin-maps available under Resources - Pinmaps - Arduino."

----------


## JoaoCAlves

tenho de testar isto!  :Big Grin: 

Version:	2.00	21 Jan 2013	• added support for Arduino Due and Arduino Leonardo
• added support for the "AquaLEDSource All in One Super Screw Shield" on chipKit Max32
• added support for more display modules
• fixed a bug in printNumF()
• optimized drawLine()
• optimized 16bit data transfer
• optimized some 8bit data transfer
• added option to use pre-defined RGB565 values with setColor(), setBackColor() and fillScr()
• added functions getColor(), getBackColor(), getFont(), getFontXsize() and getFontYsize()
• added 16 VGA standard colors as pre-defined color literal
• rearranged the manual to keep related functions grouped together

----------


## Fernando Garcia

> Boas.
> 
> Fixe, já suporta oficialmente o due?
> 
> qual é o speed no slideshow?


Com  quantas imagens vocês testaram?

Com o padrão que está no programa?

char* files[]={"PIC401.RAW", "PIC402.RAW", "PIC403.RAW", "PIC404.RAW", "PIC405.RAW", "PIC406.RAW", "PIC407.RAW", "PIC408.RAW", "PIC409.RAW", "PIC410.RAW"}; // 400x240

----------


## JoaoCAlves

Sim, com o que vem!

Já agora, testa o UTFT Demo a ver o speed tb.  :Wink:

----------


## Fernando Garcia

> Sim, com o que vem!
> 
> Já agora, testa o UTFT Demo a ver o speed tb.


Esse eu já testei.

Dá 44,200 segundos.

Lembrei agora que não vou poder testar o slideshow porque o chipselect do meu ethernet shield é o 4 e o do LCD é 53.

Já procurei na tyniFat onde mudar, mas não encontrei.

----------


## JoaoCAlves

Ok, porreiro, no mega acho que dava 68 segundos.

julgo que é setSSpin() ou parecido.

Tá no manual do fat.

----------


## Fernando Garcia

> Ok, porreiro, no mega acho que dava 68 segundos.
> 
> julgo que é setSSpin() ou parecido.
> 
> Tá no manual do fat.


Obrigado João.

Procurando na biblioteca errada eu não iria achar mesmo.

Com estas bibliotecas:

#include <tinyFAT.h>
#include <UTFT.h>
#include <UTFT_tinyFAT.h>


O tempo é de 62,45 segundos

E com estas:

#include <tinyFAT.h>
#include <ITDB02_Graph16.h>
#include <ITDB02_tinyFAT16.h>


O tempo é de 58,51 segundos.

Abraço.

----------


## Fernando Garcia

Olá!

Vejam como está ficando o controlador do Lucian Brandabur da Romênia.

Ele adicionou o programa para mais 3 dosadoras.











Abraço.
Fernando Garcia

----------


## Hugo Figueiredo

Uma categoria!!!  :tutasla:

----------


## Fernando Garcia

UTFT 2.0

----------


## Aderito Pereira

Mesmo muito bom.... que grande hobby que o arduino é....

Parabéns !!

----------


## Sérgio Paulo

p11000812g.jpg


Boa noite caros Amigos,

Depois de ver a foto que o Fernando colocou do Lucian Brandabur da Romênia, fiquei com uma duvida e gostaria de vos questionar se sabem qual é o comprimento maximo que se pode "afastar" o Display do próprio arduino?

É que eu já tentei com fita de um metro de flat cable 40 vias e imagem nem vela, o sinal perde-se.
Será que vocês conhecem algum conductor que não tenha percas e que dê para "afastar" no máximo a um metro e vinte?

----------


## Fernando Garcia

Olá Sérgio!

O pessoal do fórum do Reino Unido utiliza cabos de até 60 cm sem problemas.

Para a distância que você precisa acho que será melhor deixar o arduino e o "shield" próximos do LCD como o Lucian fez.

Depois leva os sinais de controle através de um cabo serial (impressora antiga).

Cabo com melhor condutividade não sei te dizer onde comprar.

Abraço.
Fernando Garcia

----------


## Sérgio Paulo

> Olá Sérgio!
> 
> O pessoal do fórum do Reino Unido utiliza cabos de até 60 cm sem problemas.
> 
> Para a distância que você precisa acho que será melhor deixar o arduino e o "shield" próximos do LCD como o Lucian fez.
> 
> Depois leva os sinais de controle através de um cabo serial (impressora antiga).
> 
> Cabo com melhor condutividade não sei te dizer onde comprar.
> ...


Olá Fernando,

Obrigado pela dica, nem me tinha lembrado disso (acoplar o display e shield) e então fazer o cabo até ao arduino.

Vou tentar fazer assim e ver o resultado.
Depois dou feedback para futuros interessados.

 :SbOk: 

Abraço,
Sérgio.


*EDIT:* 


> Depois leva os sinais de controle através de um cabo serial (impressora antiga).


Fernando, há por aí algum esquema das ligações do cabo serial do conjunto (display + shield) até ao arduino ?

----------


## Fernando Garcia

Sérgio, essas fotos são controlador do Kevin do Reino Unido me diga se ajuda.



Com o "screw shield" nem terá o trabalho de soldar os fios no "shield" do LCD.



Depois é soldar os fios no conector.



Abraço.

----------


## Fernando Garcia

Essas são do Isacco.

----------


## Sérgio Paulo

Fernando, eu percebi a ideia, o qu eu estava a dizer é quantos fios é que são necessários para fazer a ligação entre o shild e o arduino, ou seja, qual o esquema de ligação entre um e outro.

Porque a quantidade de ligações que o shield tem para acoplar directamente ao arduino são muitas mais, mas pelo que me apercebi, só irão ser necessários 5 ou 6 fios, estou correcto ?

----------


## Fernando Garcia

> Fernando, eu percebi a ideia, o qu eu estava a dizer é quantos fios é que são necessários para fazer a ligação entre o shild e o arduino, ou seja, qual o esquema de ligação entre um e outro.
> 
> Porque a quantidade de ligações que o shield tem para acoplar directamente ao arduino são muitas mais, mas pelo que me apercebi, só irão ser necessários 5 ou 6 fios, estou correcto ?


Sérgio, a sugestão que dei foi deixar arduino + shield + LCD "empilhados" como pode ver na 2ª foto do post #761.

Se deixar o LCD + shield separados do arduino terá que levar aproximadamente 34 fios até o arduino.

Veja a folha de dados do shield.

http://www.beta-estore.com/download/rk/RK-10359_306.pdf

Abraço.

----------


## Sérgio Paulo

> Sérgio, a sugestão que dei foi deixar arduino + shield + LCD "empilhados" como pode ver na 2ª foto do post #761.
> 
> Se deixar o LCD + shield separados do arduino terá que levar aproximadamente 34 fios até o arduino.
> 
> Veja a folha de dados do shield.
> 
> http://www.beta-estore.com/download/rk/RK-10359_306.pdf
> 
> Abraço.


Pois, já percebi Fernando, o que eu pretendia mesmo era separar o arduino do conjunto (shield + display), mas para estar a "panóplia" de 34 fios é muito.

Tenho de pensar noutra situão, é que onde projectei colocar o Display, não tenho espaço para colocar o arduino.

Mas obrigado pela ajuda Fernando.
Abraço.

*EDIT:*
Já agora deixo aqui o pinout das ligações entre do shield para o arduino:

semttulozcj.png

----------


## Rui Manuel Gaspar

O problema do flat cable é que os pinos são trocados. usa flat cable como eu e liga pino a pino na ficha do shield e vais ver que funciona bem.
O Sinal não se perde coisa nenhuma ... 

Experimentei com cabo de 1m antes de decidir onde pôr no meu projecto.

Abraços,
Rui

----------


## Sérgio Paulo

> O problema do flat cable é que os pinos são trocados. usa flat cable como eu e liga pino a pino na ficha do shield e vais ver que funciona bem.
> O Sinal não se perde coisa nenhuma ... 
> 
> Experimentei com cabo de 1m antes de decidir onde pôr no meu projecto.
> 
> Abraços,
> Rui


Olá boa noite Rui,

Eu já testei e já tinha confirmado ponto por ponto de cada um dos 40 conectores, e estavam todos bem e sem qualquer cruzamento, mas na hora de chegar imagem ao display é que a "porca torceu o rabo", só alimenta o display sem que os dados para processamento de imagem sejam interpretados.


Mas com o teu ensaio e testemunho, estou agora a associar uma coisa, é que posso eu estar a ser enganado devido ao transformador que está a alimentar o Arduíno, é que a corrente está mesmo à pele, e vai daí poderá ter sido o caso.

Tenho de ensaiar com outra fonte de alimentação para ver o que acontece.

Mas obrigado Rui, o teu testemunho veio criar mais um ponto a despistar.

 :Pracima:

----------


## Rui Manuel Gaspar

Pois isso já não sei,

O que sei é que inicialmente experimentei com um cabo flat de PC e descobri que as fichas colocam o pino 1 no 20, o 2 no 21 e por aí fora (daí dizer trocado)
Quando me apercebi disso retirei uma das fichas e inseri condutor a condutor e voilá ... fez-se imagem. 

Mas é como dizer a minha fonte é de 12V 6A com um transformador/regulador de 12v para 5v

Pode ser isso.

Abraços,
Rui

----------


## Baltasar Parreira

Sim funciona, mas tem de se trocar a posição da ficha, vejam aqui a funcionar na versão mais recente do nosso shield que ja tem ficha para ligação do cabo IDE:



O cabo IDE convém ser um de 80 fios ou seja 1 par por cada um dos 40 pinos, são os chamados cabos ATA33 se não estou em erro, desta forma a menor possibilidade de percas nos sinais.

----------


## Sérgio Paulo

Obrigado Rui e Baltasar pela vossa opinião.

Ontem ainda fiz o teste com uma das fitas de 1 metro e nada, acende o display (notoriamente com menos intensidade), mas imagem é que nem vela.

Amanhã com mais calma vou bater novamente fio a fio, mas quase que juro que da última vez o tinha ligado que verifiquei e não havia qualquer fio cruzado.

Depois de fazer a dita verificação e caso não tenha nada a ver com cruzamentos de fios, vou tentar com dois cabos, ou então até inserir ferrites nos condutores de dados para tentar manter os sinais mais estáveis.

Baltasar, salvo erro e pelo que me lembro do passado, os ATA33 têm 40 condutores, e os ATA66 é que têm 80 condutores.

Obrigado a ambos, mas vou mesmo ter de inventar alguma coisa, é que não consigo acomodar o Arduíno em mais sitio nenhum em que não tenha de utilizar pelo menos um metro de afastamento (contando com uma ou outra curva).

 :SbOk5:

----------


## JoaoCAlves

Boas.

Epa, com cabo de 1 metro, não funciona de certeza.

O cabo destes testes é de 20cm.

 :Wink: 

Abraço

----------


## Fernando Garcia

> Boas.
> 
> Epa, com cabo de 1 metro, não funciona de certeza.
> 
> O cabo destes testes é de 20cm.




O Baltasar só queria fazer propaganda do "shield".  :yb624:

----------


## Sérgio Paulo

> Boas.
> 
> Epa, com cabo de 1 metro, não funciona de certeza.
> 
> O cabo destes testes é de 20cm.
> 
> 
> 
> Abraço





> O Baltasar só queria fazer propaganda do "shield".


Boa noite João,
Pois, isso eu tinha reparado que o cabo que o Baltasar tinha colocado era curto, mas pensei que já o tivera testado com um metro.  :Icon Cry: 

Pois é Frenando, provavelmente é isso mesmo.  :yb665: 

Eu tentei agora com um de 42cm e mesmo assim no arranque já se torna um pouco lento a aparecer imagem.

2013-02-09 01.18.58.jpg

----------


## Baltasar Parreira

Sérgio com esse shield de resistências não sei se te safas com o cabo IDE, esse tipo de shield's faz muita carga e corta nos sinais.

P.S. Sobre o ATA tens razão é isso mesmo eheheh ja é tão raro IDE que estou mesmo esquecido.

----------


## Fernando Garcia

Olá!

Sérgio veja o post 880.

http://ukreefs.com/index.php?topic=117.870

Com 70 cm o LCD parece não funcionar muito bem.

Abraço.

----------


## Baltasar Parreira

Pessoal volto a dizer com os shield's de adaptação das voltagens 5V <-> 3.3v para o Arduino Mega vulgares com resistências, esqueçam os cabos longos ou mesmo mais curtos IDE/outros.

Quando tiver tempo faço um vídeo com o meu de +/- 65cm a funcionar para verem.
Funciona com os nossos shield's pois usam chips activos de sinal e "voltage translation" com bandwidth de mais de 1Gb/s sem fazer qualquer carga resistiva e assim não existe perca de sinal.

----------


## Sérgio Paulo

Olá boa noite,




> Sérgio com esse shield de resistências não sei se te safas com o cabo IDE, esse tipo de shield's faz muita carga e corta nos sinais.


Pois é Baltasar, as resistências "normais" têm este problema, é o próprio consumo delas mesmo.

Mas conheces ou sabes de outro shield que funcione no Mega ?

Com esta tua observação, já cheguei mesmo a pensar em trocar alguns componentes por smd.
Mas ando a indagar e caso chegue a bom porto eu informo como é que o fiz.




> P.S. Sobre o ATA tens razão é isso mesmo eheheh ja é tão raro IDE que estou mesmo esquecido.


Podes crer, algumas coisas já nem nos lembramos. Parece eu que andei a preparar o material de mergulho para o verão que aí vem, e tinha as drives de um dos computadores de melrgulho gravados em disquete. Depois de ter a disquete na mão, fiquei tipo estatua a olhar para os PCs daqui de casa a tentar imaginar como é que agora ia ler o raio da disquete.
É que nenhum dos PCs que tenho sequer têm drives de 3,5.  :Admirado:  




> Olá!
> 
> Sérgio veja o post 880.
> 
> http://ukreefs.com/index.php?topic=117.870
> 
> Com 70 cm o LCD parece não funcionar muito bem.
> 
> Abraço.


Olá Fernando,
Mas pelo que o nitram38 descreve, o lcd funcionou (is working at a length of 700mm away!), a única diferença do que ele fez para o que eu tenho estado a fazer, é que ele intercalou o flat cable entre o arduino e o shield, e eu tenho-o estado a fazer entre o shield e o lcd.
Daí o dele com 700mm aparentemente ter funcionado.

Mas ainda irei tentar fazer como ele (a não ser que o Baltasar indique aqui algum shield milagroso), irei tentar fazer um flat cable para ligar o (shield + LCD) ao arduino.

Abraços

----------


## Fernando Garcia

Olá!

Olhando para a imagem abaixo, não parece que está funcionando corretamente.

Vamos aguardar mais atualizações.

http://ukreefs.com/index.php?action=...tach=757;image

Abraço.

----------


## Sérgio Paulo

Olá,

Eu julgo que se trata apenas do que ele está a transmitir, porque a chegar a informação, chega para qualquer ponto do display, e (julgo) que não é só num ou notro determinado ponto, mas posso estar enganado.

É isso mesmo, a ver vamos como irá correr.

 :SbOk:

----------


## JoaoCAlves

> Olá boa noite,
> 
> 
> 
> Pois é Baltasar, as resistências "normais" têm este problema, é o próprio consumo delas mesmo.
> 
> Mas conheces ou sabes de outro shield que funcione no Mega ?


Boas Sérgio.

Não é milagroso, não existe milagres em electrónica!!  :Big Grin: 

Vê este:

http://www.aqualedsource.com/shop/pr...6c93b378f19294

Abraço

----------


## Baltasar Parreira

Pois Sergio infelizmente com chips activos só conheço mesmo os nossos como o João já mostrou e que podes ver também aqui (versão nova só para Arduinos):
http://shop.aqualed-light.com/produc...products_id=34

e aqui (versão mista para Arduinos e Chipkit):
http://shop.aqualed-light.com/produc...products_id=29

Mas como prometido com calma tiro a camera e faço um vídeo para verem.

----------


## Sérgio Paulo

Boa noite a todos,




> Boas Sérgio.
> 
> Não é milagroso, não existe milagres em electrónica!! 
> 
> Vê este:
> 
> http://www.aqualedsource.com/shop/pr...6c93b378f19294
> 
> Abraço





> Pois Sergio infelizmente com chips activos só conheço mesmo os nossos como o João já mostrou e que podes ver também aqui (versão nova só para Arduinos):
> http://shop.aqualed-light.com/produc...products_id=34
> 
> e aqui (versão mista para Arduinos e Chipkit):
> http://shop.aqualed-light.com/produc...products_id=29
> 
> Mas como prometido com calma tiro a camera e faço um vídeo para verem.


Obrigado João e Baltasar.

Bem, pelos vistos tenho de ir ter convosco não é?

Baltasar, faz o teste com flat cable de 1000 a 1200mm e se der tens-me aí um dia destes.
_(se não tiveres flat cable de com esse comprimento dizque eu levo-te)._

Abraço a todos.

 :SbBravo: 



*EDIT:*

Só para acrescentar o que o Fernando já tinha espectado.
A ligação entre o arduino e o conjunto display + shield funciona, *há mais um testemunho*.

----------


## Baltasar Parreira

Pois pode ser que melhore um pouco assim tento o shield das resistências directo no TFT e só do shield e que vão os cabos ao Arduino, pois ao contrario o sinal já sai baixo devido as resistências e ainda fica pior com os cabos compridos, testem.

De qualquer forma Sérgio não tenho cabo IDE mais comprido que este mesmo de 65cm, logo quando quiseres ver e testar o teu mais comprido e só se combinar e passares por cá.

----------


## Sérgio Paulo

> De qualquer forma Sérgio não tenho cabo IDE mais comprido que este mesmo de 65cm, logo quando quiseres ver e testar o teu mais comprido e só se combinar e passares por cá.


Ok, combinado Baltasar, quando for oportuno eu dou-te um toque e depois combinamos, e aproveito e levo o cabo para testares também.

 :SbOk3:

----------


## Fernando Garcia

Olá!

Aqui está a mais nova função que estou implementando no meu controlador e a primeira PCI da família Ferduino.

Ferduino Nano Shield.









Este circuito mede o consumo de energia elétrica e envia os valores por RF ao controlador principal (Arduino Mega).

Para cargas até 4 Amperes a diferença de medição em relação a um Kill a Watt é de aproximadamente 4%, para cargas até 10,5 A a diferença chega a 6%.

Vou testar cargas próximas a 15 A (limite do Kill a Watt) para saber qual será a diferença.

Ainda preciso fazer um outro Shield para testar a comunicação por RF.

O aspecto da solda não é dos melhores, mas não está muito ruim levando em consideração que é a primeira PCI que faço na vida.

Aqui as referências que utilizei.

http://openenergymonitor.org/emon/
http://wiki.wsartori.com/wiki/Energy_Monitor
http://www.desert-home.com/p/test-html-code.html
http://roysoala.wordpress.com/tag/sct-013-030/

Abraço.
Fernando Garcia

----------


## pedrovilela

Só espero ver fotos do final ! muito Bom

----------


## Fernando Garcia

Olá!

Fiz uma atualização importante no Ferduino, agora tenho 3560 bytes livres de memória RAM. Contra 450 bytes da versão anterior.

Funciona com a IDE 1.0.4.


https://github.com/FernandoGarcia/Ferduino_Portuguese

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Em breve mais novidades.



Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Agora tenho 5 canais de LED.



Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Voltando ao assunto do comprimento do cabo...

O Lucian me disse que utiliza um cabo serial com 2 metros de comprimento.

Ele utiliza um cabo de 26 pinos.

O RTC e o leitor de cartão são separados do LCD.

Sendo assim são necessários 25 pinos para o LCD e mais 2 para alimentação (5 v + GND).

Como ainda faltava um pino no cabo ele interligou os pino db7 e db14 do LCD.

O único problema que ele observou foi que a cor vermelha fica um pouco mais escura.

Aqui as imagens.





Abraço.

Fernando Garcia

----------


## Fernando Garcia

Olá!

Nova tela inicial.



Abraço.
Fernando Garcia

----------


## Rui Manuel Gaspar

Muito fixe agora ... bem melhor do que estava!
Os meus parabéns!

----------


## Fernando Garcia

> Muito fixe agora ... bem melhor do que estava!
> Os meus parabéns!


Obrigado Rui!

Estou sempre tentando melhorar.

Ainda tenho outras funções para implementar, mas estou chegando no limite do "hardware" novamente.

Agora meu problema não é falta de RAM, pois tenho 3100 bytes livres. Agora meu programa está ocupando quase toda a FLASH, tenho 232 000 bytes.

Ainda quero escrever o programa para o "wavemaker", provavelmente as WP40 da Jebao. E também escrever o programa de calibração das sondas.

O Paul (vulgo Isacco) da Espanha começou a escrever o programa de calibração com minha ajuda, mas ainda não terminou.

Aqui algumas imagens:










Ps. Quando quiser migrar o seu programa para um LCD de 5" sem fazer muito esforço me avise que te envio uma biblioteca.

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!

Vamos à alguns problemas que tive com Ferduino Nano Shield.

O primeiro problema que percebi foi que a biblioteca Eagle que utilizei tinha o RFM12 espelhado, então tive dessoldá-lo e fazer uma adaptação para soldá-lo por cima.

Também fiz um pequeno escudo para conectar ao Arduino Mega.

Ao tentar fazer a comunicação entre os escudos percebi que tinha algo errado, pois os escudos não se "enxergavam". No Nano Shield recebia alguns valores aleatórios então, resolvi fazer um segundo escudo para conectar ao Mega.

Por fim tinha 3 circuitos ligados e nenhum dos 3 se comunicavam.

Pesquisando mais sobre o assunto descobri que os circuitos que não tinham resistores entre a SPI e o RFM12 tinham o ATmega alimentado à 3.3 v.

Então com base no esquema abaixo fiz outros dois shields.



Ocorre que num dia de pouca paciência ao tentar dessoldar o RFM12, consegui quebrar alguns "pads" dos 3 circuitos que tinha.

Com o circuito que sobrou montei o escudo abaixo.






Resumindo não consegui testar a comunicação RF.

Quando eu tiver um pouco de tempo $$, vou comprar mais circuitos para terminar o projeto.

Aqui está o desenho da nova versão do Ferduino Nano Shield.



Ele usa 2 sensores de corrente, pois o padrão brasileiro tem 2 fases de 110 v. Para o europeu com apenas 1 fase em 230 v (salvo o engano) acredito que basta colocar um Jumper no CT2.

Aqui uma imagem do sensor de corrente.



Os arquivos Eagle do Ferduino Nano Shield podem sem encontrados aqui:

https://github.com/FernandoGarcia/Ferduino_Nano_shield

Abraço.
Fernando Garcia

----------


## Fernando Garcia

Olá!
Aqui está o projeto do Ferduino Mega Shield que estou desenvolvendo.

Ele terá todos os circuitos necessários numa única placa.



A princípio era para o DUE mas, como o lançamento de bibliotecas está andando como uma tartaruga, vou ficar com o Mega mesmo.

Abraço.

----------


## Fernando Garcia

Olá!

Apesar de saber que este fórum está quase morto, gostaria de deixar algumas notícias sobre o meu projeto.

Após tanto tempo ele continua em desenvolvimento mas, agora em um espaço dedicado para ele.

http://ferduino.com/

O código recebeu muitas melhorias e agora pode ser controlado pela internet.

No último post eu falei sobre a placa que eu estava desenvolvendo, agora tenho a alegria de dizer que o projeto saiu do computador e tornou-se realidade.

Gostaria de agradecer à todos vocês que de forma direta ou indireta me ajudaram nesse projeto.

Gostaria de vê-los participando do meu fórum.

http://ferduino.com/forum

Aqui algumas imagens:

----------


## Fernando Garcia

Grande abraço.
Fernando Garcia

----------

