Arduino AIR-RIDE Programering

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Arduino AIR-RIDE Programering

Hej, är helt grön på det här med programering.

har skaffat mig ett starter kitt på GEEK. jag har lyckats knåpa ihop lite små blink och dimm funktioner, samt lödat ihop lcd-displayen och fått in lite text i den..

Min tanke är att bygga en styrenhet till ett luftfjädringsystem.

som kommer jobba efter nivåsensorer på bärarmarna på en bil (0-5v potentiometrar)
som styr 8stk relän.
2stk relä till varje nivågivare(hjul). ett höjande relä och ett sänkade.

med tre valbara höjder eller fler.

när man trycker på t.ex en knappsats/fjärrkontroll eller dylikt.

det jag strular lite med i programeringen är hur jag ska få relät att slå till vid ett viss värde på 0-5v sensorn...

låt säga att jag vill att bilen ska vara i körläge. låt säga 2.5v på potentiometern så behöver relät slå till så att bilen höjs tills den nått sitt mål sedan stänga av.

och tvärt om när den ska sänka. slå på det andra relät till att sänka till vald nivå

söker någon som skulle kunna hjälpa mig att skriva bitar koden. eller bidra med bra tipps, kanske någon bruksanvisning på svenska till arduino.

hoppas och håller hårt i tummarna att någon orkar ta sig lite tid och hjälpa mig.

mvh Jocke

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

kolla in IfStatementConditional bland exempelfilerna (under 05. Control).
dom visar bara väldigt enkla if satser men är å andra sidan vad du verkar behöva för att komma vidare eventuellt får du googla upp "arduino multiple conditions" om du vill skriva lite snyggare och kompaktare kod.

Jag hade, då potentiometrar är lite svajjiga lagt in en kontroll att potten håller sig inom ett intervall typ "=>2,4 && =<2,6" och inte exakt på "==2,5", om du dessutom skall styra det med reläer kan det bli mycket justerande om du inte inför någon form av begränsning...
alternativt gör du en liten funktion som räknar ut ett medelvärde (men då du skriver att du är helt grön är det nog enklare med att verifiera att du håller dig inom ett interall, eller kollar exempelfilen om smoothing)

så utan att skriva koden för dig.
i setup()
definiera dina 3 lägen på potten typ.

int "lägen" = map(sensorReading, sensorMin, sensorMax, 0, 2);

definiera din bias på inställningarna
int bias = 0,1

i loop()
1. kontrollera pottens värde.
sensorReading = analogRead(A0);

2. justera in så exakt du kan
if..

lite olika skolor finns på hur man skall lösa det,
men dina if-satser (en separat för att kolla om du ligger över och en separat för under) blir grovt tillyxad typ (den tar tillexempel inte hänsyn till om du ligger exakt inom intervallet så det finns ju lite att jobba på...):

if ("pottvärde" > (2,5+"bias")) { digitalWrite("sänkrelä", HIGH); delay(10); digitalWrite("sänkrelä", LOW); } if ("pottvärde" < (2,5+"bias")) { digitalWrite("höjrelä", HIGH); delay(10); digitalWrite("höjrelä", LOW); }

för att använda dom tre lägena (definierade med int "lägen" = map(sensorReading, sensorMin, sensorMax, 0, 2);)
hade jag lagt en switch/case (där kommentaren byts ut mot if satserna och rätt pottvärde, eller ännu hellre, en funktion, som justerar antingen upp eller ner och inte gör något om du ligger tillräckligt nära...)

