Aprenda a programar o Arduino – Parte 2

Quando estava montando um braço mecânico na faculdade precisei de usar algumas estruturas que não rodassem em loop, me deparei com a pergunta como faço para executa-las fora do loop do Arduino sendo que ele trata essa função como se fosse uma main() (por ser obrigatória) do C (dummies abaixo eu explico melhor ok 😉 )

No Arduino o programa começa a ser executado pela função Setup(). Depois de concluído ele procura a função loop() e inicia sua execução, o que eu fiz e vou mostrar nesse post e como interromper o fluxo e apontar uma função que você criou para ser executada. É extremamente simples, pode até parecer boçal… Mas eu passei algumas boas horas para ter a epifania, pois ao imaginar o codigo do arduíno ele parece tratar a setup como se fosse uma função para configurar o mesmo, mas na verdade dentro do proprio loop, você pode setar um pino, dar um atach numa interrupção etc…

****************************************************************************************************************************

Observe que não deixamos de executar o loop como bem observado pelo bubulindo no forum do Arduino, como vocês podem conferir a discussão no link abaixo:

http://arduino.cc/forum/index.php/topic,93283.0.html

* Trechos em negrito inseridos para corrigir erro na publicação original

****************************************************************************************************************************

Então vejamos o seguinte código:

void setup(){

Serial.begin(9600);

naoqueroloop();

}

void loop(){

}

void naoqueroloop(){

Serial.print(“Estou fora do loop”);

}

Se você executou corretamente quando abrir o Serial monitor obterá a seguinte tela.

Saída Serial Monitor Arduíno
Saída Serial Monitor Arduíno

Sem o meu logo é claro… Agora veja como o programa seria executado se não houvessemos criado essa função:

void setup(){

Serial.begin(9600);

}

void loop(){
Serial.print(“Estou dentro do loop \n”);

}

O código acima gera a seguinte saída:

Saida Serial monitor loop()
Saida Serial monitor loop()

Bom já que estamos aqui não vou gastar o post apenas explicando isso. Vamos falar um pouco tambem sobre funções. Funções servem para agrupar comandos que juntos fazem alguma tarefa.

Veja a definição segundo o Site do curso de C da UFSC :  “Uma função é um bloco de código de programa que pode ser usado diversas vezes em sua execução. O uso de funções permite que o programa fique mais legível, mais bem estruturado. Um programa em C consiste, no fundo, de várias funções colocadas juntas. ”

O corpo de uma função e composto pelo tipo de retorno, nome da funçao, parametros, chaves de inicio e fim da função, e comandos..

tipo nome_funcao (parametros) {

comando_1;

comando_2;

}

Funçoes podem ter o tipo void, int, float e qualquer outro que uma váriavel possa receber, nos exemplos anteriores vimos vários exemplos de funçoes do tipo “void” , esse tipo de função não retorna nenhum valor, ou seja apos ser chamada ela cumpre sua função e não devolve nenhum resultado para o programa.

Para esclarecer melhor vejamos uma função do tipo int.

void setup(){

Serial.begin(9600);

}

void loop(){

int numero1=8;
int numero2=10;
int resultado=soma(numero1,numero2);
Serial.print(resultado);
Serial.print(“\n”);
delay(1000);
}

int soma(int a, int b){
int c;
c=a+b;
return c;
}

No programinha acima, temos uma função chamada soma(), essa função e do tipo int, e tem dois parametros, a e b, do tipo inteiro ou em inglês integer. Dentro dessa função foram declaradas 3 variaveis a,b,c duas delas tem seu valor obtido através da passagem de parametros soma(numero1,numero2) nesse momento o valor de a e b passam a ser os mesmos de numero1 e numero2, logo abaixo a variável c recebe o valor da soma de a e b esse valor é retornado atraves do comando return c; Já no loop() a variável resultado recebe o valor de retornado pela função soma().

Até agora tá tranquilo não é?

Então dá uma olhada nesse programa e tentem entender, tem muita coisa que eu não expliquei ainda mas é bom pra dar uma exercitada, e tambem para quem já tem algum conhecimento, o programa a seguir imprimi no serial monitor o triângulo de pascal.

/*
Codigo Exemplo Triangulo de Pascal

*****************************************************************
Aprenda a programar o Arduino – Primeiros Passos

Autor: Anthony Collucci
Data: 12/02/2012

Esse algoritmo não foi otimizado
*****************************************************************
*/

/* sendo k o numero da coluna e n o numero da linha*/
int k,n;

/*
criaremos uma matriz de 20 por 20 para armazenar os valores
o que nos dará 400 numeros na memoria!!!!
*/

int numero [19][19];

