Indput til Rally Computer (Læst 35886x)

Offline gsborn

  • Spændingsdeler
  • ****
  • Indlæg: 50
  • Antal brugbare Indlæg: 7
  • nybegynder + Gør tingene for sjov, interesse, leg
    • Vis profil
Sv: Indput til Rally Computer
« Svar #15 Dato: Juni 02, 2015, 06:41:16 »
Der findes også en " libary " til arduino som kunne være interresant, så bliver det måske nemmere at skrive programmer med flere ting som skal gøres samtidig.
 https://github.com/thomasfredericks/Metro-Arduino-Wiring/wiki

Med venlig hilsen Gsborn

nybegynder +
Gør tingene for sjov, interesse, leg
Mine svar er kun ud fra min egen videnstand som begynder og google.

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #16 Dato: Juni 10, 2015, 10:13:32 »
Så er jeg kommet en smule hvider.

Der har været et par små problemer under vejs med at få tælleren til at tælle det rigtige antal på grund af at en impuls blev læst som to eller flere impulser, det fik jeg hurtig styr på.

Så har der drillet en del med at hvis der stod konstant signal på indgangen fra taktgiveren så ”løb” tælleren af sted, det gik noget tid før jeg fandt en løsning, men så lærte man jo også noget af det.

Så har der været problemer man at Arduino ikke har kunne fælge med i program kørslen, problemet lå i at jeg brugte Serial kommunikation  også det Delay som jeg havde lavet for at forhindre dobbelt impuls fra taktgiveren, men man lære jo hele tiden.


Men jeg er kommet til et problem som jeg ikke har haft held til at løse.

Den tæller som jeg bruger tæller op til 32767 også begynder den at tælle baglæns med modsate fortegn, hvordan løser jeg det ????



Så kæmper jeg også man nogle små problemer med måden resultatet bliver præsenteret på LCD displayet, men der skal jeg lige lege en smule hvider før jeg kaster håndklædet i ringen



Kode:
#include <Wire.h> // indlæser I2C bibloteket
#include <LiquidCrystal_I2C.h> // indlæser er specielt I2C Biblotek
LiquidCrystal_I2C LCD(0X3F,16,2); // definere Displayet adr & karekter antal samt linger



const int  taktGiver = 2;    // Pin som takt giver er forbundet til


int taktGiverImpulser  = 0;   // Tæller antallet af impulser fra taktgiveren
int taktGiverState = 0;         // Aktuelle status af taktgiver
int lasttaktGiverState = 0;     // Forrige status  af taktgiver

void setup() {
 
   LCD.init();
  LCD.backlight();
  LCD.print("RALLY COMPUTER");
  LCD.setCursor(0,8);
  LCD.print("#BEAT  2:00#");
  delay(2000);
  LCD.clear();
 
  LCD.setCursor(0, 0);
  LCD.print("TOTAL KM:");   
   
 
  LCD.setCursor(0, 1);
  LCD.print("TRIP  KM: ");
 
 
  //  Opsætter  knappen pin som et input:
  pinMode(taktGiver, INPUT);

  // Opsætter serial communication:
 Serial.begin(9600);
}


void loop() {
 
 
  int Total = 0;
 Total = (0.2175*taktGiverImpulser);
  // læset takGiver input:
  taktGiverState = digitalRead(taktGiver);

  // sammenligne taktGiverState til sin tidligere tilstand
  if (taktGiverState != lasttaktGiverState) {
    // hvis staten har ændret sig, forøge tælleren
    if (taktGiverState == HIGH) {
      // Hvis den nuværende tilstand er HIGH så  button
      // venter fra  off til on:
      taktGiverImpulser++;
     
     Serial.print("CNT  :  ");
     Serial.println(taktGiverImpulser);
     
     Serial.print("TOTAL:  ");
     Serial.println(Total);
     
     
     
    } LCD.setCursor(11, 0);
 LCD.print(Total);   
 
 
  LCD.setCursor(11, 1);
  LCD.print(taktGiverImpulser);
 
  }
  // Gemmer den aktuelle status som den sidste status til næste gennem løb og forhindre at taktGiverne kan få tælleren til at løbe
 lasttaktGiverState = taktGiverState;

 
 
 //Forsinkelse som skal forhindre flere taktGiver impulser
  delay(1);
 
}

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: Indput til Rally Computer
« Svar #17 Dato: Juni 10, 2015, 11:05:11 »
med long:
Kode:
long taktGiverImpulser  = 0;

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #18 Dato: Juni 10, 2015, 11:28:33 »
med long:
Kode:
long taktGiverImpulser  = 0;