Switch ("lägen") { case 0; // justera in för lowrider Break; case 1; // justera in för på vägen' Break; case 2; // justera in för offroad Break; }

// bL

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Tack för hjälpen! har letat som en galning efter någon som kan hjälpa

Ska studera det du skrivit.

Kommer absolut återkomma med lite fler frågor om du har tid att hjälpa! Mvh

Skrivet av ^bC^:

kolla in IfStatementConditional bland exempelfilerna (under 05. Control).
dom visar bara väldigt enkla if satser men är å andra sidan vad du verkar behöva för att komma vidare eventuellt får du googla upp "arduino multiple conditions" om du vill skriva lite snyggare och kompaktare kod.

Jag hade, då potentiometrar är lite svajjiga lagt in en kontroll att potten håller sig inom ett intervall typ "=>2,4 && =<2,6" och inte exakt på "==2,5", om du dessutom skall styra det med reläer kan det bli mycket justerande om du inte inför någon form av begränsning...
alternativt gör du en liten funktion som räknar ut ett medelvärde (men då du skriver att du är helt grön är det nog enklare med att verifiera att du håller dig inom ett interall, eller kollar exempelfilen om smoothing)

så utan att skriva koden för dig.
i setup()
definiera dina 3 lägen på potten typ.

int "lägen" = map(sensorReading, sensorMin, sensorMax, 0, 2);

definiera din bias på inställningarna
int bias = 0,1

i loop()
1. kontrollera pottens värde.
sensorReading = analogRead(A0);

2. justera in så exakt du kan
if..

lite olika skolor finns på hur man skall lösa det,
men dina if-satser (en separat för att kolla om du ligger över och en separat för under) blir grovt tillyxad typ (den tar tillexempel inte hänsyn till om du ligger exakt inom intervallet så det finns ju lite att jobba på...):

if ("pottvärde" > (2,5+"bias"))
{
digitalWrite("sänkrelä", HIGH);
delay(10);
digitalWrite("sänkrelä", LOW);
}

if ("pottvärde" < (2,5+"bias"))
{
digitalWrite("höjrelä", HIGH);
delay(10);
digitalWrite("höjrelä", LOW);
}

för att använda dom tre lägena (definierade med int "lägen" = map(sensorReading, sensorMin, sensorMax, 0, 2);)
hade jag lagt en switch/case (där kommentaren byts ut mot if satserna och rätt pottvärde, eller ännu hellre, en funktion, som justerar antingen upp eller ner och inte gör något om du ligger tillräckligt nära...)

Switch ("lägen")
{
case 0;
// justera in för lowrider
Break;

case 1;
// justera in för på vägen'
Break;

case 2;
// justera in för offroad
Break;
}

// bL

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

inga problem, kollade igenom vad jag skrev och hittade redan en bugg i programmet,
så du lär ju ha frågor på den (konstigt att ingen påpekat det här redan...)...
Jag (och många med mig...) är lite allergisk mot funktionen delay()
då processorn gör just inget alls, kompilatorn gör helt enkelt en loop med operationen nop (eller NoOp) för att fördriva tiden vilket är sådäer,
men för att få det att funka kan du börja med det, och sen skriva om.
DVS tänka till lite och få lite flyt i programmet, behöver du kolla något med ett visst tidintervall är det bättre att deklarera en "unsigned long int" för varje separat händelse som du vill schemalägga, sen jämför du bara millis() (tidens som processorn varit igång) med ditt lagrade värde (som du satt till millis() senast det kördes) och sen kör en if sats som jämför millis() med din "tidsULInt"+"tiden du vill checka mellan". blir enklare att förklara med lite kod tror jag...
i ditt fall kan du med den tekniken styra alla dina 8 relä samtidigt oberoende av varandra,
istället för att köra ett relä separat åt gången och vänta,
vilket blir en lite tomtig-lösning...

för att checka något varje sekund utan att låsa processorn med delay(1000) blir det istället typ:

setup()
tidsULint=millis();
Loop()
{
if (millis()>=(tidsULint+1000))
{
// gör något...
// ...och uppdatera tiden du gjorde senast gjorde det på
tidsULint=millis();
}
}

//bL

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

nu sitter jag äntligen och ska börja lite med detta,

har kopplat in två relän, en potentiometer och en switch

följade in och utgångar

potentiometer på analog in "0"

höjade relä på Digital "12"

sänkade relä på Digital "11"

brytare på Digital "0"

nu ska vi se om jag kommer någon vart ikväll

Skrivet av ^bC^:

inga problem, kollade igenom vad jag skrev och hittade redan en bugg i programmet,
så du lär ju ha frågor på den (konstigt att ingen påpekat det här redan...)...
Jag (och många med mig...) är lite allergisk mot funktionen delay()
då processorn gör just inget alls, kompilatorn gör helt enkelt en loop med operationen nop (eller NoOp) för att fördriva tiden vilket är sådäer,
men för att få det att funka kan du börja med det, och sen skriva om.
DVS tänka till lite och få lite flyt i programmet, behöver du kolla något med ett visst tidintervall är det bättre att deklarera en "unsigned long int" för varje separat händelse som du vill schemalägga, sen jämför du bara millis() (tidens som processorn varit igång) med ditt lagrade värde (som du satt till millis() senast det kördes) och sen kör en if sats som jämför millis() med din "tidsULInt"+"tiden du vill checka mellan". blir enklare att förklara med lite kod tror jag...
i ditt fall kan du med den tekniken styra alla dina 8 relä samtidigt oberoende av varandra,
istället för att köra ett relä separat åt gången och vänta,
vilket blir en lite tomtig-lösning...

för att checka något varje sekund utan att låsa processorn med delay(1000) blir det istället typ:

setup()
tidsULint=millis();
Loop()
{
if (millis()>=(tidsULint+1000))
{
// gör något...
// ...och uppdatera tiden du gjorde senast gjorde det på
tidsULint=millis();
}
}

//bL

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

detta var inte det lättaste.. försökt mig på att läsa igenom hjälpraderna på arduinos hemsida, men så mycket funktioner och kod att jag hinner glömma på vägen haha..

här är en bild på hur det ser ut just nu, notera att det är en led som figurerar som sänkrelä då jag fortfarande väntar på min 8-kanals relä platta.

men jag har ialf börjat med något, sen om det är rätt eller inte har jag inte en aning om, detta kommer ta tid,

något enkelt att tillägga Bc? förklara gärna som om jag vore ett bar. för det är så jag känner mig just nu ^^

/*

AIRRIDE CTRLUNIT LEARNING PROJEKT
by Joakim Ottosson

*/

int

// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pins as in and outputs.

pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(0, INPUT);
}

// the loop function runs over and over again forever
void loop() {

}

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

@JockE28:
hur har det gått? Du har ju inte kommit så långt i din kod än så det finns inte så mycket att skriva...

Men för att du inte skall behöva sitta och tänka på vilken pin som är vad kan du deklarera fasta textvärden på dom istället med kommandot #define (egentligen är det bara ett kompilatordirektiv som talar att där den hittar ett visst värde skall det bytas ut mot ett annat...).
men det gör koden mer lättläst och enklare att arbeta med i det långa loppet, om du behöver göra om något om ett år så är det jobbigt att fatta vad man egentligen gjorde, fast det var helt självklart när man gjorde det...

Så i ditt fall för potten, och en upp/ner relästyrning skulle det exempelvis kunna bli:
#define PotIN 0
#define ReHFUpp 11
#define ReHFNer 12

(eller vad du nu vill kalla dina pins i koden, beskrivningar är bra så, Re för relä, HF för högerfram, Upp för riktning...)

Man kan lösa det genom att använda "Const" kommandot också men, lite beroende på vad du vill åstadkomma och hur bra kompilator man har så kan (kommer) minnesåtgång etc variera, men det är överkurs...

kommer nog inte ta så himla lång tid om du bestämmer dig för att köra järnet, för en erfaren utvecklare skulle det ta, högt räknat, runt en timma att skriva koden och få till den hyffsat snygg, sen tillkommer det alltid injusteringar vilka kan ta hur lång tid som helst, och det brukar vara här ful och snygg kod skiljer sig... har du en bra kodbas är det inga problem att justera in programmet men har du fulfuskat och inte tänkt till tar det lång tid att göra små förändringar i fulkoden...

så exemplet ovan ger inte bara mer lättlästkod, det blir också toklätt för dig att byta pins, vill du ha Potentiometern på pin1 istället är det bara ett ställe att ändra på, din "#define PotIN 0" blir istället "#define PotIN 1", klart...

// bL

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Hej. Det har gått dåligt. Har vart mycket på jobbet och saker runt om kring som har strulat.

Jag ska försöka någon kväll i veckan att ta mig an detta.
Jag vill ju helst lära mig detta själv men tankarna går i att anlita någon för detta... men jag ska göra ett par försök innan jag ger upp

Känns ju som man skulle börjat med något enklare först för att sedan gradvis bli bättre. Men nu är det ju detta med airride som ligger i tiden och inget annat..

Jag är tacksam för din hjälp och tålamod med en novis som mig

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

@^bC^:

nu har jag ialf kommit så långt att jag kan klicka på och av reläet med en knapp. flyttade knappen till 8ans ingång så funkade det.

såhär ser det ut nu

void setup()
{
pinMode( 8, INPUT);
pinMode( 12 , OUTPUT);
}

void loop()
{
if (digitalRead(8))
{
digitalWrite( 12 , LOW );
delay( 10 );
}
else
{
digitalWrite( 12 , HIGH );
delay( 10 );
}
}

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

nu har jag kommit en liten bit ialf. har programerat in fyra "relän" av 8 en separat knapp till varje för att "höjja" och en knapp till att höja samtliga