void setup(){

Serial.begin(9600);
zera_variaveis();
pascal();
}

void loop(){
}

void pascal (){

/*inia o calculo pela linha 1 coluna 1*/
k=n=1;
numero [n][k]=1;
Serial.print(numero [n][k]);
Serial.print(“\n”);

for (n=2;n<19;n++){
for (k=1;k<=n;k++){
numero [n][k] = efetua_calculo();
Serial.print(numero [n][k]);
Serial.print(”  “);
delay(100);
}
Serial.print(“\n”);
}

}

int efetua_calculo(){
int resultado;

if (numero[n-1][k]==0){
resultado = numero [n-1][k-1];
return resultado;
}
if (numero[n-1][k-1]==0){
resultado = numero [n-1][k];
return resultado;
}

if (numero[n-1][k-1]!=0 && numero[n-1][k]!=0){
resultado = numero [n-1][k-1] + numero [n-1][k];
return resultado;
}
return 0;
}

void zera_variaveis(){

/* Fui obrigado a criar essa funçao pois ao criar as variaveis
elas vem com um valor aleatorio, lembrando que a matriz começa
no indice 0 mas estamos facilitando as coisas

*/
for (n=1;n<19;n++){
for (k=0;k<19;k++){
numero[n][k]=0;
}
}
}

Aqui você vê a saída deste programa:

Triângulo de Pascal - Arduíno
Triângulo de Pascal - Arduíno

Fico por aqui até a próxima!

5 ideias sobre “Aprenda a programar o Arduino – Parte 2”

  1. Os exemplos de arduino que tenho visto em várias páginas e blogs tem sido muito bons, entretanto,ainda não tivemos a oportunidade de vislumbrar exemplos em que os dados coletados após serem apresentados em tela possam ser salvos automaticamente em arquivos txt ou outros para poderem ser acessados posteriormente.Acredito que só é possível embutindo um banco de dados que receba esses dados da entrada serial.
    Vc teria algo nesse sentido?
    atc
    Paolo

  2. Olá, estou com um problema na programação de meu módulo GSM,
    criei uma rotina que acende o led1 ao receber a sms “ra1”, e que apaga o led1 ao receber a sms “ra0”
    porém, queria acrescenter mais leds, porém, com uma mensagem diferente para cada um.
    Exemplo:
    LED1; on= “ra1”; off= “ra0”
    LED2: on= “rb1”; off= “rb0”
    LED3: on= “rc1”; off= “rc0”

    O problema é que, quando eu coloco pra ligar e desligar apenas 1 LED, ele liga/desliga com apenas uma única SMS. Mas quando eu tento acrescentar LED’s para serem acesos cada um com sua respectiva SMS, as vezes tenho que enviar umas 3,4 SMS’s. Já mechi em tudo e não consigo encontrar o erro.
    Se tiver como postar o code funcionando aqui vai me ajudar pra caramba, isso faz parte do projeto do meu curso técnico e daqui a 1 mês eu vou pra uma competição de projetos e preciso terminar até la.
    Agradeço desde já.
    Ta aqui o code:

    // Example 27.2

    #include
    char inchar; //Will hold the incoming character from the Serial Port.
    SoftwareSerial cell(10,11); //Create a ‘fake’ serial port. Pin 2 is the Rx pin, pin 3 is the Tx pin.

    int led1 = 47;
    int led2 = 45;

    void setup()
    {
    // prepare the digital output pins
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);

    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);

    //Initialize GSM module serial port for communication.
    cell.begin(9600);
    delay(30000); // give time for GSM module to register on network etc.
    cell.println(“AT+CMGF=1”); // set SMS mode to text
    delay(200);
    cell.println(“AT+CNMI=3,3,0,0”); // set module to send SMS data to serial out upon receipt
    delay(200);
    }

    void loop()
    {
    //If a character comes in from the cellular module…
    if(cell.available() >0)
    {
    inchar=cell.read();
    if (inchar==’r’)
    {
    delay(1);
    inchar=cell.read();
    if (inchar==’a’)
    {
    delay(1);
    inchar=cell.read();
    if (inchar==’0′)
    {
    digitalWrite(led1, LOW);
    }
    else if (inchar==’1′)
    {
    digitalWrite(led1, HIGH);
    }
    cell.println(“AT+CMGD=1,4”);
    }
    }
    }
    }

  3. Oi!
    Muito legal o tutorial!!! Bem explicado e cheio de detalhes!
    Sobre o problema da interrupção do void loop, eu usei o exit(0) dentro do void loop e resolveu, quebrou o void loop e nao voltou mais!!!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Please type the characters of this captcha image in the input box

Por favor, digite os caracteres desta imagem na caixa de entrada