Hold da op skulle der ikke mere til.
Har lige testet det og set hjalp

Takker

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #19 Dato: Juni 11, 2015, 23:12:33 »
Så er jeg kommet en det hvider.

Jeg har fået trip tælleren til at virke ved hastigheder op til 199 km/h  så længe jeg kun har en trip tæller i funktion, hvis bække to er i drift så går det fint til hastigheder op til 180 km/h hvis hastigheden ikke er konstant over flere km.

Så har jeg lavet det sådan at den ene trip tæller som skal bruges til split distangerer automatisk nul stiller for vær 20 km  for hvis km tallet bliver for stort på de to trip tæller så begynder den ene at halte bag efter ved høje hastigheder.

Efter at jeg har lavet det automatisk nul stillingen for vær 20 km så køre det fint, lavet et test hvor der blev kørt 450 km men den hastighed på 150 km/h uden problemer.

Der er høj hastighed over flere km som giver problemer; så i det virkelige liv bliver det ikke noget problem.

Har også roder med at få udlæsning med komme men fandt til sidste kommandoen som løst det problem.

Men en ting som stadigvæk driller  er at når trip tæller starter med at tælle så startet den med !! 0.00  og når den så kommer til 9.99 er det næste tal 10.00 og der får man så et ekstre ciffer, og efter som at positionen på displayet angiver det første ciffer så flytter talle en plads længer til højre ved skift fra 9.99 til 10.00 og et plads yderlige ved 99.99 til 100.00.

jeg har lavet plads nok displayet til de ekstra ciffer men hvis de to trip tæller ikke har sammen antal ciffer så står de to tal ikke over hinanden hvilke ikke er så kønt.

Det man kan gøre er at lave tre placeringer at taller alt efter hvor mange ciffer man har også styre hvilke der bliver brugt med !!   if (trip < 99.99 )

Eller er der en smart måde at løse det på ???


Kode:
/* TRIPMETER  af Stig Hansen

                                                                                                                     Trip 01 & Trip 02 virker med resat funktion & automatisk reset at trip 02 for vær 20 km
                                                                                                                     

D2 = Taktgiver 01 til Trip 01 som er justerbar op  og ned samt reset bar = Takt01          Pull down 10K
D3 = Taktgiver 02 til Trip 02 som er reset bar.                          = Takt02          Pull down 10K
D4 = Trip 01 juster op                                                   = TripOp          Pull down 10K
D5 = Trip 01 juster ned                                                  = TripNed         Pull down 10K
D6 = Trip 01 reset                                                       = TripReset01     Pull down 10K
D7 = Trip 02 reset.                                                      = TripReset02     Pull down 10K
*/
// Opsætning at displayet
   #include <Wire.h>                   // Indlæser I2C biblioteket
   #include <LiquidCrystal_I2C.h>      // Indlæser er specielt I2C Bibliotek
   LiquidCrystal_I2C LCD(0X3F,16,2);   // Definere displayets I2C bus adr og antal karakter samt linje