problemet jag har nu är att in och utgångar är snart slut. hade vart fint att kunna advända mig av en fjärrkontroll som jag fick med i kittet eller en knappsats som bara andvänder några få digitala inputs...
samt problemet med att få in en eller flera potentiometrar verkar vara omöjligt just nu...

void setup()
{
pinMode( 6, INPUT);
pinMode( 7, INPUT);
pinMode( 8, INPUT);
pinMode( 9, INPUT);
pinMode( 10, INPUT);
pinMode( 0 , OUTPUT);
pinMode( 1 , OUTPUT);
pinMode( 2 , OUTPUT);
pinMode( 3 , OUTPUT);
}

void loop()
{
if (digitalRead(6))
{
digitalWrite( 0 , HIGH );
}
else
{
digitalWrite( 0 , LOW );
}
if (digitalRead(7))
{
digitalWrite( 1 , HIGH );
}
else
{
digitalWrite( 1 , LOW );
}
if (digitalRead(8))
{
digitalWrite( 2 , HIGH );
}
else
{
digitalWrite( 2 , LOW );
}
if (digitalRead(9))
{
digitalWrite( 3 , HIGH );
}
else
{
digitalWrite( 3 , LOW );
}
if (digitalRead(10))
{
digitalWrite( 0 , HIGH );
digitalWrite( 1 , HIGH );
digitalWrite( 2 , HIGH );
digitalWrite( 3 , HIGH );
}
else
{
digitalWrite( 0 , LOW );
digitalWrite( 1 , LOW );
digitalWrite( 2 , LOW );
digitalWrite( 3 , LOW );
}
}

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

slut på IO?
En Uno har 6 analoga ingångar (som analoga kan dom bara vara ingångar men kan som digitala användas som in eller utgångar, vill du använda dom som "vanliga" IO pins adresserar du dom bara som 14 för A0, 15 för A1 osv...)
samt du har 14 (0-13 därav blir pin 14 =A0 i texten ovan) digitala IO varav 6 kan användas som PWM (vilket du inte har nån nytta av i detta projektet).
Du använder en pot till varje cylinder (4 analoga ingångar).
och en IO för varje relä, vilket ger 8 digitala utgångar (två IO per Relä).
så du har ganska gott om pins kvar att labba med tycker jag,
men undvik in i det längsta att använda RxD och TxD (pin0 och 1),
dom används när du laddar över programmet/sketchen via USB, vilket kan strula till det...

Vill du ha vanliga strömbrytare är det ganska enkelt att koppla in exempelvis fyra strömbytare via olika resistorer och koppla dom mot en analog ingång, lite jobbigt att förklara enklare om du kollar själv på google eller typ, http://tronixstuff.com/2012/02/29/tutorial-analog-input-for-m..., då är det bara att matcha analogvärdet in mot en knapp smidigt och enkelt.

Är det en vanlig IR-fjärr du har så är det ju bara en input du behöver.
Att tänka på när du använder den och du vill att responsen i den skall vara hygglo, är att inte låsa programmet med "delay(1000);" då det skall göra något. För under den sekunden kommer du inte kunna läsa av IR koden (eller göra något annat vettigt), tog nog upp det i en tidigare post om att få ett flyt i programmet...

Redan nu hade jag, om jag varit dig, planerat lite lätt för felhantering,
tänker främst i form av nödstopp.

i alla processorer finns Interrupts (som genererar en IRQ, Interrupt ReQuest), Arduinon(Atmel processorn) är inget undantag. Det man gör är att koppla en pin till en ISR (interrupt service routine). låter lite jobbigare i teorin än det är i verkligheten, men lika bra att introducera vissa termer direkt...
I din "Void Setup()" lägger du till en rad med "attachInterrupt();" där du får pilla in vilken pin interrupten skall trigga på och en rutin/funktion samt vad som skall hända.

längst ner i koden efter din vanliga "void loop()" lägger du till en "void panikstopp()" och i den vad som skall hända när en IRQ inträffar (i ditt fall exempelvis sätta alla reläer LOW).

Även här är det nog lättare att kolla upp kommandot "attachInterrupt()" med hjälp av google...

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

dom 6 analoga ingångarna tänkte jag använda för mina 4 potentiometar en till varje hjul och en joystick, samt så skulle jag vilja använda fjärr, har inte läst på så mycket men även den kanske använder analog in?, då blir det ett MEGA kort för att göra det enkelt?.

jag ska försöka få in min ir kontroll till det programmet jag redan har och få det att fungera bättre
kommer antagligen få göra om det 100 gånger men det är så jag lär mig tydligen..
det där med mills lär vara en grej jag snart får lära mig då delay som du sagt ställer till det mer än vad man vill
reläen fladdrar hit och ditt.

samt detdär med fler knappar på färre ingångar, tack för länken, den skall studeras!
tänkte jag avhjälpa med att köpa ett buttonkort eller en touchpad edyl och lära mig

steget efter det är att försöka få till en prototyp som är manuell med fjärr och knappar i bilen så får jag nöja mig med det tills vidare om jag inte har lärt mig om potentiometer-problemet vid det laget . då blir det ett mer hel-automatiskt system med nivsensorerna.

även tänkt om man kan ta analog signal från hastighetsmätaren i bilen så man får till ett såkallat automatiskt körläge.
(när bilen börjar rulla så höjs den automatiskt till körläge)
det är ett måste för SBP att bilen inte skall kunna justeras i höjd under färd, vilket kan bli en bunos

mvh Jocke

Skrivet av ^bC^:

slut på IO?
En Uno har 6 analoga ingångar (som analoga kan dom bara vara ingångar men kan som digitala användas som in eller utgångar, vill du använda dom som "vanliga" IO pins adresserar du dom bara som 14 för A0, 15 för A1 osv...)
samt du har 14 (0-13 därav blir pin 14 =A0 i texten ovan) digitala IO varav 6 kan användas som PWM (vilket du inte har nån nytta av i detta projektet).
Du använder en pot till varje cylinder (4 analoga ingångar).
och en IO för varje relä, vilket ger 8 digitala utgångar (två IO per Relä).
så du har ganska gott om pins kvar att labba med tycker jag,
men undvik in i det längsta att använda RxD och TxD (pin0 och 1),
dom används när du laddar över programmet/sketchen via USB, vilket kan strula till det...

Vill du ha vanliga strömbrytare är det ganska enkelt att koppla in exempelvis fyra strömbytare via olika resistorer och koppla dom mot en analog ingång, lite jobbigt att förklara enklare om du kollar själv på google eller typ, http://tronixstuff.com/2012/02/29/tutorial-analog-input-for-m..., då är det bara att matcha analogvärdet in mot en knapp smidigt och enkelt.

