Go Down

Topic: contamarce per moto (Read 628 times) previous topic - next topic

rikip98

Jul 17, 2014, 02:20 am Last Edit: Jul 17, 2014, 05:30 am by Coding Badly Reason: 1
salve a tutti sono uno nuovo di questo forum. ho comprato da poco arduino uno e vorrei iniziare a programmarlo . non e la prima volta che uso il linguaggio c+ , ma vorrei qualche consiglio da voi piu esperti di me su un progetto. il progetto riguarda di realizzare un contamarce per moto diciamo un po universale pensando a farlo funzionare con dei pulsanti; uno che "sale" la marcia e l'altro che "scende" gia qualcosina l'o fatta diciamo; su un display a 7 segmenti ora invece lo vorrei fare su un display lcd con collegamento di tipo seriale analogico; poi volevo mettere anche un'altro tasto che e quello della folla che al momento che si tiene premuto deve comparire sul display F e poi quando lo rilascio deve ritornare di nuovo a 1
il progetto che ho testato io e questo e funziona manca solo la folla
Code: [Select]

#define BUTTON_DOWN 11
#define BUTTON_UP 12

int ledPinA =  7;    // LED connected to digital pin 3
int ledPinB =  6;    // LED connected to digital pin 4
int ledPinC =  4;    // LED connected to digital pin 5
int ledPinD =  2;    // LED connected to digital pin 6
int ledPinE =  3;    // LED connected to digital pin 7
int ledPinF =  9;    // LED connected to digital pin 8
int ledPinG =  10;    // LED connected to digital pin 9
int ledPinP =  5;   // LED connected to digital pin 10

int val_down = 0;
int old_val_down = 0;
int val_up = 0;
int old_val_up = 0;
int state = 0;
int gear = 1;

// The setup() method runs once, when the sketch starts

void setup()   {            
 pinMode(BUTTON_DOWN, INPUT);
 pinMode(BUTTON_UP, INPUT);
 
 // initialize the digital pin as an output:
 pinMode(ledPinA, OUTPUT);
 pinMode(ledPinB, OUTPUT);
 pinMode(ledPinC, OUTPUT);
 pinMode(ledPinD, OUTPUT);
 pinMode(ledPinE, OUTPUT);
 pinMode(ledPinF, OUTPUT);
 pinMode(ledPinG, OUTPUT);  
 pinMode(ledPinP, OUTPUT);
 
 // initialize serial communication:
 Serial.begin(9600);
}

void led0()
{
 digitalWrite(ledPinA, HIGH);
 delay(50);
 digitalWrite(ledPinA, HIGH);
 delay(50);
 digitalWrite(ledPinB, HIGH);
 digitalWrite(ledPinC, LOW);
 digitalWrite(ledPinD, HIGH);
 digitalWrite(ledPinE, LOW);  
 digitalWrite(ledPinF, HIGH);  
 digitalWrite(ledPinG, LOW);
 digitalWrite(ledPinP, HIGH);
}

void led1()
{
 digitalWrite(ledPinA, HIGH);
 digitalWrite(ledPinB, LOW);
 delay(50);
 digitalWrite(ledPinB, LOW);
 delay(50);
 digitalWrite(ledPinC, LOW);
 digitalWrite(ledPinD, HIGH);
 digitalWrite(ledPinE, HIGH);  
 digitalWrite(ledPinF, HIGH);  
 digitalWrite(ledPinG, HIGH);
 digitalWrite(ledPinP, HIGH);
}

void led2()
{
 digitalWrite(ledPinA, LOW);
 digitalWrite(ledPinB, LOW);
 digitalWrite(ledPinC, HIGH);
 delay(50);
 digitalWrite(ledPinC, HIGH);
 delay(50);
 digitalWrite(ledPinD, LOW);
 digitalWrite(ledPinE, LOW);  
 digitalWrite(ledPinF, HIGH);  
 digitalWrite(ledPinG, LOW);
 digitalWrite(ledPinP, HIGH);
}

void led3()
{
 digitalWrite(ledPinA, LOW);
 digitalWrite(ledPinB, LOW);
 digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
 delay(50);
 digitalWrite(ledPinD, LOW);
 delay(50);
 digitalWrite(ledPinE, HIGH);  
 digitalWrite(ledPinF, HIGH);  
 digitalWrite(ledPinG, LOW);
 digitalWrite(ledPinP, HIGH);
}

