LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: m2snd em 28 de Setembro de 2014, 16:35
-
Boa tarde amigos!
Preciso da vossa ajuda :).
Tenho um projecto em que consiste fazer rodar um rotary encoder ao mesmo tempo que faz a contagem visual num display de 7 segmentos. Depois de uma pesquisa, encontrei um código no google que basicamente é o que pretendo. O problema é que o código é para um segmento com um positivo comum e o display que tenho o comum é negativo. Que alterações devo fazer?
Agradeço antecipadamente a vossa ajuda
/*
inspired by circuits at home
http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino
*/
#define encPinA 14 // rotary encoder pin A
int encALast;
#define encPinB 15 // rotary encoder pin B
int theNumber = 0; // 3.8.2011
int val;
int segments[7] = {12,13,3,4,5,10,9}; // pins, the segments are attached to
//int segments[7] = {3,4,9,11,12,5,6}; // pins, the segments are attached to
int digits[2] = {7,11}; // common anode of each digit
int buttonPin = 2; // pin, where the start stop button is connected
int lastButtonState;
boolean timer = false;
long myStartTime;
long theSecond = 1000;
byte seven_seg_segments[10][7] = {
{1,1,1,1,1,1,0}, // = 0
{0,1,1,0,0,0,0}, // = 1
{1,1,0,1,1,0,1}, // = 2
{1,1,1,1,0,0,1}, // = 3
{0,1,1,0,0,1,1}, // = 4
{1,0,1,1,0,1,1}, // = 5
{1,0,1,1,1,1,1}, // = 6
{1,1,1,0,0,0,0}, // = 7
{1,1,1,1,1,1,1}, // = 8
{1,1,1,1,0,1,1} // = 9
};
void setup() {
// Serial.begin(9600); // starts serial communication
pinMode(encPinA, INPUT); // set rotary encoder A pin as input
pinMode(encPinB, INPUT); // set rotary encoder B pin as input
digitalWrite(encPinA, HIGH); // switches internal drop down resistors on
digitalWrite(encPinB, HIGH); // switches internal drop down resistors on
pinMode(buttonPin,INPUT);
for (int i=0; i<7; i++){
pinMode(segments[i], OUTPUT); // sets the seven segment outputs
}
for (int i=0; i<2; i++){
pinMode(digits[i], OUTPUT); // sets the seven segment outputs
}
}
void sevenSegWrite(int thePosition, int digit) { // write a number to a seven segment digit
for (int i = 0; i < 7; i++) {
if (seven_seg_segments[digit][i] == 1){
digitalWrite(segments[i], LOW);
}
else {
digitalWrite(segments[i], HIGH);
}
}
digitalWrite(digits[thePosition], HIGH);
delayMicroseconds(200);
digitalWrite(digits[thePosition], LOW);
delayMicroseconds(200);
}
void clearDisplay() { // clear the display
for (int i=0; i<5; i++){
digitalWrite(digits[i], LOW);
}
}
void showNumber(){ // show the number
char szZahl[1];
sprintf(szZahl, "%d", theNumber);
int ergebnis = szZahl[0] - '0';
if (ergebnis>-1){
sevenSegWrite(1,ergebnis);
delayMicroseconds(10);
} else {
sevenSegWrite(1,0);
delayMicroseconds(10);
}
delay(1);
clearDisplay();
}
void loop() {
// read rotary encoder
if (encALast!=digitalRead(encPinA)){
if ((digitalRead(encPinA)==LOW)&&(digitalRead(encPinB)==LOW)) {
theNumber++;
if (theNumber>9) theNumber=0;
}
if ((digitalRead(encPinA)==LOW)&&(digitalRead(encPinB)==HIGH)) {
theNumber--;
if (theNumber<0) theNumber=9;
}
}
encALast=digitalRead(encPinA);
clearDisplay();
showNumber();
delay(1);
}
-
Comprar um display 7 segmentos de ânodo comum ou esperar que alguém escreva novo código para cátodo comum, de preferência com um circuito anexado para facilitar.
-
Ou então aprender a escrever o próprio código... alterar de ânodo comum para cátodo comum é básico, se entendesses o que esse código faz era meio caminho andado e não demorava mais de 1 minuto...
-
Ou então aprender a escrever o próprio código... alterar de ânodo comum para cátodo comum é básico, se entendesses o que esse código faz era meio caminho andado e não demorava mais de 1 minuto...
Ok...não era propriamente esse tipo de respostas que estava à espera.
Pode ser básico para vocês, mas para quem não sabe e quer aprender pergunta. E é o que estou a fazer...
-
Tens de entender que apesar de teres vários membros deste fórum capazes de resolver essa situação num instante, torna-se chato ver uma grande parte das perguntas deste fórum parecerem pedidos de ajuda para resolver trabalhos de casa (que pode ser ou não o teu caso).
No teu caso, pelo menos soubeste usar o google para te aproximares da resolução do problema (há quem nem isso saiba fazer :o), mas paraste aí. Não mostraste qualquer conhecimento sobre o código que enviaste, e pediste ajuda sem explicar qual o fim a que se destina o teu projeto, levantando dúvidas sobre se não é um trabalho que deverias utilizar para aprender em vez de arranjar quem to resolva. É que se for apenas esse o fim, há aqui pessoas que lhes pagam à hora para fazer isso.
Muda a pergunta de "ponham-me este código a fazer isto", para algo do género "entendi que este código faz XX e YY, não entendo as diferenças entre cátodo comum e ánodo comum, podiam explicar o que significam e como sugerem que altere o código", e vais ver que tens melhores respostas.
Considera que a comunidade não está aqui para te ajudar a resolver os problemas, mas a ajudar-te a aprenderes como tú próprio os resolver (seguindo o provérbio Chinês: "Não dê o peixe, ensine a pescar").
-
jm_araujo, se quiseres ajudar (o que agradeço), ajuda. Lições de moral dispenso de alguém que não conheço.
Posso ter formulado mal a questão. Não tenho que me justificar, mas posso dizer-te que não acordei hoje de manhã e lembrei-me disto..... Se consegues resolver num minuto os meus parabéns!!!
Não sou nenhum menino de escola que tem que apresentar nenhum trabalho. Sou apenas um individuo com curiosidade, gosta de programação e electrónica, não tenho qualquer formação académica nesta àrea. O pouco que sei foi a perguntar e a pesquisar no google.
Aliás, tenho a minha casa completamente domotizada graças ajuda de malta disponivel deste forum e de outros, mas isso já foi algum tempo atrás pois parece que agora os membros andam um pouco impacientes em ajudar.
E acho que é bom ficarmos por aqui.
-
jm_araujo, se quiseres ajudar (o que agradeço), ajuda. Lições de moral dispenso de alguém que não conheço.
Posso ter formulado mal a questão. Não tenho que me justificar, mas posso dizer-te que não acordei hoje de manhã e lembrei-me disto..... Se consegues resolver num minuto os meus parabéns!!!
Não sou nenhum menino de escola que tem que apresentar nenhum trabalho. Sou apenas um individuo com curiosidade, gosta de programação e electrónica, não tenho qualquer formação académica nesta àrea. O pouco que sei foi a perguntar e a pesquisar no google.
Aliás, tenho a minha casa completamente domotizada graças ajuda de malta disponivel deste forum e de outros, mas isso já foi algum tempo atrás pois parece que agora os membros andam um pouco impacientes em ajudar.
E acho que é bom ficarmos por aqui.
Não sabemos quem está do outro lado, o que o Araujo escreveu é totalmente normal e não se trata nem de
longe nem de perto de lições de moral ... pessoalmente até acho que ele foi muito comedido, educado e
está subjacente a sua vontade de ajudar.
Mas numa coisa tens razão, falta a paciência e a pachorra para ajudar nestas situações que são constantes
... é o mal dos arduinos, digo eu, mas sou suspeito nesse tipo de comentários.
-
Não é impaciência, é tratarem do fórum como se se trata-se de um rent-a-coder gratuito..
-
Resultado final . Isto é um AP Altitude para o meu FSX. https://vimeo.com/117480149 (https://vimeo.com/117480149)
-
Na função byte seven_seg_segments[10][7],
esperimenta inverter os uns e zeros, só assim derepente.
-
Precisamente Electropepper, foi isso que na altura me ocorreu, experimentei e resultou!
-
Boa, percebeste porquê ?
-
O google é um grande companheiro ;-) !