Är det en vanlig IR-fjärr du har så är det ju bara en input du behöver.
Att tänka på när du använder den och du vill att responsen i den skall vara hygglo, är att inte låsa programmet med "delay(1000);" då det skall göra något. För under den sekunden kommer du inte kunna läsa av IR koden (eller göra något annat vettigt), tog nog upp det i en tidigare post om att få ett flyt i programmet...

Redan nu hade jag, om jag varit dig, planerat lite lätt för felhantering,
tänker främst i form av nödstopp.

i alla processorer finns Interrupts (som genererar en IRQ, Interrupt ReQuest), Arduinon(Atmel processorn) är inget undantag. Det man gör är att koppla en pin till en ISR (interrupt service routine). låter lite jobbigare i teorin än det är i verkligheten, men lika bra att introducera vissa termer direkt...
I din "Void Setup()" lägger du till en rad med "attachInterrupt();" där du får pilla in vilken pin interrupten skall trigga på och en rutin/funktion samt vad som skall hända.

längst ner i koden efter din vanliga "void loop()" lägger du till en "void panikstopp()" och i den vad som skall hända när en IRQ inträffar (i ditt fall exempelvis sätta alla reläer LOW).

Även här är det nog lättare att kolla upp kommandot "attachInterrupt()" med hjälp av google...

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

Då är jag med, du kan vara lite kort om analoga ingångar,
en joystick drar ju två analoga och vanligtvis en digital ingång (en för varje axel och en strömbrytare/select). Fjärren är ingen fara den kör på en digital ingång. Så då har du inga analoga kvar att leka med...

För att gå lite i förväg i dina problem så kan jag kasta in mina spontana tankar här...

Nu vet jag inte vad det är för bil du har men att läsa ut data från den, utan ganska bra koll, hade jag nog inte gjort... Jag hade iaf valt en OBD-2 läsare via Blåtand ($3-4 på aliexpress) och en blåtandmodul ($3-4 även den på ali) till arduinon, men det är _lite_ mer jobb att få ihop det!

En enklare väg att gå för dig är att köpa ett gyro, då kan du istället programmera att du bara kan justera när G-krafterna är noll, och om du istället får in något värde justerar den in sig i "kör läge"... frågan är om det är godkänt...

oavsett, i ditt fall hade jag nog förr eller senare gått över till en mega ($5-10 på ali om vi nu skall fortsätta med priser...), anledningen till det är att du förmodligen kommer använda dom färdiga biblioteken för respektive modul, dom är vanligtvis bra, men dom drar iväg en hel del minne i programstorlek...

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Mega beställd. Samt wifishield och blåtand så man kan välja. Även fixat ner en app som ska vara lätt att Joxa in i atduionon som använder wifi eller bt.

Bilen som används har ingen obd. Utan är en veteranbil så systemet kommer inte ha något med bilen att göra. Förutom hastighetssignal och kanske fjärrstart men det ligger långt borta

Detdär med gyrot var en bra tanke då slipper man ju klabba med hastighet..

Vart i landet finns du? Om man skulle få lite problem med justering i slutprodukt så kanske du vill kika på det?
Det är ju månader kvar men frågan är ju fri

Har försökt mig på lite med multipla strömbrytare idag. Men koncentrationen var inte som igår. Det är lättare för mig att förstå koderna om jag redan har ett program med schema som fungerar.

Det är så jag lärt mig hitils. Kanske fel väg att gå. Men den vägen går ialf framåt

Skrivet av ^bC^:

Då är jag med, du kan vara lite kort om analoga ingångar,
en joystick drar ju två analoga och vanligtvis en digital ingång (en för varje axel och en strömbrytare/select). Fjärren är ingen fara den kör på en digital ingång. Så då har du inga analoga kvar att leka med...

För att gå lite i förväg i dina problem så kan jag kasta in mina spontana tankar här...

Nu vet jag inte vad det är för bil du har men att läsa ut data från den, utan ganska bra koll, hade jag nog inte gjort... Jag hade iaf valt en OBD-2 läsare via Blåtand ($3-4 på aliexpress) och en blåtandmodul ($3-4 även den på ali) till arduinon, men det är _lite_ mer jobb att få ihop det!

En enklare väg att gå för dig är att köpa ett gyro, då kan du istället programmera att du bara kan justera när G-krafterna är noll, och om du istället får in något värde justerar den in sig i "kör läge"... frågan är om det är godkänt...

oavsett, i ditt fall hade jag nog förr eller senare gått över till en mega ($5-10 på ali om vi nu skall fortsätta med priser...), anledningen till det är att du förmodligen kommer använda dom färdiga biblioteken för respektive modul, dom är vanligtvis bra, men dom drar iväg en hel del minne i programstorlek...

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

hittade denna kod som jag tror kan hjälpa mig ganska bra

// These constants won't change:
const int analogPin = A0; // pin that the sensor is attached to
const int ledPin = 13; // pin that the LED is attached to
const int threshold = 400; // an arbitrary threshold level that's in the range of the analog input

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communications:
Serial.begin(9600);
}

void loop() {
// read the value of the potentiometer:
int analogValue = analogRead(analogPin);

// if the analog value is high enough, turn on the LED:
if (analogValue > threshold) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}

// print the analog value:
Serial.println(analogValue);
delay(1); // delay in between reads for stability
}

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

Ja den är en bra start att kopiera, jag ser att det kommer bli en himla massa ctrl+v för att få ihop det också, men som version 0.1 är det som sagt en bra kod att börja med om man är nybörjare...
Kan se om jag kan sätta ihop ett kort exempel för dig som inte innebär en återvändsgränd i oöverblickligkod bara, som du kan bygga vidare på lite mer flexibelt.
skickar det som PM när jag får tid över...
troligtvis vill du väl även ha kalibrering också? så alla min och max stämmer överens på alla hjulen... kan bli lite kämpigt att få till det, med koden ovan, på ett smidigt och överskådligt sätt. Men å andra sidan, på en Mega lär det ju få plats iaf.

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Japp. Försökte lite igår och fick det att fungera för ett relä att öppna tills den nått ett visst värde men sedan när jag skulle baka in en knapp som aktiverade den funktionen så gick det dåligt igen

Min spontana tanke är att löda ihop några buttons med motstånd och andvända några analoga inputs tex 4 grupper om fem brytare i varje.