const int Takt01      = 2;   // Pin som Taktgiver 01 er forbundet til
const int Takt02      = 3;   // Pin som Taktgiver 02 er forbundet til
      int TripOp      = 4;   // Pin som juster op af Trip01 er forbundet til
      int TripNed     = 5;   // Pin som juster ned at  Trip01 er forbundet til
      int TripReset01 = 6;   // Pin som reset af Trip01 er forbundet til
      int TripReset02 = 7;   // Pin som reset at Trip02 er forbundet til
     
 

  //Tæller 01
  long Takt01Impulser  = 0;    // Tæller antallet af impulser fra taktgiveren 01 "long" gør at tælleren ikke går i minus
  int  Takt01State = 0;        // Aktuelle status af taktgiver 01
  int  LastTakt01State = 0;    // Forrige status  af taktgiver 01


  //Tæller 02
  long Takt02Impulser  = 0;    // Tæller antallet af impulser fra taktgiveren 01 "long" gør at tælleren ikke går i minus
  int  Takt02State = 0;        // Aktuelle status af taktgiver 01
  int  LastTakt02State = 0;    // Forrige status  af taktgiver 01





  void setup()
{
  // Definere Pin type
  pinMode(Takt01,INPUT);
  pinMode(Takt02,INPUT);
  pinMode(TripOp,INPUT);
  pinMode(TripNed,INPUT);
  pinMode(TripReset01,INPUT);
  pinMode(TripReset02,INPUT);
 
 
  // Opstart at display
  LCD.init();
  LCD.backlight();                 // Tænder baggrunds lyset
  LCD.print("   TRIPMETER  ");     // Opstarts tekst
  LCD.setCursor(0,1);              // Placering af opstarts teksten
  LCD.print("#  BETA  2:22  #");   // Versions nummer
  delay(5000);                     // Visnings tid 5 sek
  LCD.clear();                     // Sletter alt telst på displayet
 
 
  LCD.setCursor(0, 0);             // Placering af Permanent tekst
  LCD.print("TRIP 1:0.00   KM");   // Permanent tekst
  LCD.setCursor(0, 1);             // Placering af Permanent tekst
  LCD.print("TRIP 2:0.00   KM");   // Permanent tekst
 
 
 
 // Opstart serial communication:
                                                                                        // Serial.begin(9600);

}


void loop()
{
 
  // Tæller 01
     float Trip01 = 0;
     Trip01 = (0.002175*Takt01Impulser);   // Første tal i parentesen er hjul omkredsen skal ændres to steder hvor tripmeters skal kalibreres
     
     Takt01State = digitalRead(Takt01);   //Læser taktgivers impulser
     if (Takt01State != LastTakt01State) // sammenligne taktGiverState til sin tidligere tilstand
{
     if (Takt01State == HIGH) // hvis staten har ændret sig, forøge tælleren
{
  // Hvis den nuværende tilstand er HIGH så  button
  // venter fra  off til on:
     Takt01Impulser++;
}     
  // Skrivet Trip 01 på LCD displayet
     LCD.setCursor(7, 0);
     LCD.print(Trip01); 
     
                                                                                   // Printer Trip 01 via Serial
                                                                                   /* Serial.print("SENSOR 01 :       ");
                                                                                      Serial.println(Takt01Impulser);
                                                                                      Serial.print("TRIP 01   :       ");
                                                                                      Serial.println(Trip01);
                                                                                   */
}
     LastTakt01State = Takt01State;  // Gemmer den aktuelle status som den sidste status til næste gennem løb og forhindre at taktGiverne kan få tælleren til at løbe
   //Forsinkelse som skal forhindre flere taktGiver impulser
     delay(1);
     
     
  // Reset af Trip 01
     if (digitalRead(TripReset01))
{
     Takt01Impulser =0;
 
  // Sletter kørt km
     LCD.setCursor(07, 0);
     LCD.print("0.00   ");
}



 
  // Tæller 02
     float Trip02 = 0;
     Trip02 = (0.002175*Takt02Impulser);   // Første tal i parentesen er hjul omkredsen skal ændres to steder hvor tripmeters skal kalibreres
   
    Takt02State = digitalRead(Takt02);   //Læser taktgivers impulser
    if (Takt02State != LastTakt02State) // sammenligne taktGiverState til sin tidligere tilstand
{
     if (Takt02State == HIGH) // hvis staten har ændret sig, forøge tælleren
{
  // Hvis den nuværende tilstand er HIGH så  button
  // venter fra  off til on:
     Takt02Impulser++;
     
  // skrivet Trip 02 på LCD displayet   
     LCD.setCursor(7, 1);
     LCD.print(Trip02);
     
                                                                                   // Printer Trip 02 via Serial
                                                                                   /* Serial.print("SENSOR 02 :       ");
                                                                                      Serial.println(Takt02Impulser);
                                                                                      Serial.print("Trip 02   :       ");
                                                                                      Serial.println(Trip02);
                                                                                   */ 
     //Forsinkelse som skal forhindre flere taktGiver impulser
     delay(1);
   
}   
   
}
     LastTakt02State = Takt02State;  // Gemmer den aktuelle status som den sidste status til næste gennem løb og forhindre at taktGiverne kan få tælleren til at løbe
   
   // Reset af Trip 02
     if (digitalRead(TripReset02))
 
{
     Takt02Impulser =0;
     
  // Sletter kørt km
     LCD.setCursor(07, 1);
     LCD.print("0.00   ");
}

  // Reseter automatisk Trip 02 for vær 20 Km
  if (Trip02 > 20.00)
  {
      Takt02Impulser =0;
 
     LCD.setCursor(07, 1);
     LCD.print("0.00   ");
  }
     
   
 
}

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #20 Dato: Juni 12, 2015, 07:02:15 »
En anden mulighed  ville være at bruge 5 tæller til vær trip  tæller, en for vær ciffer.

