Go Down

Topic: hulp bij script  (Read 705 times) previous topic - next topic

donnyrijken

ik wil een regeling maken met 2 druk sensoren en 3 push buttons
de 3 buttons moeten 3 verschillende drukken regelen 1 2 3 bar en dan onderling moeten ze ook van button kunnen zakken dus
button 1 1 bar
button 2 2 bar
button 3 3 bar

druk ik op button 3 moet hij naar die druk gaan en als die die druk heeft bereikt moet hij het relays weer sluiten
druk ik al er 3 bar is op button 1 moet hij weer terug zakken door een andere relays die de druk laat leeg lopen middels een magneet ventiel

ik ben begonnen met het volgende script

Code: [Select]
int rawValue; // voor druk
int rawValue1; // achter druk
int offset = 95;
int fullScale = 807;
float voordruk;
float achterdruk;
char data = 0;       

void setup() {
  Serial.begin(9600);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
 

}

void loop() {


  if(Serial.available() > 0)
  data = Serial.read();
  int rawValue = analogRead(A0);
  float bar = (float) (rawValue - offset) * 7.9 / (float) (fullScale - offset);
 
  int rawValue1 = analogRead(A1);
  float bar1 = (float) (rawValue1 - offset) * 7.9 / (float) (fullScale - offset);
 delay(500);


Serial.println(bar);
Serial.println(bar1);



  if(digitalRead(4) == HIGH)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
  }
   if (bar > 0.50 )
  {
    digitalWrite(2, LOW);
  }
   if (bar1 > 0.50 )
  {
    digitalWrite(3, LOW);
  }
   if (bar < 0.50 )
  {
    digitalWrite(7, HIGH);
  }
   if (bar1 < 0.50 )
  {
    digitalWrite(8, HIGH);
  }



  if(digitalRead(5) == HIGH)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
  }
   if (bar > 1.00)
  {
    digitalWrite(2, LOW);
  }
   if (bar1 > 1.00)
  {
    digitalWrite(3, LOW);
  }
   if (bar < 1.00)
  {
    digitalWrite(7, LOW);
  }
   if (bar1 < 1.00)
  {
    digitalWrite(8, LOW);
  }


   if(digitalRead(6) == HIGH)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
  }
   if (bar > 1.30)
  {
    digitalWrite(2, LOW);
  }
   if (bar1 > 1.30)
  {
    digitalWrite(3, LOW);
  }
   if (bar < 1.30)
  {
    digitalWrite(7, LOW);
  }
   if (bar1 < 1.30)
  {
    digitalWrite(8, LOW);
  }
}



is dit de juiste opbouw want dit werkt namelijk niet hij begin al met meten van de if bar

MAS3

Hoi.

Ik snap je vraag niet, zal vast aan mij liggen.
Wat bedoel je met "hij begin al met meten van de if bar" ?

Volgens mij gaat er in ieder geval al iets niet helemaal goed in regel 22 van de code die je hier hebt neergezet.
Dat is dit stukje:
Code: [Select]
  if(Serial.available() > 0)

Daar stel je een voorwaarde, namelijk dat er een seriële verbinding moet zijn.
Maar aan die voorwaarde is geen consequentie verbonden.
Een stukje verderop doe je dat goed, maar hier niet.
Daar gebruik je namelijk wel de { } na een if...
Door het zo te doen als je het nu hebt, maakt het dus niet uit of de seriële verbinding er is of niet, hij gaat gelijk door met het uitvoeren van regel 23 en zo voorts.

Verder doe je iets met drukknopjes volgens je verhaal, maar wat je met die knopjes doet, geen idee.
Je kijkt of iets hoog is in je code, dat zie ik wel.
Maar als ie niet hoog is, betekent dat dan dat ie laag is ?
Volgens mij is dat niet vanzelfsprekend, maar ik heb geen idee of je een of andere truc hebt bedacht die dat dan afdwingt.
En, als je moet vertellen of iets een OUTPUT is, zou het dan eventueel ook kunnen zijn dat je misschien moet vertellen of iets anders een INPUT is ?

Dat zijn wat dingetjes die me opvallen, maar ik ga niet roepen dat ze echt fout zijn want ik weet niet wat je verder hebt.
Lijkt me wel een paar dingen om eens nader te bekijken.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

maak eerst een schema waar wat zit (en schrijf dat ook als comment in je programma, (dan weten wij ook hoe het in elkaar zit.
vervolgens schrijf je een functie die kijkt naar de drukknoppen en dan bepaal je een status aan de hand van de knoppen.
dan schrijf je een functie die de druk regelet
en tenslotte een functie waar je de uitgangen in bepaalt.
dan wordt het allemaal wat overzichtelijker.
Zoals je zegt werkt het niet maar je weet helemaal niet wat er niet en wel goed gaat, dus in je programma veel serial prints opnemen (die kun je er straks weer uithalen als het werkt.
gewoon lekker debuggen en simpel beginnen (met 1 knop en 1 stand)

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

donnyrijken

thanks for de info ik heb nu dit script gemaakt en dit werkt
schakelt aan en als de druk een halve bar is schakelen ze uit
nu moet ik de volgende knop plaatsen en die moet dezelfde relays uitschakelen bij 1 bar
maar als zij die 1 bar bereikt hebben en ik druk op knop 1 moet hij de druk weer leeg laten lopen door middel van de 2 andere relays digital pin 7 en 8

Code: [Select]
int relay = 2;
int relay1 = 3;
int relay2 = 7;
int relay3 = 8;
int button1 = 4;
int button2 = 5;
int button3 = 6;

int val = 0;
int val1 = 0;
int val2 = 0;


int rawValue; // voor druk
int rawValue1; // achter druk
int offset = 95;
int fullScale = 807;
float voordruk;
float achterdruk;
int bar = A0;
int bar1 = A1;

void setup() {
  Serial.begin(9600);
  pinMode(relay, OUTPUT);
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(bar, INPUT);
  pinMode(bar1, INPUT);
}

void loop() {
  int rawValue = analogRead(A0);
  float bar = (float) (rawValue - offset) * 7.9 / (float) (fullScale - offset);
  int rawValue1 = analogRead(A1);
  float bar1 = (float) (rawValue1 - offset) * 7.9 / (float) (fullScale - offset);

  delay(100);

  Serial.println(bar);
  Serial.println(bar1);

  val = digitalRead(button1);
  if (val == HIGH)
  {
    digitalWrite(relay, HIGH);
    digitalWrite(relay1, HIGH);
  }
  else if (bar > 0.50)
  {
    digitalWrite(relay, LOW);
    if (bar1 > 0.50)
    {
      digitalWrite(relay1, LOW);
    }
  }
}


shooter

je zult je programma dus uit moeten breiden met een soort status, zodat je kunt kiezen naar welke toestand het geheel moet gaan.
dat is makkelijkst als je een functie erbij zet voor elke toestand, en als deze bereikt is dan ga je terug naar je hoofdloop.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up