Grupp ett med brytare: 4 stk som sätter ett höjande relä till varje hjul till HIGH när dom är nedtryckt så man kan justera varje hjul individuellt. Och knapp 5 höjer alla hjulen när den är nedtryckt

Tvärt om med andra gruppen som sköter sänkandet.

Grupp tre med fem brytare hade vart fiffigt att
Knapp 1: höj båda fram
Knapp 2: höj båda bak
Knapp 3: sänk fram
Knapp 4: sänk bak
Knapp 5: körläge

Grupp 4:
Knapp1: nödstopp
Knapp 2: lägsta settings = ingen luft kvar
Knapp3: lågt fast endå körbart
Knapp 4: låg/körläge
Knapp5: högsta läge

En sak jag tänkte på i programmet är om man skulle kunna sätta in 4×4 värden i början (thresholds) till alla fyra lägena till varje individuell grupp så man bara kan ändra dom värdena för att programmet ska fungera.

En annan sak jag funderat på är om man ska lägga till någon blink version när bälgarna börjar närma sig sitt mål. Så dom inte råkar vandra förbi sitt värde...

Sedan problemet när man börjar köra med bilen.. att dom inte försöker justera under färd. Kan det bakas ihop med någon gyro?
Eller ska man lägga in någon kod om det. Att när aktionen är utförd en gång så är det färdigt? Gör inget mer innan nytt kommando har angets?

DET ABSOLUT ULTIMATA:
4 knappar upp till varje hjul
4 knappar ner till varje hjul
1 knapp upp till fram
1 knapp ner till fram
1 knapp upp till bak
1 knapp ner till bak
1 knapp upp för alla
1 knapp ner för alla

Sedan fem knappar med funktion
Som ovan med alla körläge.

Så när man justerat in lägsta läget så håller man inne den knappen man vill att det läget ska gå till...

Så om man vill höjja från noll till 2 cm upp fram i praktiken och bak 3 cm sedan håller man inte körläge 1 knappen och sedan är det värdet som gäller för den knappen. Tills man initierar nästa gång....

DET! HADE VART HÄFTIGT!

Skrivet av ^bC^:

Ja den är en bra start att kopiera, jag ser att det kommer bli en himla massa ctrl+v för att få ihop det också, men som version 0.1 är det som sagt en bra kod att börja med om man är nybörjare...
Kan se om jag kan sätta ihop ett kort exempel för dig som inte innebär en återvändsgränd i oöverblickligkod bara, som du kan bygga vidare på lite mer flexibelt.
skickar det som PM när jag får tid över...
troligtvis vill du väl även ha kalibrering också? så alla min och max stämmer överens på alla hjulen... kan bli lite kämpigt att få till det, med koden ovan, på ett smidigt och överskådligt sätt. Men å andra sidan, på en Mega lär det ju få plats iaf.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Jan 2003

Du har ett PM med koden, den är skriven på ett enkelt sätt för att den skall bli lättläst.
Den är långtifrån färdig men den borde gå att kompilera och köra, men helt utan lull-lull.

// bL

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

FÅR INTE DENNA ATT FUNGERA..

någon som har en input?

//Read potvalue on all 4wheel level sensors on analog pins 0-3
//Air ride control unit attached to digital pin 13-6
//Air level-buttons on pin 50 and 52

const int Levelsensor1 = 0; //Set LF Bag sensor input on Analog port 0
const int Levelsensor2 = 1; //Set RF Bag Sensor input on Analog port 1
const int Levelsensor3 = 2; //Set LR Bag Sensor input on Analog port 2
const int Levelsensor4 = 3; //Set RR Bag Sensor input on Analog port 3
int sensor1val = 0; //Set LF Bag sensor to 0 value
int sensor2val = 0; //Set RF Bag sensor to 0 value
int sensor3val = 0; //Set LR Bag Sensor to 0 value
int sensor4val = 0; //Set RR Bag Sensor to 0 value
int Level1 = 0;
int Level2 = 0;
int Level3 = 0;
int Level4 = 0;
const int lfupPin = 13; //LF Bag fill solenoid to Digital Pin 13
const int lfdownPin = 12; //LF Bag release solenoid to Digital Pin 12
const int rfupPin = 11; //RF Bag fill solenoid to Digial Pin 11
const int rfdownPin = 10; //RF Bag release solenoid to Digital Pin 10
const int lrupPin = 9; //LR Bag fill solenoid to Digital Pin 9
const int lrdownPin = 8; //LR Bag release solenoid to Digital Pin 8
const int rrupPin = 7; //RR Bag fill solenoid to Digital Pin 7
const int rrdownPin = 6; //RR Bag release solenoid to Digital Pin 6
const int upbuttonPin = 52; //Push button to put car at highes level on Digital Pin 5
const int ridebuttonPin = 50; //Push button to put car at ride height on Digital Pin 4

void setup()

{
Serial.begin(9600);

pinMode (lfupPin, OUTPUT);
pinMode (lfdownPin, OUTPUT);
pinMode (rfupPin, OUTPUT);
pinMode (rfdownPin, OUTPUT);
pinMode (lrupPin, OUTPUT);
pinMode (lrdownPin, OUTPUT);
pinMode (rrupPin, OUTPUT);
pinMode (rrdownPin, OUTPUT);
pinMode (upbuttonPin, INPUT);
pinMode (ridebuttonPin, INPUT);

sensor1val = analogRead(0);
Serial.println(sensor1val);

}

void loop()
{

Serial.begin(9600);

if (digitalRead(upbuttonPin)== HIGH)
Serial.print("NO FORMAT");
{
if (Level1 < 116);
{
delay(50);
digitalWrite(lfupPin, HIGH);
if (Level1 >115);
{
delay(50);
digitalWrite(lfdownPin, HIGH);
}

}
if (Level2 < 116);
{
delay(50);
digitalWrite(rfupPin, HIGH);
if (Level2 > 115);
{
delay(50);
digitalWrite(rfdownPin, HIGH);
}
}
if (Level3 < 116);
{
delay(50);
digitalWrite (lrupPin, HIGH);
if (Level3 > 115);
{
delay(50);
digitalWrite (lrdownPin, HIGH);
}
}
if (Level4 < 116);
{
delay(50);
digitalWrite(rrupPin, HIGH);
if (Level4 > 115);
{
delay(50);
digitalWrite(rrdownPin, HIGH);
}
}
return;
}

if (digitalRead(ridebuttonPin) == HIGH)
Serial.print("NO FORMAT");
{
if (Level1 < 80);
{
delay(50);
digitalWrite (lfupPin, HIGH);
if (Level1 > 80);
{
delay(50);
digitalWrite (lfdownPin, HIGH);
}
}
if (Level2 < 80);
{
delay(50);
digitalWrite(rfupPin, HIGH);
if (Level2 > 80);
{
delay(50);
digitalWrite(rfdownPin, HIGH);
}
}
if (Level3 < 80);
{
delay(50);
digitalWrite(lrupPin, HIGH);
if (Level3 > 80);
{
delay(50);
digitalWrite(lrdownPin, HIGH);
}
}
if (Level4 < 80);
{
delay(50);
digitalWrite(rrupPin, HIGH);
if (Level4 > 80);
{
delay(50);
digitalWrite(rrdownPin, HIGH);
}
}
return;
} }