Det skal så virker på den måde at førte tæller aktiver den næste og reserver sig selv når den kommer til 10

Det vil løse problemet med at resultatet skifter positionen.

Spørgsmål er så om arduino vil køre bedre da de tal der skal beregnes ikke bliver så stort ???

 

Offline asm7100

  • Højpas filter
  • *****
  • Indlæg: 309
  • Antal brugbare Indlæg: 17
  • Hvis det ikke kan gøres så gør det alligevel.
    • Vis profil
Sv: Indput til Rally Computer
« Svar #21 Dato: Juni 12, 2015, 09:52:59 »
Hvad med noget i stil med

If trip < 9.99 then print "space"
if trip < 99.99 then print "space"
if trip < 999.99 then print "space"

PS C er ikke mit speciale :-)
MVH
Allan Madsen

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #22 Dato: Juni 12, 2015, 10:45:28 »
Hvad med noget i stil med

If trip < 9.99 then print "space"
if trip < 99.99 then print "space"
if trip < 999.99 then print "space"

PS C er ikke mit speciale :-)

Lige nøjagtig det jeg tænkte på som en løsning, men det var jo bare det hvis det var en eller smart kommando så kunne få den til at skriver mod venstre eller et eller andet smart

 

Offline asm7100

  • Højpas filter
  • *****
  • Indlæg: 309
  • Antal brugbare Indlæg: 17
  • Hvis det ikke kan gøres så gør det alligevel.
    • Vis profil
Sv: Indput til Rally Computer
« Svar #23 Dato: Juni 12, 2015, 14:04:29 »
måske der er noget med en format komando noget med %f4 bla bla ved sproget C har noget af den slags men ikke lige hvordan det virker.
Skal selv til at lege med arduino mini pro (Lige modtaget 5 stk) og 2 stk 20x4 display med spi/i2c indgang;
MVH
Allan Madsen

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #24 Dato: Juni 12, 2015, 18:55:06 »
Jeg valte den oprindelige ide

det kom til at se sådan her ud


det virker efter hensigten har dog ikke testet skiften mellen 99.99 100.00 og nul stilingen ved 999.99 km i nu men laver en natte teste sener i dag

Kode:
LCD.setCursor(0, 0);
  LCD.print("TRIP 1:  0.00 KM");

Kode:
    if (Trip01 < 9.99)
  {
     LCD.setCursor(9, 0);
     LCD.print(Trip01);
  }
      if (Trip01 > 10.00 or Trip01 > 99.99 )
  {
     LCD.setCursor(8, 0);
     LCD.print(Trip01);
  }   
   if (Trip01 > 99.99 )
  {
     LCD.setCursor(7, 0);
     LCD.print(Trip01);
  }

Kode:
 if (Trip01 > 999.99)
  {
      Takt01Impulser =0;
 
     LCD.setCursor(07, 0);
     LCD.print("  0.00 ");
  }

 

Offline microtec

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 27
    • Vis profil
    • PicoScope PC-baserede oscilloskoper
Sv: Indput til Rally Computer
« Svar #25 Dato: Juni 12, 2015, 19:10:32 »
Jeg er heller ikke den store hej til C, men jeg mener det kan løses med denne ene linje:

LCD.printf( "%6s\n", Trip01 );

"%6s\n" laver en udskrift der fast er 6 tegn bred (6 fordi decimal-tegnet også er et tegn)
Dansk importør af PicoScope PC-baserede oscilloskoper og Lascar dataloggere.
http://www.microtec.dk

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #26 Dato: Juni 13, 2015, 12:13:44 »
Jeg er heller ikke den store hej til C, men jeg mener det kan løses med denne ene linje:

LCD.printf( "%6s\n", Trip01 );

"%6s\n" laver en udskrift der fast er 6 tegn bred (6 fordi decimal-tegnet også er et tegn)

det kan jeg ikke lige få til at virke

