PplWare Mobile

Arduino: Como ligar botões de uma forma “profissional

                                    
                                

Este artigo tem mais de um ano


Autor: Pedro Pinto


  1. Mota says:

    Parabéns gostei!

  2. Rui Peixeiro says:

    Muito bem!!!

    Com estes kist do Arduino tão baratos no ebay e com um leque de possibilidade infinitas, estes tutoriais são muito bem vindos!

    Eu estou a fazer com base no Arduino, uma estação meteorológica online, sem necessidade um ter um PC ligado a enviar para a net, e com recolha dos dados do tempo por “wireless”, com uns sensores económicos a funcionar a 433MHz.
    Por pouco mais de 60€, fico com uma estação meteorológica, a enviar os dados (temp, chuva, vento, direcção, humidade, …) em tempo real, para site próprio e Wheatherunderground!!!

    Continuem a ensinar e dar ideias ao pessoal!

    • John says:

      Rui Peixoto, podes partilhar que componentes usas? Por acaso também estava a analisar a possibilidade de fazer algo semelhante. O que tinha em mente, para a temperatura e humidade seria um dht11 e para luminosidade um ldr. Para chuva sei que há módulos dedicados. Mas para o vento, que utilizas?

      • Rui Peixeiro says:

        Eu usei um Arduino UNO rev3 (http://www.dx.com/p/120464), um BMP085 que me dá a pressão atmosférica e a temperatura interior (http://www.dx.com/p/147261) e um receptor wireless 433MHZ (http://www.dx.com/p/149252). Comprei tudo no dx.com se procurares pelo ebay, ainda se encontra tudo mais barato.

        Em adição e para envio directo para a net, tenho uma Ethernet Shield W5100.

        Depois, andei a ver o que sairia mais barato para os receptores externos (pluviómetro, termómetro, higrómetro e anemómetro e cata vento) e acabei por comprar uma estação meteorológica completa do Lidl (Auriol h13726) igual a isto: http://www.celestron.com/astronomy/celestron-deluxe-weather-station.html

        Sensores de UV e Radiação solar ainda não tenho, só depois de ter isto tudo a 100%.

        O que me está a dar mais trabalho, é que não quero ter um PC ligado todo o dia. Há em vários sites o código pronto e liga o arduino por USB a um PC com o software Cumulos que trata os dados dos sensores e envia para a net. Eu estou a evitar este passo e enviar os dados directamente para a net e fazer aí o tratamento dos dados…

        • João Tavares says:

          Bom dia.
          Acho muito interessante a sua ideia. Estava a pensar se estiver interessado poderíamos criar uma rede a nível nacional de estações metereológicas caseiras com arduino.

        • jose carlos says:

          Ola poderia me ajudar tenho um Arduino idêntico ao seu
          posso usar uma bateria de lipo de 7.5V de 500miliamper para alimentalo
          ou corro risco de queimalo
          poderia me ajudar por favor

          • SamC says:

            O arduino tem um regulador de tensão integrado por isso não há problema em o alimentar com 7.5 V. A desvantagem é apenas uma eficiencia energetica reduzida

  3. Rui Santos says:

    O bounce podia muito bem ter sido eliminado na fonte, com um circuito RC em cada interruptor, era escusado induzir iowaits via software.

    • lmx says:

      é bem verdade, mas isso faz com que tenhamos que gastar mais dois componentes por botão, e se tivermos muitos, ou se o custo final do equipamento for baixo, a melhor solução é usar o micro…apesar de isso poder criar problemas de performance, dependendo da aplicação/micro.

      cmps

      • SamC says:

        Exato, felizmente na eletrónica há muitas formas de fazer a mesma coisa. Podia-se utilizar uma resistência de pull down no interruptor (como é tradicionalmente realizado nos tutoriais http://arduino.cc/en/tutorial/button ) no entanto, no esquema apresentado acima evitou-se o uso de componentes extra, só o botão e o microcontrolador.

        Na minha experiência até ao momento, o uso do software para eliminar o bounce, não tem tido influências perceptíveis na performance.

        • lmx says:

          boas…a questão da performance, vai depender muito do hardware e da especificidade do projecto.

          Se tiveres a correr uma aplicação em tempo real que precise de ter sempre cpu para realizar tarefas, ai pode acontecer, porque enquanto corres código de debounce não podes correr código da aplicação.

          Mesmo que os inputs usem irq’s existe sempre o problema de correres código de debounce.

          Embora que usando DMA possas minorar ou resolver por completo o problema, pois aceleras um pouco todas as tarefas que programas-te para usufruirem do DMA, e por sua vez libertas espaço para outras coisas…

          cmps

  4. Ikari-Pt says:

    Bom tutorial, so uma coisa,
    “variando o os valores deste pulso é possível “obter a sensação” que o LED não está com o brilho máximo”

    O led não esta mesmo com o brilho ao máximo, pois o pwm esta a limitar a corrente que o led recebe, logo se não tem corrente “máxima” então o led não brilha ao máximo.
    Não é uma questão de percepção, é mesmo assim.

    Por outro lado se o PWM for muito lendo, então sim, o led chega a receber a corrente máxima, mas a velocidade tipica do pwm não costuma ser tão baixa.

    • Pedro Pinto says:

      Ai que este “know how” anda perdido. Quando fazer uns posts Ikari-Pt?

    • SamC says:

      No PWM limita-se a potência média do circuito (na fórmula do cálculo da potência é necessário multiplicar por o DutyCycle T=1/F). Numa onda quadrada monofásica a corrente e a tensão são MÁXIMAS no seu pico.
      Repara que estamos a falar do comportamento de um díodo (LED) e não de uma carga indutiva ou resistiva não linear (como uma lâmpada incandescente).
      Mais info sobre o efeito visual aqui: http://en.wikipedia.org/wiki/Flicker_fusion_threshold

    • pixar says:

      Desculpa mas não concordo. O tutorial está mesmo correto.
      O PWM, como a sigla pretende indicar, é a modulação por largura de pulso. Isso significa que o LED apenas tem dois estados: 0 e 1, ou se preferires, corrente máxima e zero.
      Com 0 a corrente é zero. Com 1 a corrente é máxima.
      O que vai dar mais ou menos brilho é o tempo que o LED permanece ligado durante a pulsação.
      O teu raciocínio estaria completamente correto se tivesses dito que em termos de média de corrente nunca seria máxima. Isso estaria certo porque com o PWM o valor médio é sempre mais baixo que se estivesse sempre ligado. O valor médio pode ser calculado com recurso às áreas dos retangulos. Para dificultar a coisa até podiamos usar um integral…

      • lmx says:

        pixar…o que o colega disse , ou deixou subentendido não está errado por aquilo que percebi…

        A corrente demora tempo a circular, de tal forma que quando dizes que o led quando está on a currente é maxima…isso também não é uma verdade absoluta…pois a currente demora tempo a subir…

        por esses motivos, e por outros podemos ficar com a sensação que o led não esta no seu valor maximo de corrente…porque este efeito visual depende de muitos aspectos…

        Para termos uma noção de brilho maximo, teremos que atingir determinados valores de corrente por intervalo de tempo…

        Claro que o pwm resolve esta situação, e o duty cycle é porporcional á quantidade de corrente, mas esta não está disponivel no imediato…e o led também tem o seu tempo de resposta como tudo na vida…

        Por outras palavras…teremos que ter um duty cylce maior para surtir os efeitos teoricos(esquecendo a velocidade de propagação da corrente/defeitos do conductor/calor-resistência/lentidão do led em responder).

        cmps

  5. thylux says:

    Uma pequena informação extra:

    As resistências pull-up ou pull-down não servem como protecção, mas sim para evitar falsos positivos ou negativos.
    Se não estiverem ligadas por defeito a um dos extremos (HIGH ou LOW) alguns dispositivos mais sensíveis podem apanhar electricidade estática do ar o que pode alterar os valores lidos pelo Arduino.

    Se esperam receber um sinal HIGH quando carregam no botão, assumem que quando não se carrega vão receber um sinal LOW. Para o garantir ligam uma resistência ao GND para que essa faça o serviço de pull-down.

    Escrevi este artigo quando aprendi sobre isso:
    http://thylux.blogspot.pt/2011/03/curious-case-of-pull-up-push-down.html

    • lmx says:

      a principal aplicação é mesmo como protecção dos integrados…cada vez mais on integrados usam-nas internamente, ou então disponiblizam saidas em open colector, precisamente para a malta distraida,ou atarefada, não se “divertir” a queimar as saidas…

      Mas também são muito utilizadas para esse fim…

      cmps

  6. onike says:

    O youtube foi a baixo.
    Print tirado por mim:
    http://oi41.tinypic.com/v6olro.jpg

  7. samuel sa says:

    Posso só dizer que esta demonstração do hardware está errada
    Deveria levar uma resistência entre o pino do botão que liga ao Arduino e os 0V

  8. Carlos Ferreira says:

    Alguém sabe de um tutorial onde possa controlar à volta de 50 leds com um arduino?

  9. Christian says:

    Prezado, boa noite.

    Quanto tento usar a biblioteca em questão, recebo erro na compilação: “expected unqualified-id before ‘<' token" referente a linha
    Saberia me ajudar? Baixei a biblioteca e instalei como instruído.

    Grato

    • jose carlos says:

      ola
      se vc estiver tentando ativar alguma shild
      ante3s de compilar desencaixe ela pois quando a uma shild conectada no Arduino não aceita compilação

  10. JOAO SERGIO VIEIRA DA COSTA says:

    Bom dia , sera que alguem poderia me ajudar a introduzir um codigo no steeperdo motor de passo do arduino para que quando eu apertar um botao o motor gira 360 graus e pare.Nao sei criar o codigo e se alguem puder me enviar o mesmo eu agradeco,

    PS o acionamento do motor deve ser ao toque do botao,sem mante-lo pressionado.

    Grato sergio costa

  11. Fabio says:

    Boa tarde gostaria de saber se existe uma forma de ligar o arduino automatico tipo eu programo ele pra livar tal dia e tal hora e ele liga sozinho tem como fazer isso ….eu pensei em uzar o agendador de tarefas do Windows mas ai nao deu certo…

  12. Ijanai says:

    Boa tarde, gostei muito do post. Estou querendo adicionar botão profissional para controlar o tempo de funcionamento de um relê, tem com vocês me ajudarem?

  13. André says:

    boas
    sou novo neste mundo do arduino, ainda ando a recolher informação para perceber como funciona a programação e precisava de uma ajuda.
    montei este esquema e funciona cinco estrelas mas tentei add mais um led e um botao para acender e apagar esse novo led mas sem sucesso o programa só me faz a função aqui mostrada.
    alguém me podia dar uma ajuda

    • SamC says:

      Viva, sem o código será dificil perceber o problema…

      • André says:

        o código ficou assim :$

        #include // biblioteca utilizada

        // definição dos pinos de ligação
        #define LED_PIN 11
        #define AUMENTAR_PIN 8
        #define DIMINUIR_PIN 7

        #define led 12
        #define botao 6

        byte brilho = 0; // valor do brilho do LED entre 0 e 255

        #define DEBOUNCE_TIME 5 // tempo em ms
        Bounce aumentar = Bounce(AUMENTAR_PIN, DEBOUNCE_TIME);
        Bounce diminuir = Bounce(DIMINUIR_PIN, DEBOUNCE_TIME);

        void setup() {
        pinMode(LED_PIN, OUTPUT);
        pinMode(AUMENTAR_PIN, INPUT_PULLUP);
        pinMode(DIMINUIR_PIN, INPUT_PULLUP);
        pinMode(led,OUTPUT);
        pinMode(botao,INPUT);
        digitalWrite(botao,HIGH);
        // digitalWrite(led, HIGH);

        Serial.begin(9600);
        Serial.println(“Tutorial Botao v.1.0.0”);
        }

        void loop() {
        analogWrite(LED_PIN, brilho);

        if (aumentar.update() ) {
        if (aumentar.read() == LOW ) {
        aumentar.rebounce(20);

        if (brilho 0)
        brilho –;

        Serial.print(“Diminuir o brilho do LED: “);
        Serial.println(brilho);
        }
        }
        }
        void ledd() {
        int valor = digitalRead(botao);
        if (valor == HIGH) {
        while (digitalRead(botao) == HIGH){
        delay(100);
        }
        brilho = !brilho;
        digitalWrite(led, brilho);

        }
        }

        • SamC says:

          vi o código por alto e estão aqui vários erros de iniciante

          pinMode(botao,INPUT); // o botão assim estará ligado da forma “tradicional” com uma resistência, se o ligaste da forma que está aqui no esquema e com esse código arriscas-te a queimar esse I/O pin do arduino. o artigo explica isso

          parei a análise do código aqui:
          if (brilho 0)
          brilho –;

          !!! estão aí erros “básicos” de programação. O meu conselho é começares a “brincar” com código ainda mais simples para treinares a programação porque uma letra a mais faz diferença (tens uma função chamada ledd (que está “perdida” no meio do código)

          Daqui a um tempo quando estiveres mais à vontade já vais conseguir mexer neste código (que é de nível básico, mas ainda exige os mínimos de conhecimentos)

  14. Giovanni says:

    Boa tarde. Gostei da ideia, mas a página pra download do sketch não está mais disponível?

  15. Curso de Arduíno Online says:

    To procurando informações e gostei do conteúdo, passando pelo seu blog para conhecer mais seu trabalho, muito obrigado por compartilhar.

Deixe um comentário

O seu endereço de email não será publicado.

You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Aviso: Todo e qualquer texto publicado na internet através deste sistema não reflete, necessariamente, a opinião deste site ou do(s) seu(s) autor(es). Os comentários publicados através deste sistema são de exclusiva e integral responsabilidade e autoria dos leitores que dele fizerem uso. A administração deste site reserva-se, desde já, no direito de excluir comentários e textos que julgar ofensivos, difamatórios, caluniosos, preconceituosos ou de alguma forma prejudiciais a terceiros. Textos de caráter promocional ou inseridos no sistema sem a devida identificação do seu autor (nome completo e endereço válido de email) também poderão ser excluídos.