Trädvy Permalänk
Medlem
Plats
Falkenberg
Registrerad
Nov 2013

@JockE28:

Det första som jag märkte var att du har en Serial.begin i loopen. får du andra fel eller var det bara ett kompilerings-fel du fick?

Att frappera koden in till funktionerna hade kanske vart en bra idé för att göra saker tydligare. exempel

void loop() [
blink();
]

void blink() [
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
]

på så sätt kan du separera det till en funktion som läser knapparna, en till att styra relän och en som en brygga emellan (menyn mm).
blir betydligt lättare att felsöka då och även att lägga till/ta bort nya funktioner.

lägg till förslag
Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jul 2007

Hur gick det med detta mån tro? Är sjukt nyfiken då jag nu är inne på exakt samma banor Någon som är up to date med ett liknande sqript?

Skickades från m.sweclockers.com

-=Cooler Master ATCS 840=-
• XFX 780i • Q6600 (G0) @ 3.5GHz • Sapphire Radeon HD 5970 2GB OC Edition • Corsair 800MHz 2x2 GB• Corsair HX850 • Intel X25-M G2 80GB (OS) / VelociRaptor 300GB (Spel)

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Okt 2007
Skrivet av Matte90-Antec:

Hur gick det med detta mån tro? Är sjukt nyfiken då jag nu är inne på exakt samma banor Någon som är up to date med ett liknande sqript?

Skickades från m.sweclockers.com

Jag har börjat med att skriva ett program för det medan min bil varit på lack. Minns dock inte hur långt jag kom, jag har om jag inte minns fel skapat 9 ingångar (tryck på alla 4 kretsarna, tryck på tank och höjd) . Ska försöka leta reda på koden till det.

https://www.facebook.com/johannest85/videos/vb.610783695/1015...

Uppdaterad:
Är säkert inte det bäst skrivna programmet (är nybörjare), men är en start iaf

Citat:

#include <Wire.h> // För LCD-display
#include <LiquidCrystal_I2C.h> // För LCD-display

//Skapa "bilder" till välkomstmeddelande
uint8_t inflatedL[8] = {0x7, 0xf, 0x1F, 0x1f, 0x1f, 0x1f, 0xf, 0x7};
uint8_t inflatedR[8] = {0x1C, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x1c};
uint8_t deflatedRT[8] = {0x0, 0x0, 0x0, 0x0, 0xf, 0x1f, 0x1f, 0xf};
uint8_t deflatedLT[8] = {0x0, 0x0, 0x0, 0x0, 0x1e, 0x1f, 0x1f, 0x1e};
uint8_t deflatedRB[8] = {0xf, 0x1f, 0x1f, 0xf, 0x0, 0x0, 0x0, 0x0};
uint8_t deflatedLB[8] = {0x1e, 0x1f, 0x1f, 0x1e, 0x0, 0x0, 0x0, 0x0};
uint8_t ae[8] = {0xa, 0x0, 0xe, 0x1, 0xf, 0x11, 0xf};
LiquidCrystal_I2C lcd(0x3F, 16, 2); //(adress, kolumner, rader

// Väljer startläge manuell
int mode = 0;
int modetemp = 10;
// Ställer in standardtryck
int PressFH = 2;
int PressFV = 2;
int PressBH = 2;
int PressBV = 2;
int PressTANK = 2;
// Ställer in standardhöjder
int preHojdFH = 2;
int preHojdFV = 2;
int preHojdBH = 2;
int preHojdBV = 2;
// Initierar insignaler
int BalgFH = A4; // Tryck bälg fram höger
int BalgFV = A3; // Tryck bälg fram vänster
int BalgBH = A2; // Tryck bälg bak höger
int BalgBV = A1; // Tryck bälg bak vänster
int Tank = A0; // Tryck tank
int hojdFH = A8; //Höjd fram höger
int hojdFV = A7; // Tryck bälg fram vänster
int hojdBH = A6; // Tryck bälg bak höger
int hojdBV = A5; // Tryck bälg bak vänster
// Initierar värde på tryckgivare
int sensorValueFH = 0;
int sensorValueFV = 0;
int sensorValueBH = 0;
int sensorValueBV = 0;
int sensorValueTANK = 0;
// Initierar värde för tryckvistning
int displayValueFH = 0;
int displayValueFV = 0;
int displayValueBH = 0;
int displayValueBV = 0;
int displayValueTANK = 0;
// Initierar värde på höjdgivare
int HsensorValueFH = 0;
int HsensorValueFV = 0;
int HsensorValueBH = 0;
int HsensorValueBV = 0;
//Definiera Pinnar för fyllning och tömning
int InTANK = 38;
int UtTANK = 39;
int InBV = 40;
int UtBV = 41;
int InBH = 42;
int UtBH = 43;
int InFV = 44;
int UtFV = 45;
int InFH = 46;
int UtFH = 47;
int extra1 = 48;
int extra2 = 49;
int extra3 = 50;
int extra4 = 51;
int extra5 = 52;
int master = 53;

//initierar pinnar för knappar
int knapp0 = 2;
int knapp1 = 3;
int knapp2 = 4;
int knapp3 = 5;
int knapp4 = 6;

int bardiff = 170; //värde för att nollställa tryckgivare
int barkalibrering = 37; //värde för att ändra digitalt värde till bar

int hojddiff = 170; //värde för att nollställa tryckgivare
int hojdkalibrering = 37; //värde för att ändra digitalt värde till bar

