Boas,
Sou completamente novo a programar, o código que vou colocar de seguida é a minha primeira tentativa, depois dos exemplos e tutoriais básicos, de escrever algumas linhas de código para uma função específica.
Pretendo que o Arduino detecte, através de sensores Hall Effect, a passagem de comboios por um determinado ponto na linha e que de seguida execute uma série de funções.
Quando uma locomotiva, com um íman colado no fundo, activa um sensor, o sketch deve fazer o seguinte:
- Identificar o sensor que foi activado;
- Saber qual a direcção que o comboio leva;
- Ligar os leds vermelhos e desligar os verdes, correspondentes aos blocos que estão em utilização
- Ligar os leds verdes e desligar os vermelhos, correspondentes aos blocos que deixaram de estar em utilização
O sketch que preparei faz o que eu pretendo mas ficou uma "confusão". E como o projecto final vai implicar qualquer coisa como 40 sensores, 80 leds e afins, precisava da vossa ajuda para saber o que posso/devo alterar para ficar com um código mais "limpo".
Obrigado
Miguel
/* Detecção de blocos
--------------
Este Sketch faz com que o Arduino detecte, através de sensores Hall Effect, a passagem
de comboios por um determinado ponto na linha e que de seguida execute uma série de
funções.
Quando uma locomotiva, com um íman colado no fundo, activa um sensor, o sketch deve
fazer o seguinte:
- Identificar o sensor que foi activado;
- Saber qual a direcção que o comboio leva;
- Ligar os leds vermelhos e desligar os verdes, correspondentes aos blocos que estão em utilização
- Ligar os leds verdes e desligar os vermelhos, correspondentes aos blocos que deixaram de estar em utilização
O pin 3 dos sensores está ligado ao arduino aos pins 9, 10 e 11
*/
int HallPin [3] = {9, 10, 11};
int HallId[3] = {1, 2, 3};
int LedGreen [3] = {2, 4, 6};
int LedRed [3] = {3, 5, 7};
int i;
int HallPinStatus [3];
int Position; //Indica qual o sensor que foi activado
int LastPosition; //Indica qual foi o ultimo sensor a ser activado
int LastLastPosition; //Indica qual foi o penultimo sensor a ser activado
int Direction; //Indica qual a direcção. Se passou do sensor 1 para o 2,
//então está a ir no sentido ascendente(2), se passa do
//sensor 2 para o 1, está no sentido descendente(1)
void setup() {
//Abrir a porta série
Serial.begin(115200);
// Definir os PINs dos sensores
for (i = 0; i < 3; i++) {
pinMode (HallPin[i], INPUT);
}
// Definir os PINs dos leds verdes
for (i = 0; i < 3; i++) {
pinMode (LedGreen[i], OUTPUT);
}
// Definir os PINs dos leds vermelhos
for (i = 0; i < 3; i++) {
pinMode (LedRed[i], OUTPUT);
}
}
void loop() {
// Ligar os Leds verdes
for (i = 0; i < 3; i++) {
digitalWrite (LedGreen[i], HIGH);
}
// Ler o estado dos sensores
for (i = 0; i < 3; i++) {
HallPinStatus [i] = digitalRead(HallPin[i]);
Serial.print(" - Sensor ");
Serial.print(HallId[i]);
Serial.print(": ");
Serial.print(HallPinStatus[i]);
}
// O que fazer quando o sensor 1 está Ligado
if (HallPinStatus[0] == LOW) {
digitalWrite(LedGreen[0], LOW);
digitalWrite(LedGreen[1], LOW);
digitalWrite(LedGreen[2], HIGH);
digitalWrite(LedRed[0], HIGH);
digitalWrite(LedRed[1], HIGH);
digitalWrite(LedRed[2], LOW);
Position = 1;
}
// O que fazer quando o sensor 2 está Ligado
else if (HallPinStatus[1] == LOW) {
digitalWrite(LedGreen[1], LOW);
digitalWrite(LedGreen[2], LOW);
digitalWrite(LedGreen[0], HIGH);
digitalWrite(LedRed[1], HIGH);
digitalWrite(LedRed[2], HIGH);
digitalWrite(LedRed[0], LOW);
Position = 2;
}
// O que fazer quando o sensor 3 está Ligado
else if (HallPinStatus[2] == LOW) {
digitalWrite(LedGreen[2], LOW);
digitalWrite(LedGreen[0], LOW);
digitalWrite(LedGreen[1], HIGH);
digitalWrite(LedRed[2], HIGH);
digitalWrite(LedRed[0], HIGH);
digitalWrite(LedRed[1], LOW);
Position = 3;
}
//Estabelecer a direcção seguida
if (LastLastPosition > LastPosition) {
Direction = 1;
}
else if (LastLastPosition < LastPosition) {
Direction = 2;
}
else {
Direction = 0;
}
//Estabelecer e manter a ultima posição conhecida
if (Position != LastPosition) {
LastLastPosition = LastPosition;
LastPosition = Position;
}
else {
LastPosition = Position;
}
Serial.println("");
Serial.print(" - Last Last Position: ");
Serial.print(LastLastPosition);
Serial.print(" - Last Position: ");
Serial.print(LastPosition);
Serial.print(" - Position: ");
Serial.print(Position);
Serial.print(" - Direction: ");
Serial.print(LastDirection);
Serial.println("");
Serial.println("");
}