void led4()
{
digitalWrite(ledPinA, HIGH);
 digitalWrite(ledPinB, LOW);
 digitalWrite(ledPinC, LOW);
 digitalWrite(ledPinD, HIGH);
 digitalWrite(ledPinE, HIGH);
 delay(50);
 digitalWrite(ledPinE, HIGH);
 delay(50);  
 digitalWrite(ledPinF, LOW);  
 digitalWrite(ledPinG, LOW);
 digitalWrite(ledPinP, HIGH);
}

void led5()
{
 digitalWrite(ledPinA, LOW);
 digitalWrite(ledPinB, HIGH);
 digitalWrite(ledPinC, LOW);
 digitalWrite(ledPinD, LOW);
 digitalWrite(ledPinE, HIGH);  
 digitalWrite(ledPinF, LOW);
 delay(50);
 digitalWrite(ledPinF, LOW);
 delay(50);
 digitalWrite(ledPinG, LOW);
 digitalWrite(ledPinP, HIGH);
}

void led6()
{
 digitalWrite(ledPinA, LOW);
 digitalWrite(ledPinB, HIGH);
 digitalWrite(ledPinC, LOW);
 digitalWrite(ledPinD, LOW);
 digitalWrite(ledPinE, LOW);  
 digitalWrite(ledPinF, LOW);  
 digitalWrite(ledPinG, LOW);
 delay(50);
 digitalWrite(ledPinG, LOW);
 delay(50);
 digitalWrite(ledPinP, HIGH);
}
void led7()
{
 digitalWrite(ledPinA, LOW);
 digitalWrite(ledPinB, LOW);
 digitalWrite(ledPinC, LOW);
 digitalWrite(ledPinD, LOW);
 digitalWrite(ledPinE, LOW);  
 digitalWrite(ledPinF, LOW);  
 digitalWrite(ledPinG, LOW);
 digitalWrite(ledPinP, HIGH);
 delay(50);
 digitalWrite(ledPinP, LOW);
 delay(50);

}



void setLed(int number)
{
 switch (number) {
   
   case 1:  
     led1();
     break;
   case 2:  
     led2();
     break;
   case 3:  
     led3();
     break;
   case 4:  
     led4();
     break;
   case 5:  
     led5();
     break;
   case 6:  
     led6();
     break;
   
     
   

 }
}
             
// the loop() method runs over and over again,
// as long as the Arduino has power

void oldloop()                    
{
                  // wait for a second
 led0();
 delay(1000);                  // wait for a second
 led1();
 delay(1000);                  // wait for a second
 led2();
 delay(1000);                  // wait for a second
 led3();
 delay(1000);                  // wait for a second
 led4();
 delay(1000);                  // wait for a second
 led5();
 delay(1000);                  // wait for a second
 led6();
 delay(1000);                  // wait for a second
 led7();
 delay(1000);                  // wait for a second
                  // wait for a second
}

void loop()
{
   val_up = digitalRead(BUTTON_UP);
   if ((val_up == HIGH) && (old_val_up == LOW)) {
     gear += 1;
     Serial.print("gear number:  ");
     Serial.println(gear, DEC);
     setLed(gear);
     delay(100);
   }
   old_val_up = val_up;

   val_down = digitalRead(BUTTON_DOWN);
   if ((val_down == HIGH) && (old_val_down == LOW)) {
     gear -= 1;
     Serial.print("gear number:  ");
     Serial.println(gear, DEC);
     setLed(gear);
     delay(100);
   }
   old_val_down = val_down;
   
   if (gear >= 6) {
     gear = 6;
   }
   if (gear <= 1) {
     gear = 1;
   }
   
   


}




aspetto le vostre risposte.
grazie anticipatamente per l'attenzione.

nid69ita

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
my name is IGOR, not AIGOR

tapirinho

Ciao.
Non ho capito cosa ti serve...
Hai bisogno di aiuto per utilizzare l'LCD? O non sai come implementare la condizione che rileva la folle?

Camp78

Ciao, riesumo questo post datato perchè l'utilità di esso s'è presentata solo ora.
Spero che ripkit98 abbia risolto il suo problema e lo ringrazio per aver condiviso lo sketch.
Ho preso spunto da esso per adattarlo alle mie esigenze e devo dire che ho quasi realizzato ciò che volevo, oltre ad aggiungere la parte che riguarda la folle, voglio aggiungere quella per memorizzare l'ultima marcia inserita prima di togliere l'alimentazione cosicché al successivo avvio venga mostrata la marcia attualmente inserita (sempre che il pedle non venga spostato alimentazione staccata, cosa che comporta il posizionamento in folle per ripristinare il tutto).
Qui di seguito il codice.