void setup() {
Serial.begin(9600);
int i;
int n = 5;

pinMode(InTANK, OUTPUT);
pinMode(UtTANK, OUTPUT);
pinMode(InBV, OUTPUT);
pinMode(UtBV, OUTPUT);
pinMode(InBH, OUTPUT);
pinMode(UtBH, OUTPUT);
pinMode(InFV, OUTPUT);
pinMode(UtFV, OUTPUT);
pinMode(InFH, OUTPUT);
pinMode(UtFH, OUTPUT);
pinMode(extra1, OUTPUT);
pinMode(extra2, OUTPUT);
pinMode(extra3, OUTPUT);
pinMode(extra4, OUTPUT);
pinMode(extra5, OUTPUT);
pinMode(master, OUTPUT);

pinMode(knapp0, INPUT);
pinMode(knapp1, INPUT);
pinMode(knapp2, INPUT);
pinMode(knapp3, INPUT);
pinMode(knapp4, INPUT);

//Skapar välkomstmeddelande
lcd.begin();
lcd.createChar(0, inflatedL);
lcd.createChar(1, inflatedR);
lcd.createChar(2, deflatedLT);
lcd.createChar(3, deflatedRT);
lcd.createChar(4, deflatedLB);
lcd.createChar(5, deflatedRB);
lcd.createChar(6, ae);
lcd.backlight();

for (i = 0; i < n; i++) {
lcd.clear();
lcd.home();
lcd.write(0);
lcd.write(1);
lcd.print("V");
lcd.write(6);
lcd.print("lkommen till");
lcd.setCursor(0, 1);
lcd.write(0);
lcd.write(1);
lcd.print("AIRDUINO V.0.1");
delay(700);
lcd.clear();
lcd.home();
lcd.write(3);
lcd.write(2);
lcd.print("V");
lcd.write(6);
lcd.print("lkommen till");
lcd.setCursor(0, 1);
lcd.write(5);
lcd.write(4);
lcd.print("AIRDUINO V.0.1");
delay(700);
}
lcd.clear();

lcd.home();
lcd.print("Initierar system");
initiation(300);

}

void loop() {

int lage0io, lage1io, lage2io, lage3io, lage4io;

// läs in värde från samtliga trycksensorer:
sensorValueTANK = analogRead(Tank);
sensorValueFH = analogRead(BalgFH);
sensorValueFV = analogRead(BalgFV);
sensorValueBH = analogRead(BalgBH);
sensorValueBV = analogRead(BalgBV);
//Skriv ut vilket läge som är aktivt i com
Serial.println(sensorValueTANK);

lage0io = digitalRead(knapp0);
lage1io = digitalRead(knapp1);
lage2io = digitalRead(knapp2);
lage3io = digitalRead(knapp3);
lage4io = digitalRead(knapp4);
if (((lage0io == LOW) || (lage1io == LOW) || (lage2io == LOW) || (lage3io == LOW) || (lage4io == LOW))) //Om någon av de 5 lägesknapparna är intryckta
// && !
// ((lage1io == HIGH) && (lage2io == HIGH) && (lage3io == HIGH) && (lage4io == HIGH)) //och alla knappar utom knapp 1 är inaktiva
// && !
// ((lage0io == HIGH) && (lage2io == HIGH) && (lage3io == HIGH) && (lage4io == HIGH)) //och alla knappar utom knapp 2 är inaktiva
// && !
// ((lage0io == HIGH) && (lage1io == HIGH) && (lage3io == HIGH) && (lage4io == HIGH)) //och alla knappar utom knapp 3 är inaktiva
// && !
// ((lage0io == HIGH) && (lage1io == HIGH) && (lage2io == HIGH) && (lage4io == HIGH)) //och alla knappar utom knapp 4 är inaktiva
// && !
// ((lage0io == HIGH) && (lage1io == HIGH) && (lage2io == HIGH) && (lage3io == HIGH))) //och alla knappar utom knapp 5 är inaktiva
{
if (lage0io == LOW) { //Knapp B intryckt
if (modetemp == 9) {
modetemp = mode;
}

if (modetemp == 4) {
modetemp = 0;
}
if (modetemp == 0) {
menydisplay("Manuell");
}
if (modetemp == 1) {
menydisplay("Tryckstyrning");
}
if (modetemp == 2) {
menydisplay("Hojdstyrning");
}
if (modetemp == 3) {
menydisplay("Full automatik");
}
if (modetemp == 4) {
menydisplay("Besiktning");
}
modetemp = modetemp + 1;
delay(500);

}

else if (lage1io == LOW && (mode == 0 || mode == 1 || mode == 2 || mode == 3)) { //Knapp U intryckt

if (mode == 0) { //inställningar Manuellt läge

}
else if (mode == 1) { //inställningar Tryckstyrningsläge

if (modetemp == 9) {

modetemp == mode + 20;
LCDdisplay(("Installningar"), ("Tryckstyrning"));
}
delay(1000);
if (modetemp == 25) {
modetemp = 20;
}
if (modetemp == 20) {
menydisplay("Tryck samtliga");
}
if (modetemp == 21) {
menydisplay("Tryck fram");
}
if (modetemp == 22) {
menydisplay("Tryck bak");
}
if (modetemp == 23) {
menydisplay("Tryck hoger");
}
if (modetemp == 24) {
menydisplay("Tryck vanster");
}
if (modetemp == 25) {
menydisplay("Tryck Hoger fram");
}
if (modetemp == 26) {
menydisplay("Tryck Vanst fram");
}
if (modetemp == 27) {
menydisplay("Tryck Hoger bak");
}
if (modetemp == 28) {
menydisplay("Tryck Vanst bak");
}
modetemp = modetemp + 1;
}
else if (mode == 2) { //inställningar Höjdstyrningsläge
modetemp == mode + 30;
}
else if (mode == 3) { //inställningar Full automatik
modetemp == mode + 40;
}
}
if (lage2io == LOW) {
}
if (lage3io == LOW) {
}
if (lage4io == LOW && modetemp != 9) { //Knapp K intryckt medan meny är aktiv
mode = modetemp;
modetemp = 9;
lcd.clear();
}

}

if (mode == 0 && modetemp == 10) { //Luftfjädringsautomatik avstängt
inactivate(); //se till att alla reläer är inaktiva

visavarde(); //visar tryckvärden på led
}

else if (mode == 1 && modetemp == 10) { //Läge 1 = tryckstyrd reglering

// Visa värden i com
//Serial.println((sensorValueBV - bardiff) / barkalibrering);

//Kontrollerar och ställer tryck Bak Vänster
autostyrning(sensorValueBV, PressBV, InBV, UtBV, bardiff, barkalibrering, (0, 2));

//Kontrollerar och ställer tryck Bak Höger
autostyrning(sensorValueBH, PressBH, InBH, UtBH, bardiff, barkalibrering, (0, 2));

//Kontrollerar och ställer tryck Fram Vänster
autostyrning(sensorValueFV, PressFV, InFV, UtFV, bardiff, barkalibrering, (0, 2));

//Kontrollerar och ställer tryck Fram Höger
autostyrning(sensorValueFH, PressFH, InFH, UtFH, bardiff, barkalibrering, (0, 2));

visavarde();

}
else if (mode == 2 && modetemp == 10) { //Läge 2 = höjdstyrd reglering

//Kontrollerar och ställer efter höjd Bak Vänster
autostyrning(HsensorValueBV, preHojdBV, InBV, UtBV, hojddiff, hojdkalibrering, (0, 2));

//Kontrollerar och ställer efter höjd Bak Höger
autostyrning(HsensorValueBH, preHojdBH, InBH, UtBH, hojddiff, hojdkalibrering, (0, 2));

//Kontrollerar och ställer efter höjd Fram Vänster
autostyrning(HsensorValueFV, preHojdFV, InFV, UtFV, hojddiff, hojdkalibrering, (0, 2));

//Kontrollerar och ställer efter höjd Fram Höger
autostyrning(HsensorValueFH, preHojdFH, InFH, UtFH, hojddiff, hojdkalibrering, (0, 2));

visavarde();

}

else {

}

}

