quinta-feira, 22 de dezembro de 2011

Laços While & For do Arduino

comando for

Descrição

O comando “for” é utilizado para repetir blocos de comandos inseridos entre chaves. Um contador incremental é normalmente utilizado para incrementar e finalizar o laço. O comando “for” é útil em qualquer tarefa repetitiva, e largamente utilizado em combinação com arrays para processar coleções de dados/portas.
O laço “for” é constituído de 3 partes:
for (iniciação; condição; incremento) {
//comando(s);
}
A iniciação (declaração da variável contadora) acontece primeiro e exatamente uma única vez. Cada vez que o laço “roda”, a condição é testada; se é verdadeira, o bloco de comandos e seu incremento é executado, então a condição é verificada novamente. Quando a condição se torna falsa, o laço termina.

Exemplo

// Esvanece um LED usando uma porta PWM
int PWMpin = 10; // LED em série com resistor 470 ohm na porta 10

void setup()
{
  // nada a ser feito no setup
}

void loop()
{
   for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);
      delay(10);
   } 
}



Dicas de Codificação

O laço “for” do C é muito mais flexível que outros laços encontrados em outras linguagens de programação, incluindo BASIC. Qualquer uma das 3 partes (ou todas elas) podem ser omitidas, embora os pontos e vírgulas são obrigatórios. Tanto que os comandos de iniciação, condição e incremento podem ser qualquer comando válido em C, mesmo que as variáveis não tenham relação entre si. E é permitido o uso de qualquer tipo de variável, mesmo float. Estes tipos não usuais para comandos “for” devem fornecer soluções para alguns problemas raros de programação.
Por exemplo, utilizando multiplicação na parte incremental gerará uma progressão logarítimica:

for(int x = 2; x < 100; x = x * 1.5){
println(x);
}
Resultado: 2,3,4,6,9,13,19,28,42,63,94
Outro exemplo, esvanece um LED ao ligar e desligar com esse laço “for”

void loop()
{
   int x = 1;
   for (int i = 0; i > -1; i = i + x){
      analogWrite(PWMpin, i);
      if (i == 255) x = -1;             // muda a direção no pico
      delay(10);
   } 
}

laço while

Descrição

Laços “while” vão executar sequencialmente e para sempre, até que a expressão dentro dos parênteses () se torne falsa. Algum evento deve mudar o estado da variável testada, ou então o laço “while” não terminará nunca. Este evento pode estar em seu código, como uma variável incremental, ou uma condição externa, como um sensor de teste, um botão etc.

Sintaxe

while(expressão){
  // comando(s)
}

Parametros

expressão - um (boolean) comando C que retorne verdadeiro ou falso (true ou false)

Exemplo

var = 0;
while(var < 200){
  // faça alguma coisa repetitiva por 200 vezes
  var++;
}

Traduzido do Original em Inglês por Renato Aloi

domingo, 11 de dezembro de 2011

Strings no Arduino


Descrição

Strings de texto podem ser representadas de duas formas. Você pode utilizar o tipo de variável “String”, que é parte do Arduino desde a versão 0019, ou você pode fazer uma string a partir de um array de variáveis do tipo “char” e adicionar a terminação nula.
Este artigo descreve o último método. Para maiores detalhes sobre o objeto String, que permite maiores funcionalidades (e também maior custo de memória), veja o artigo mais abaixo.

Exemplos

Todas as formas abaixo são declarações válidas de strings.
char Str1[15];
  char Str2[8]  = {'a','r','d','u','i','n','o'};
  char Str3[8]  = {'a','r','d','u','i','n','o','\0'};
  char Str4[ ]  = "arduino";
  char Str5[8]  = "arduino";
  char Str6[15] = "arduino";


Possibilidades para declaração de strings
  • Declare um array de caracteres (char) sem iniciá-lo, como feito em Str1
  • Declare um array de caracteres (char), com um caractere adicional, e o próprio compilador acrescentará o caractere de terminação nula, como feito em Str2
  • Adicionar explicitamente o caractere nulo, como em Str3
  • Inicie com uma constante de texto, contida entre aspas; o compilador vai definir o tamanho do array de caracteres automaticamente, calculando o tamanho da string mais o terminador nulo, conforme Str4
  • Inicie um array com o tamanho declarado explicitamente e uma constante de texto entre aspas, vide: Str5
  • Inicie um array, deixando espaço extra para strings com tamanhos maiores, conforme Str6


