Criação de Bibliotecas Comunitárias

Galera, faz MUITO tempo, que estava sem brincar com meu arduino, estive muito ocupado com trabalho, mas agora estou realmente com empenho para criar novos projetos.

Minha primeira idéia é a de criarmos bibliotecas comunitárias com abstração de código, para o auxílio em nossos projetos, e compartilharmos estas bibliotecas de forma aberta dando seguimento a o formato de distribuição Arduino.

Vou citar um exemplo:

Você tem 10 Leds no seu Sistema, precisa estar constatemente dando avisos, piscando os leds, etc...

Instanciamos a Classe Led, na void setup() e definimos o pino do led, entre outras infos se necessário, dai setamos ela para variavel ledWarning, outro para ledSuccess.

Depois na void loop() quando quiser fazer este led piscar, somente chamamos ledWarning.blink(100); ao invés de

digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);

E podemos criar alguma flag de abstração onde no método seja colocado se você deseja utilizar delay(x) - O que "trava" o arduino no tempo do delay, ou se deseja utilizar com msTimer ( sem travar o arduino ).

Enfim foi só uma ideia de bilbioteca, se tiverem outras, por favor coloquem suas ideias aqui, o primeiro passo é levantar as ideias e ver qual teria uma aplicação mais necessária.

Para quem ja conhece Desenvolvimento, Pensem em criamos um "Framework" para Arduino, ou até quem ja conhece Dev Web, criamos uma jQuery para arduino, ahaha...

Enfim, aguardo suas ideias, não deixem de comentar.
Assim que definido as ideias criamos uma conta no GitHub/Bitbucket e começamos o proejto de forma aberta para que a galera possa testar e debugar pra nós...
Valeu!

A ideia é boa... mas inevitavelmente vais deparar-te com o facto que o Arduino é uma plataforma pequena e quanto mais código que não utilizas é adicionado, menos memória efectiva tens para usar no teu programa.

Um exemplo é a classe EEPROM. Se fores ver a classe EEPROM adiciona overhead ao teu programa e limita a funcionalidade do que pretendes implementar. Por outro lado, se fores ver as funções disponíveis para a EEPROM na AVRlibc, vais ficar espantado com o que lá está... e muito mais eficiente que a classe do Arduino.

Olha aqui:
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

No entanto, se criares algo que tira a complexidade de alguma operação com uma classe ou adiciona algo diferente ao Arduino ou aos chips da AVR, isso sim é bem vindo. Por exemplo, fazer o relógio de tempo real com um timer interno do Arduino e um cristal de 32k (tenho um post com isso no fórum), ou criar um sistema de leitura em cadeia para o AD, tipo lê o canal 0, depois o 1, depois o 4... ou até, fazer sampling dos canais todos e ir guardando os resultados em memória sem que o utilizador tenha de se chatear.

Um sistema de menus para LCD alfanumérico e navegação por teclas.

Estás a ver a ideia?

Quanto à partilha, acho melhor em vez de criar um repositório onde tudo vai ficar perdido, criar um post aqui ou um site onde se coloca o link para o código e cada pessoa trata dos seus repositórios.

Não sei se entendi certo, mas esta com medo deu um overload de códigos? Esgotar a capacidade do arduino?

Se for pensar por esse lado, as bibliotecas de abstração poderiam ser empacotadas separadamente, tipo, você declara só o que vai usar, claro que algumas vão ter dependências, as bilbiotecas não seriam tão pesadas, pois a abstração é mínima, você vai escrever 5 linhas e economizar estas 5 linhas no código do utilizador final pra cada comando daquele que ele queria usar.

Se ele chamar ledWarning.blink(100); - 10 vezes no sistema dele, ele economizou 20 linhas, isso fora a praticidade, se ele criou uma constante ou variavel pro pino do LED é só mudar e a porta de saída do LED ja esta trocada...

Gostei da sua abordagem, faz pensar melhor no que seria interessante e no que Não seria interessante para ele, vamos pensando nestas ideias e definir o Primeiro Projeto.

Eu pensei no repositório pois é fácil de se comunicar, e criar os issues para resolver, alguém abre um problema nós verificamos se existe e resolvemos, ou alguém cadastra uma nova ideia, e nos podemos desenvolver...

Quanto mais abstracção adicionas às bibliotecas, mais código "inútil" adicionas ao programa e isso pode esgotar os 16 ou 32kb de memória de programa, ou tornar o programa mais lento.

Quando falas em economizar linhas, referes-te ao utilizador final... isso nem sempre significa que o código é eficiente, pois as linhas que o utilizador final poupou estão escondidas dentro da biblioteca que usou.

Quem tiver mais ideias que adicione aqui. :slight_smile:

Certamente que vai adicionar mais código na memória, mas só vai ser , eu fiz testes ontem, e acabei estudando o código das Bibliotecas padrão do Arduino, e TODAS fazem isso, pega a EEPROM ela só extende a Classe 'avr/EEPROM.h' abstraindo código. Dai criei uma classe minha para trabalhar com Led, com 25 métodos, o arquivo ficou em 16KB Led.cpp e compilado o código testando a classe ficou 2Kb, Só instanciando a classe, se eu usar os metodos o código varia de 4 à 5 Kb. Fiz um código com a mesma funcionalidade diretamente na void loop() deu um pouco mais que isso, mas isso acendendo 50 leds.

O que acontece é que é são diferentes abordagens, por exemplo pense que vou fazer um código para uma máquina de café, este código certamente não será pequeno, que ele ocupe 25Kb, se eu usar as bibliotecas, cada vez que eu uso 4 linhas para piscar um LED se transformam em 1 linha com a biblioteca, ou seja, se eu for fazer um código para piscar um só LED faço "na mão", mas se for pra 100 LEDS, ou se for para um sistema muito grande, que tenha diversos dispositivos seria interessante fazer desta forma.

Eu uso Frameworks para tudo, não existe para que 're-inventar' a roda, se alguém já abstraiu código, e é comprovada performance, não tem pra que fazer o mesmo.

Alguns dos métodos que criei:
Classe Led:

bool .getState();
void .setState(bool state);
int .getPin();
void .setPin(intpin);
void .turnOn();
void .turnOff();
bool .status(); // Atalho para getState();
bool .isOn(); // Atalho para status();
bool .isOff(); // Atalho para !status();
void .blink(int timeOn, int timeOff, int count);

Ainda esta semana planejo criar documentação dos teste de performance e fazer uma análise para ver se realmente é melhor usar códigos assim com o Arduino e se meus testes derem algum resultado interessante vou postar no meu blog e passo o link...

Qual seria sua ideia para montarmos as bibliotecas?

MarceloBoeira:
O que acontece é que é são diferentes abordagens, por exemplo pense que vou fazer um código para uma máquina de café, este código certamente não será pequeno, que ele ocupe 25Kb

Nos tempos pré Arduino (tipo 5 ou 6 anos antes do Arduino), fiz um sistema de controlo para uma máquina de café semi-automática com um LCD em menos de 16kB... se calhar esse foi um mau exemplo. LOL

Repara, a classe EEPROM não estendeu nada... reduziu.

Enquanto que se usares a avr/eeprom.h, vais usar uma função que aceita um vector para gravar na memória, com a EEPROM, vais ter de criar código adicional para gravar byte a byte.

Como ligas e desligas os pinos na tua biblioteca LED? (digitalWrite?)
Como fazes a temporização? (millis?)

Eu somente chutei os valores de tamanho de código, pensando em um sistema mais complexo, não foi nada "real".

Quantos as funções uso digitalWrite, e millis, você acredita que se "baixarmos" o nível seria melhor?