//sätt alla pinnar för reläet till utgångar och lägg dem i rätt läge (alla brytare utom master öppna)
int initiation(int tid) {
lcd.setCursor(0, 1);
lcd.blink();
digitalWrite(master, LOW);
delay(tid);
lcd.print("o");
digitalWrite(InTANK, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(UtTANK, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(InBV, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(UtBV, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(InBH, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(UtBH, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(InFV, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(UtFV, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(InFH, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(UtFH, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(extra1, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(extra2, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(extra3, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(extra4, HIGH);
delay(tid);
lcd.print("o");
digitalWrite(extra5, HIGH);
delay(tid);
lcd.print("o");
delay(tid);
lcd.print("o");
lcd.noBlink();
lcd.clear();
}
int inactivate() {
digitalWrite(InTANK, HIGH);
digitalWrite(UtTANK, HIGH);
digitalWrite(InBV, HIGH);
digitalWrite(UtBV, HIGH);
digitalWrite(InBH, HIGH);
digitalWrite(UtBH, HIGH);
digitalWrite(InFV, HIGH);
digitalWrite(UtFV, HIGH);
digitalWrite(InFH, HIGH);
digitalWrite(UtFH, HIGH);
digitalWrite(extra1, HIGH);
digitalWrite(extra2, HIGH);
digitalWrite(extra3, HIGH);
digitalWrite(extra4, HIGH);
digitalWrite(extra5, HIGH);
digitalWrite(master, LOW);
}

int visavarde() {
if ( !(sensorValueFV <= (displayValueFV + 250) && sensorValueFV >= (displayValueFV - 250))) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(((sensorValueFV - bardiff) / barkalibrering));
displayValueFV = sensorValueFV;
}
if ( ! (sensorValueFH <= (displayValueFH + 200) && sensorValueFH >= (displayValueFH - 200))) {
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print(((sensorValueFH - bardiff) / barkalibrering));
displayValueFH = sensorValueFH;
}
if ( ! (sensorValueBV <= (displayValueBV + 200) && sensorValueBV >= (displayValueBV - 200))) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(((sensorValueBV - bardiff) / barkalibrering));
displayValueBV = sensorValueBV;
}
if ( ! (sensorValueBH <= (displayValueBH + 200) && sensorValueBH >= (displayValueBH - 200))) {
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(((sensorValueBH - bardiff) / barkalibrering));
displayValueBH = sensorValueBH;
}
if ( ! (sensorValueTANK <= (displayValueTANK + 200) && sensorValueTANK >= (displayValueTANK - 200))) {
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(((sensorValueFH - bardiff) / barkalibrering));
displayValueTANK = sensorValueTANK;
}
}

int autostyrning(int sensorV, int preV, int In, int Ut, int diff, int kalibrering, int stabil) { //stabil är värde för att kunna få mindre känslighet och mer stabilitet
if (((sensorV - diff) / kalibrering) > (preV + 0.2)) { //värde över tömmer bälg
digitalWrite(master, HIGH);
digitalWrite(In, HIGH);
digitalWrite(Ut, LOW);
}
else if (((sensorV - diff) / kalibrering) < (preV - 0.2)) { //värde under fyller bälg
digitalWrite(master, HIGH);
digitalWrite(Ut, HIGH);
digitalWrite(In, LOW);
}
else { //Rätt värde båda ventilerna avstängda
digitalWrite(In, HIGH);
digitalWrite(Ut, HIGH);
digitalWrite(master, LOW);
}
}

int menydisplay(char mess[16]) {
lcd.clear();
lcd.home();
lcd.print(mess);
lcd.setCursor(0, 1);
lcd.print(" Aktivera med K");
}

int LCDdisplay(char mess1[16], char mess2[16]) {
lcd.clear();
lcd.home();
lcd.print(mess1);
lcd.setCursor(0, 1);
lcd.print(mess2);
}

Hittade koden
Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jul 2007
Skrivet av Johannest85:

Jag har börjat med att skriva ett program för det medan min bil varit på lack. Minns dock inte hur långt jag kom, jag har om jag inte minns fel skapat 9 ingångar (tryck på alla 4 kretsarna, tryck på tank och höjd) . Ska försöka leta reda på koden till det.

https://www.facebook.com/johannest85/videos/vb.610783695/1015...

Uppdaterad:
Är säkert inte det bäst skrivna programmet (är nybörjare), men är en start iaf

Alright så du kör referens över trycket i bälgarna för att referera höjden. Jag tänkte ge mig på att få in nivågivare istället
Något du eller någon annan här för den delen har erfarenheten utav?

Skickades från m.sweclockers.com

-=Cooler Master ATCS 840=-
• XFX 780i • Q6600 (G0) @ 3.5GHz • Sapphire Radeon HD 5970 2GB OC Edition • Corsair 800MHz 2x2 GB• Corsair HX850 • Intel X25-M G2 80GB (OS) / VelociRaptor 300GB (Spel)

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Okt 2007

Samma princip, tänkte ha både tryck och nivåmätning. Hoppas på så sätt kunna se ifall exempelvis om man står i en backe eller liknande. Samt även kunna se till att eventuella bälgläckor skall märkas.

Men en nivåmätare kör man som en potentiometer på samma sätt som en analog givare. Har inte köpt mina nivågivare än men ska åka till skroten och kika efter nå passande

Skrivet av Matte90-Antec:

Alright så du kör referens över trycket i bälgarna för att referera höjden. Jag tänkte ge mig på att få in nivågivare istället
Något du eller någon annan här för den delen har erfarenheten utav?

Skickades från m.sweclockers.com