Terminação Nula
Geralmente, strings são terminadas com um caractere nulo, (código ASCII zero [0]). Isto permite que funções (como a Serial.print()) conhecerem onde termina o texto da string. Caso contrário, essas funções continuariam a ler bytes da memória que não fazem parte da string.
Isso significa que sua string precisa ter espaço suficiente para um ou mais caracteres além do texto que você deseja armazenar. É por isso que a variável Str2 e Str5 (acima) precisam de 8 caracteres, mesmo tendo a palavra “arduino” apenas 7 letras – a última posição é preenchida automaticamente com o caractere nulo. Str4 será automaticamente redimensionada para o tamanho de 8 caracteres, sendo uma posição para o nulo. Na variável Str3, nós declaramos explicitamente o tamanho e adicionamos o caractere nulo ('\0') por nossa conta.
Veja que é possível ter uma string sem o caractere final nulo (por exemplo, declarando a variável Str2 com 7 ao invés de 8 caracteres). Isso falhará na maioria das funções que esperam uma string para funcionar, portanto não faça isso intencionalmente! Se você perceber um comportamento diferente, como adição de caracteres estranhos na sua string, este pode ser o problema.


Aspas Simples ou Duplas?
Strings sempre são definidas escrevendo-se um texto contido entre aspas duplas (exemplo: "Abc"), e caracteres sempre são definidos escrevendo-se uma única letra (ou dígito, ou algum caractere da tabela ASCII), contido dentre aspas simples, ou apóstrofes (exemplo: 'A').
Quebrando strings longas
Você pode quebrar strings assim:
char myString[] = "Um texto que começa aqui"
" e termina logo"
" ali";
Array de Strings
Quando trabalhamos com uma grande quantidade de texto, em um projeto com display LCD, por exemplo, é muito comum fazer uso de um array de strings. Como as strings por si só são arrays de caracteres, um array de string nada mais é senão um array bi-dimensional de caracteres.
No código abaixo, o asterisco após o tipo de variável (“char*”), indica que esta variável é um array de ponteiros. Todos os arrays na realidade são ponteiros de memória, então este é o requisito para fazer arrays de arrays. O estudo de ponteiros é uma das partes mais difíceis para um iniciante, mas é necessário entender ponteiros em detalhes, para usá-los de forma efetiva aqui.

Exemplo

char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};

void setup(){
Serial.begin(9600);
}

void loop(){
for (int i = 0; i < 6; i++){
   Serial.println(myStrings[i]);
   delay(500);
   }
}

Objeto String

Descrição

A classe String, parte do Arduino desde a versão 0019, nos permite utilizar e manipular strings de texto de uma maneira mais completa aos arrays de caracteres. Você pode concatenar textos, adicionar trechos de texto, pesquisar expressões no texto e substituir trechos, e muito mais. Consome mais memória que um simples array de caracteres, mas é muito mais útil.
Para referência, arrays de caracteres são declarados como “string” com o “s” minúsculo, e instâncias da classe String são declaradas como “String”, com a letra “S” maiúscula. Repare também que strings constantes, especificadas por aspas duplas, são tratadas como arrays de caracteres, e não como instâncias da classe String.


Funções

Operadores

Exemplos

Tradução por Renato Aloi
Original em Inglês -- http://www.arduino.cc/en/Reference/String

sábado, 3 de dezembro de 2011

Material de Apoio do Curso Arduino (Aulas 7-8)


Pessoal,

Segue esquema elétrico da solução apresentada nas aulas 7 e 8 do Curso Arduino:



Abaixo temos o código da montagem feita na aula 8, para acionamento de um motor, a partir de um botão:

byte BOTAO = 0;
byte MOTOR = 0;

byte PORTA_B = 10;
byte PORTA_M = 8;

void setup()
{
pinMode(PORTA_B, INPUT);
digitalWrite(PORTA_B, 1); // Liga PullUp!

pinMode(PORTA_M, OUTPUT);
digitalWrite(PORTA_M, 0); // Motor Deslig.
}

void loop()
{
BOTAO = digitalRead(PORTA_B);
if (BOTAO == 0)
{
MOTOR = !MOTOR;
digitalWrite(PORTA_M, MOTOR);
delay(500);
}
delay(1000);
}

Abraços,
Renato Aloi