Jeg har fået testet skiftet mellem 99.99 og 100.00 det fungere ikke efter hensigten da den jeg ikke kunne få OR til at stoppe for udskrift at positionen som bliver bruget mellem 10.00 og 99.99 så det sidste ciffer blev skrevet 2 gang så 123,45 blev skrevet som 123.455

gik lidt får jeg luret hvad problemet var men fandt fejlen og en løsning som ser sådan her ud

Kode:
      if(Trip01 < 9.99)
  {
     LCD.setCursor(9, 0);
     LCD.print(Trip01);
  }
      if (Trip01 > 10.00 ) if (Trip01 < 99.99 )
  {
     LCD.setCursor(8, 0);
     LCD.print(Trip01);
  }   
    if (Trip01 > 99.99  )
   
  {
     LCD.setCursor(7, 0);
     LCD.print(Trip01);
  }

 

Offline microtec

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 27
    • Vis profil
    • PicoScope PC-baserede oscilloskoper
Sv: Indput til Rally Computer
« Svar #27 Dato: Juni 13, 2015, 13:36:06 »
Jeg er heller ikke den store hej til C, men jeg mener det kan løses med denne ene linje:

LCD.printf( "%6s\n", Trip01 );

"%6s\n" laver en udskrift der fast er 6 tegn bred (6 fordi decimal-tegnet også er et tegn)

det kan jeg ikke lige få til at virke


Hm, det skal kunne laves med en enkelt en simpel formaterings kommando i printf.
Som nævnt er jeg ikke så stærk i C, så prøv selv at kik på formateringsmulighederne her:

http://alvinalexander.com/programming/printf-format-cheat-sheet

Du må skulle ned i afsnittet printf - floating point numbers, så det burde nok være:

   LCD.printf("'%6.2f'", Trip01);


Dansk importør af PicoScope PC-baserede oscilloskoper og Lascar dataloggere.
http://www.microtec.dk

 

Offline stig

  • U=I*R
  • ***
  • Indlæg: 36
  • Antal brugbare Indlæg: 1
    • Vis profil
Sv: Indput til Rally Computer
« Svar #28 Dato: Juni 13, 2015, 15:19:24 »
Jeg er heller ikke den store hej til C, men jeg mener det kan løses med denne ene linje:

LCD.printf( "%6s\n", Trip01 );

"%6s\n" laver en udskrift der fast er 6 tegn bred (6 fordi decimal-tegnet også er et tegn)

det kan jeg ikke lige få til at virke


Hm, det skal kunne laves med en enkelt en simpel formaterings kommando i printf.
Som nævnt er jeg ikke så stærk i C, så prøv selv at kik på formateringsmulighederne her:

http://alvinalexander.com/programming/printf-format-cheat-sheet

Du må skulle ned i afsnittet printf - floating point numbers, så det burde nok være:

   LCD.printf("'%6.2f'", Trip01);


Ja der ser fornuftig ud når man kikke det i gemmen som du linker til men hvis men prøver får jeg denne her fejl meldinge

Arduino: 1.6.4 (Windows Vista), Board: "Arduino Nano, ATmega328"

RC_2_23.ino: In function 'void loop()':
RC_2_23:178: error: 'class LiquidCrystal_I2C' has no member named 'printf'
'class LiquidCrystal_I2C' has no member named 'printf'

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.



som jeg forstår det så er det displayet som ikke kan håndtere det

 

Offline microtec

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 27
    • Vis profil
    • PicoScope PC-baserede oscilloskoper
Sv: Indput til Rally Computer
« Svar #29 Dato: Juni 13, 2015, 18:24:35 »
Ja der ser fornuftig ud når man kikke det i gemmen som du linker til men hvis men prøver får jeg denne her fejl meldinge

Arduino: 1.6.4 (Windows Vista), Board: "Arduino Nano, ATmega328"

RC_2_23.ino: In function 'void loop()':
RC_2_23:178: error: 'class LiquidCrystal_I2C' has no member named 'printf'
'class LiquidCrystal_I2C' has no member named 'printf'

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.



som jeg forstår det så er det displayet som ikke kan håndtere det

Tja, det er ellers standard C, men efter lidt research har jeg fundet ud af at for at spare kodeplads har man lavet en skrabet version til Arduino, som "does not include the functionality to output floating point values".

Beklager forvirringen  :)
Dansk importør af PicoScope PC-baserede oscilloskoper og Lascar dataloggere.
http://www.microtec.dk