Indput til Rally Computer (Læst 43776x)

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:
1
#include <Wire.h> // indlæser I2C bibloteket<br>#include <LiquidCrystal_I2C.h> // indlæser er specielt I2C Biblotek<br>LiquidCrystal_I2C LCD(0X3F,16,2); // definere Displayet adr & karekter antal samt linger <br><br><br><br>const int  taktGiver = 2;    // Pin som takt giver er forbundet til <br><br><br>int taktGiverImpulser  = 0;   // Tæller antallet af impulser fra taktgiveren <br>int taktGiverState = 0;         // Aktuelle status af taktgiver <br>int lasttaktGiverState = 0;     // Forrige status  af taktgiver<br><br>void setup() {<br>  <br>   LCD.init();<br>  LCD.backlight();<br>  LCD.print("RALLY COMPUTER");<br>  LCD.setCursor(0,8);<br>  LCD.print("#BEAT  2:00#");<br>  delay(2000);<br>  LCD.clear();<br>  <br>  LCD.setCursor(0, 0);<br>  LCD.print("TOTAL KM:");   <br>   <br> <br>  LCD.setCursor(0, 1);<br>  LCD.print("TRIP  KM: "); <br>  <br>  <br>  //  Opsætter  knappen pin som et input:<br>  pinMode(taktGiver, INPUT);<br><br>  // Opsætter serial communication:<br> Serial.begin(9600);<br>}<br><br><br>void loop() {<br>  <br>  <br>  int Total = 0;<br> Total = (0.2175*taktGiverImpulser);<br>  // læset takGiver input:<br>  taktGiverState = digitalRead(taktGiver);<br><br>  // sammenligne taktGiverState til sin tidligere tilstand<br>  if (taktGiverState != lasttaktGiverState) {<br>    // hvis staten har ændret sig, forøge tælleren<br>    if (taktGiverState == HIGH) {<br>      // Hvis den nuværende tilstand er HIGH så  button<br>      // venter fra  off til on:<br>      taktGiverImpulser++;<br>      <br>     Serial.print("CNT  :  ");<br>     Serial.println(taktGiverImpulser);<br>      <br>     Serial.print("TOTAL:  ");<br>     Serial.println(Total);<br>      <br>      <br>      <br>    } LCD.setCursor(11, 0);<br> LCD.print(Total);   <br> <br> <br>  LCD.setCursor(11, 1);<br>  LCD.print(taktGiverImpulser);<br>  <br>  }<br>  // 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 <br> lasttaktGiverState = taktGiverState;<br><br>  <br>  <br> //Forsinkelse som skal forhindre flere taktGiver impulser <br>  delay(1);<br>  <br>}

 

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:
1
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:
1
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:
1
/* TRIPMETER  af Stig Hansen<br><br>                                                                                                                     Trip 01 & Trip 02 virker med resat funktion & automatisk reset at trip 02 for vær 20 km <br>                                                                                                                     <br><br>D2 = Taktgiver 01 til Trip 01 som er justerbar op  og ned samt reset bar = Takt01          Pull down 10K<br>D3 = Taktgiver 02 til Trip 02 som er reset bar.                          = Takt02          Pull down 10K <br>D4 = Trip 01 juster op                                                   = TripOp          Pull down 10K<br>D5 = Trip 01 juster ned                                                  = TripNed         Pull down 10K<br>D6 = Trip 01 reset                                                       = TripReset01     Pull down 10K<br>D7 = Trip 02 reset.                                                      = TripReset02     Pull down 10K<br>*/<br>// Opsætning at displayet <br>   #include <Wire.h>                   // Indlæser I2C biblioteket<br>   #include <LiquidCrystal_I2C.h>      // Indlæser er specielt I2C Bibliotek<br>   LiquidCrystal_I2C LCD(0X3F,16,2);   // Definere displayets I2C bus adr og antal karakter samt linje<br><br><br><br>const int Takt01      = 2;   // Pin som Taktgiver 01 er forbundet til<br>const int Takt02      = 3;   // Pin som Taktgiver 02 er forbundet til<br>      int TripOp      = 4;   // Pin som juster op af Trip01 er forbundet til <br>      int TripNed     = 5;   // Pin som juster ned at  Trip01 er forbundet til<br>      int TripReset01 = 6;   // Pin som reset af Trip01 er forbundet til<br>      int TripReset02 = 7;   // Pin som reset at Trip02 er forbundet til<br>     <br>  <br><br>  //Tæller 01<br>  long Takt01Impulser  = 0;    // Tæller antallet af impulser fra taktgiveren 01 "long" gør at tælleren ikke går i minus<br>  int  Takt01State = 0;        // Aktuelle status af taktgiver 01<br>  int  LastTakt01State = 0;    // Forrige status  af taktgiver 01<br><br><br>  //Tæller 02<br>  long Takt02Impulser  = 0;    // Tæller antallet af impulser fra taktgiveren 01 "long" gør at tælleren ikke går i minus<br>  int  Takt02State = 0;        // Aktuelle status af taktgiver 01<br>  int  LastTakt02State = 0;    // Forrige status  af taktgiver 01<br><br><br><br><br><br>  void setup() <br>{<br>  // Definere Pin type<br>  pinMode(Takt01,INPUT);<br>  pinMode(Takt02,INPUT);<br>  pinMode(TripOp,INPUT);<br>  pinMode(TripNed,INPUT);<br>  pinMode(TripReset01,INPUT);<br>  pinMode(TripReset02,INPUT);<br>  <br> <br>  // Opstart at display<br>  LCD.init();<br>  LCD.backlight();                 // Tænder baggrunds lyset<br>  LCD.print("   TRIPMETER  ");     // Opstarts tekst <br>  LCD.setCursor(0,1);              // Placering af opstarts teksten <br>  LCD.print("#  BETA  2:22  #");   // Versions nummer<br>  delay(5000);                     // Visnings tid 5 sek<br>  LCD.clear();                     // Sletter alt telst på displayet<br>  <br>  <br>  LCD.setCursor(0, 0);             // Placering af Permanent tekst <br>  LCD.print("TRIP 1:0.00   KM");   // Permanent tekst<br>  LCD.setCursor(0, 1);             // Placering af Permanent tekst <br>  LCD.print("TRIP 2:0.00   KM");   // Permanent tekst<br>  <br>  <br> <br> // Opstart serial communication:<br>                                                                                        // Serial.begin(9600);<br><br>}<br><br><br>void loop()<br>{<br>  <br>  // Tæller 01<br>     float Trip01 = 0;<br>     Trip01 = (0.002175*Takt01Impulser);   // Første tal i parentesen er hjul omkredsen skal ændres to steder hvor tripmeters skal kalibreres <br>     <br>     Takt01State = digitalRead(Takt01);   //Læser taktgivers impulser <br>     if (Takt01State != LastTakt01State) // sammenligne taktGiverState til sin tidligere tilstand<br>{<br>     if (Takt01State == HIGH) // hvis staten har ændret sig, forøge tælleren<br>{<br>  // Hvis den nuværende tilstand er HIGH så  button<br>  // venter fra  off til on:<br>     Takt01Impulser++;<br>}      <br>  // Skrivet Trip 01 på LCD displayet <br>     LCD.setCursor(7, 0);<br>     LCD.print(Trip01);  <br>     <br>                                                                                   // Printer Trip 01 via Serial<br>                                                                                   /* Serial.print("SENSOR 01 :       "); <br>                                                                                      Serial.println(Takt01Impulser);<br>                                                                                      Serial.print("TRIP 01   :       "); <br>                                                                                      Serial.println(Trip01);<br>                                                                                   */<br>}<br>     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 <br>   //Forsinkelse som skal forhindre flere taktGiver impulser <br>     delay(1);<br>     <br>     <br>  // Reset af Trip 01<br>     if (digitalRead(TripReset01))<br>{<br>     Takt01Impulser =0;<br>  <br>  // Sletter kørt km<br>     LCD.setCursor(07, 0);<br>     LCD.print("0.00   "); <br>}<br><br><br><br>  <br>  // Tæller 02<br>     float Trip02 = 0;<br>     Trip02 = (0.002175*Takt02Impulser);   // Første tal i parentesen er hjul omkredsen skal ændres to steder hvor tripmeters skal kalibreres <br>    <br>    Takt02State = digitalRead(Takt02);   //Læser taktgivers impulser <br>    if (Takt02State != LastTakt02State) // sammenligne taktGiverState til sin tidligere tilstand<br>{<br>     if (Takt02State == HIGH) // hvis staten har ændret sig, forøge tælleren<br>{<br>  // Hvis den nuværende tilstand er HIGH så  button<br>  // venter fra  off til on:<br>     Takt02Impulser++;<br>     <br>  // skrivet Trip 02 på LCD displayet   <br>     LCD.setCursor(7, 1);<br>     LCD.print(Trip02); <br>     <br>                                                                                   // Printer Trip 02 via Serial<br>                                                                                   /* Serial.print("SENSOR 02 :       ");<br>                                                                                      Serial.println(Takt02Impulser);<br>                                                                                      Serial.print("Trip 02   :       "); <br>                                                                                      Serial.println(Trip02);<br>                                                                                   */  <br>     //Forsinkelse som skal forhindre flere taktGiver impulser <br>     delay(1);<br>   <br>}   <br>    <br>}<br>     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 <br>   <br>   // Reset af Trip 02<br>     if (digitalRead(TripReset02))<br>  <br>{<br>     Takt02Impulser =0;<br>     <br>  // Sletter kørt km<br>     LCD.setCursor(07, 1);<br>     LCD.print("0.00   "); <br>}<br><br>  // Reseter automatisk Trip 02 for vær 20 Km<br>  if (Trip02 > 20.00)<br>  {<br>      Takt02Impulser =0;<br>  <br>     LCD.setCursor(07, 1);<br>     LCD.print("0.00   "); <br>  }<br>     <br>   <br>  <br>}

 

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:
1
LCD.setCursor(0, 0);<br>  LCD.print("TRIP 1:  0.00 KM");

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

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

 

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:
1
      if(Trip01 < 9.99)<br>  {<br>     LCD.setCursor(9, 0);<br>     LCD.print(Trip01); <br>  }<br>      if (Trip01 > 10.00 ) if (Trip01 < 99.99 )<br>  {<br>     LCD.setCursor(8, 0);<br>     LCD.print(Trip01); <br>  }    <br>    if (Trip01 > 99.99  )<br>   <br>  {<br>     LCD.setCursor(7, 0);<br>     LCD.print(Trip01); <br>  }

 

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