Code: [Select]

 // Contamarce, o meglio definito, indicatore di marcia inserita.
 // Hardware utilizzato per test:
 // Arduino UNO
 // Due finecorsa a tre poli (NO, NC e Comune)
 // Due resistenze 10kOhm
 //
 //
 // Codice studiato e adattato By Camp
 //
 // Sketch di base scritto da rikip98
 //

 #include <EEPROM.h>
 
// pin interruttori
 #define pin_giu 2 // pin interruttore di marcia giu
 #define pin_su 3  // pin intterruttore di marcia su
 #define pin_n 12  // pin segnale folle
 
 //definizione pin display
  int DP=4;
  int C=5;
  int D=6;
  int E=7;
  int G=8;
  int F=9;
  int A=10;
  int B=11;

  int a=0;
  int value = 0;
  int val_n = 0;
  int val_giu = 0;
  int old_val_giu = 0;
  int val_su = 0;
  int old_val_su = 0;
  int state = 0;
  int gear = 1;
  int datoeeprom = 0;
 
void setup() {

  pinMode(G, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(DP, OUTPUT);

  pinMode(pin_su, INPUT);
  pinMode(pin_giu, INPUT);
  pinMode(pin_n, INPUT);
 
}
/*void oldloop()                   
{
                  // wait for a second
 numero_1();
 delay(1000);                  // wait for a second
 lettera_n();
 delay(1000);                  // wait for a second
 numero_2();
 delay(1000);                  // wait for a second
 numero_3();
 delay(1000);                  // wait for a second
 numero_4();
 delay(1000);                  // wait for a second
 numero_5();
 delay(1000);                  // wait for a second
 numero_6();
 delay(1000);                  // wait for a second
}

*/
void loop() {
value = EEPROM.read(a);
  if ( value == 1) {
  numero_1;
  gear == 1;
  }
  if (value == 2){
   lettera_n;
   gear == 2;
  }
  if (value == 3){
    numero_2;
    gear == 3;
  }
  if (value == 4){
    numero_3;
    gear == 4;
  }
  if (value == 5){
    numero_4;
    gear == 5;
  }
  if (value == 6){
    numero_5;
    gear == 6;
  }
  if (value == 7){
    numero_6;
    gear == 7;
  }
  val_n = digitalRead (pin_n);
  if (val_n == HIGH) {
    lettera_n();
    EEPROM.write(a,datoeeprom);
   delay(0005);
   }


 val_su = digitalRead(pin_su);
   if ((val_su == HIGH) && (old_val_su == LOW)) {
     gear += 1;
     setnum(gear);
     EEPROM.write(a,datoeeprom);
     delay(250);
   }
   old_val_su = val_su;
   
    val_giu = digitalRead(pin_giu);
   if ((val_giu == HIGH) && (old_val_giu == LOW)) {
     gear -= 1;
     setnum(gear);
     EEPROM.write(a,datoeeprom);
     delay(250);
   }
   old_val_giu = val_giu; 
   
  if (gear >= 7) {
     gear = 7;
   }
   if (gear <= 1) {
     gear = 1;
   }

}

   

  void lettera_n(){
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
      digitalWrite(E, LOW);
      digitalWrite(F, HIGH);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_1(){
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(DP, HIGH);
}
void numero_2(){
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, HIGH);
      digitalWrite(D, LOW);
      digitalWrite(E, LOW);
      digitalWrite(F, HIGH);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_3(){
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
      digitalWrite(E, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_4(){
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(F, LOW);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_5(){
      digitalWrite(A, LOW);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
      digitalWrite(E, HIGH);
      digitalWrite(F, LOW);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_6(){
      digitalWrite(A, LOW);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
      digitalWrite(E, LOW);
      digitalWrite(F, LOW);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}

void setnum (int number){
  switch (number){
    case 1:
    numero_1();
    //EEPROM.write(a,datoeeprom);
    //delay(500);
    break;

    case 2:
    lettera_n();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 3:
    numero_2();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 4:
    numero_3();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 5:
    numero_4();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 6:
    numero_5();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 7:
    numero_6();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;
  }
}


vbextreme

contare le marce con due o piu sensori è difficilissimo e per di più veramente poco affidabile!
L'unica vera soluzione è rilevare il numero giri motore e la velocità effettiva, solo a quel punto si potrà sapere in che marcia si è compresa la folle.
Easy framework linguaggio C: https://github.com/vbextreme/EasyFramework
http://vbextreme.netai.net/

Warning: Causa assurde limitazioni di questo forum non potete cliccare sul link nella firma, vi toccherà un copia/incolla

Camp78

testando con la breadboard non sta dando problemi, comunque ho il data logger per rilevarmi i dati di contagiri e tachimetro in modo da fare come dici tu.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy