Så har jeg modtaget et stk. Nano og et LED display.
Har også været i gang med at lege med det grundlæggende programmering, for lige som at få lidt føling med sproget.
Jeg har lavet et lille program hvor der det led på pin 13 skal blinke og det bliver skrevet noget tekst på displayet.
De to funktioner forstyrre hinanden så det ikke køre flydende.
Fra linge 19 til 22 har vi koden til den blinkende led
Fra linge 24 til 30 har vi koden til teksten på displayet.
De to koder funger fint særskilt, men når de bække er i programmet så sked der jo det at når vi kommer til linge 31 så bliver der jo læst fra linge 9 og ned så teksten stoppet i 2 sek på grund af det delay der er i linge 20 og 22.
kan man bruge nogle ( ) eller noget { } eller en helt anden løsning så det to ”loop” køre uden af forstyrre hinanden.
int ledpin = 13;
#include <Wire.h> // indlæser I2C bibloteket
#include <LiquidCrystal_I2C.h> // indlæser er specielt I2C Biblotek
LiquidCrystal_I2C myDisplay(0X3F,16,2); // definere Displayet adr & karekter antal samt linger
void setup()
{
pinMode (ledpin,OUTPUT);
myDisplay.init();
myDisplay.backlight();
myDisplay.print("ARDUINO 1,2");
delay(1000);
}
void loop()
{
digitalWrite (ledpin,HIGH);// For onbord LED til at blinke
delay (1000);
digitalWrite (ledpin,LOW);
delay (1000);
myDisplay.clear();
delay(500);
myDisplay.print("TEST");
delay(500);
myDisplay.setCursor(0,8);
myDisplay.print("TEST");
delay(500);
}
Aller rede i der første link var løsningen der og nu ser koden sådan har ud og bække program bider køre flydende
skal lige havde kikke på de andre link også for at se om der skulle være andre guld korn
const int ledPin = 13;
int ledState = LOW;
long previousMillis = 0;
long interval = 1000;
#include <Wire.h> // indlæser I2C bibloteket
#include <LiquidCrystal_I2C.h> // indlæser er specielt I2C Biblotek
LiquidCrystal_I2C myDisplay(0X3F,16,2); // definere Displayet adr & karekter antal samt linger
void setup()
{
pinMode(ledPin, OUTPUT);
myDisplay.init();
myDisplay.backlight();
myDisplay.print("ARDUINO 1,2");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
myDisplay.clear();
delay(500);
myDisplay.print("TEST");
delay(500);
myDisplay.setCursor(0,8);
myDisplay.print("TEST");
delay(500);
}
}
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
#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);
}
med long:
long taktGiverImpulser = 0;
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å ???
/* 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 ");
}
}
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
LCD.setCursor(0, 0);
LCD.print("TRIP 1: 0.00 KM");
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);
}
if (Trip01 > 999.99)
{
Takt01Impulser =0;
LCD.setCursor(07, 0);
LCD.print(" 0.00 ");
}
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
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);
}