Sida 1 av 3

Vart i koden skriver jag fel?

Postat: 19 januari 2018, 14:36:19
av fosfor
Tjo!

Jag har dessa två kodsnuttar jag inte får att fungera i min längre kodsnutt som styr hur motorn reagerar på knapptryckning. :humm:
Tanken med denna bit kod är att den ska overrida en nedktryckt knapp när något passerar en viss sensor, dvs stoppa en motor från att åka för långt.
Här är de två olika varianterna jag försökt använda mig av. :doubt: :shock:

Den

Kod: Markera allt

if(stopsensor1Pin == 1);               // Ska stoppa motorn vid HIGH  
  digitalWrite(controlPin2, LOW);
Eller den

Kod: Markera allt

  val = digitalRead(stopsensor1Pin);         // Ska stoppa motorn vid HIGH
  if (val == HIGH) {                   
  digitalWrite(controlPin2, LOW);

Här är den längrekodbiten som fungerar bra, men som jag alltså skulle vilja använda med någon av ovanskrivna koder. :shock:

Kod: Markera allt

//  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----

// intest 1 går UPP
// intest 2 går NER
// stopsensor1Pin heter stoppsensorn

{

// ---- UPP ----
  val = digitalRead(intest1Pin);         // UPP - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, HIGH);       
  digitalWrite(controlPin2, LOW);

// Dessa 3 rader visar text när nedåtknapp trycks NED ------
  lcd.setCursor(0, 1);
lcd.print("Up");
delay(50);
  }


// ---- NER ----
  else {
  val = digitalRead(intest2Pin);         // NER - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, LOW);       
  digitalWrite(controlPin2, HIGH);

// Dessa 3 rader visar text när nedåtknapp trycks NED ------
    lcd.setCursor(0, 1);
lcd.print("Down");
delay(50);
  }


// Dessa två rader stoppar motorn när man släpper knappen
  else {
  digitalWrite(controlPin1, LOW);        
  digitalWrite(controlPin2, LOW);       
  }

  
}
}
}

Tack på förhand!

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 14:38:50
av adent
Hej!

Vill du vara snäll och editera ditt förra inlägg och lägg koden innanför code-taggar. Du hittar knappen ovanför textrutan bredvid "B i u Quote" så står det Code. Lägg in koden innanför dem så blir det mycket mycket lättare!

MVH: Mikael

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 14:41:34
av fosfor
Ah ok SÅ!

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 14:42:14
av bit96
Jag har inte läst hela koden men ett semikolon efter if() får nästa rad att alltid utförs, vilket nog inte var tänkt.
Använd alltid klamrar.

if(stopsensor1Pin == 1); // SENSOR - Läser input värde

Edit: Jag han svara innan du skrivit om med code-taggar

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 14:55:15
av fosfor
Löste sig!

Detta stoppade motorn när sensorn täcktes.
Den stoppar den då bara från att köra ner, men man kan köra tillbaka den. Vilket är meningen.

Kod: Markera allt

  {
  val = digitalRead(stopsensor1Pin);         // Ska stoppa mototn
  if (val == HIGH) {                     
  digitalWrite(controlPin2, LOW);
  }

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 17:58:21
av Icecap
Igen gör du fel.

Rad 1: if(stopsensor1Pin == 1); // Ska stoppa motorn vid HIGH
Rad 2: digitalWrite(controlPin2, LOW);

Rad 1 sluter med en semikolon varför den inte har någon verkan på rad 2.

Semikolon avslutar ett kommando/statement. Hade du tagit bort semikolonet i Rad 1 hade det fungerat som tänkt.

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 18:44:29
av HUGGBÄVERN
Hur ser resten av koden ut?

Re: Vart i koden skriver jag fel?

Postat: 19 januari 2018, 21:34:45
av TomasL
Och vilket system samt utvecklingsmiljö?

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 09:29:07
av fosfor
Icecap:

Om jag gör som du föreslår, dvs tar bort semikolonet, så står det bara "expected ; before digitalWrite.
Har testat som du föreslår, och olika varianter, det passerar inte kontrollen utan felmeddelande om jag inte har med semikolonet.
:humm:

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 09:54:41
av ffredrik
Du kan i såfall ta bort if-satsen med ; på slutet, den raden är helt meningslös.
Det finns uppenbarligen ett annat syntaktiskt fel i koden någonstans.

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 09:59:48
av fosfor
ffredrik:

Testade ta bort if satsen nu, blir samma fel då också.
Jag skulle gärna åtgärda fel, så att koden blir mer korrekt.
Men här är koden iaf, som trots alla fel som påpekats, fungerar precis som det är tänkt.

Kod: Markera allt

//  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----

// intest 1 går UPP
// intest 2 går NER
// stopsensor1Pin heter stoppsensorn

{

// ---- UPP ----
  val = digitalRead(intest1Pin);         // UPP - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, HIGH);       
  digitalWrite(controlPin2, LOW);

// Dessa 3 rader visar text när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  lcd.setCursor(0, 1);
lcd.print("Up");
delay(50);
  }


// ---- NER ----
  else {
  val = digitalRead(intest2Pin);         // NER - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, LOW);       
  digitalWrite(controlPin2, HIGH);

// Detta är sensorn som, om täcks, hindrar motorn från att åka ner
  {
  val = digitalRead(stopsensor1Pin);         // Sensorn som stoppar motorn
  if (val == HIGH) {                     
  digitalWrite(controlPin2, LOW);
  }


// Dessa 3 rader visar text när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
    lcd.setCursor(0, 1);
lcd.print("Down");
delay(50);
  }


// Dessa två rader stoppar motorn när man släpper knappen
  }  else {
  digitalWrite(controlPin1, LOW);        
  digitalWrite(controlPin2, LOW);       
  }

  
}
}
}

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 10:46:06
av SeniorLemuren
Ett stort fel i denna kod är ju att du skriver till LCD med en delay varje varv som loopen snurrar. Du skall bara skriva till displayen en gång så snart du ändrar någon status.

Gör skrivningen till LCD som egna procedurer som du anropar första varvet i loopen när du trycker in en knapp, sedan anropar du en procedur en gång i loopen som talar om att ingen knapp är intryckt när du släpper knappen.

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 11:11:06
av bit96
Det kan inte vara hela koden eftersom du har 7 vänsterklamrar och 8 högerklamrar.
Din indentering är också svår att följa.

Fel med klammer-matchning kan ibland ge svårtydbara felmeddelanden, te.x. att ett semikolon fattas.

Om klamrarna kommer ur fas kan det också hända att vissa deklarationer inte syns där dom skall vara synliga eller tvärtom.

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 11:23:02
av SeniorLemuren
SeniorLemuren skrev:Ett stort fel i denna kod är ju att du skriver till LCD med en delay varje varv som loopen snurrar. Du skall bara skriva till displayen en gång så snart du ändrar någon status.

Gör skrivningen till LCD som egna procedurer som du anropar första varvet i loopen när du trycker in en knapp, sedan anropar du en procedur en gång i loopen som talar om att ingen knapp är intryckt när du släpper knappen.
En annan grej är att du skapar nya trådar hela tiden för som gäller samma projekt. Det är många gånger lättare att hjälpa till om du samlar alla problem i samma tråd.

Dessa trådar verkar ju hänga ihop.
Vart i koden skriver jag fel?
Arduinokod för motor på/av med knapp.
Textsnutt innan loop.
Arduino - Knappstyrning av motor med Encoder disc & sensorer

Re: Vart i koden skriver jag fel?

Postat: 22 januari 2018, 11:36:58
av fosfor
SeniorLemuren:
Det är samma projekt, men olika problem. Därav att jag skapat olika trådar.
Ny tråd har kommit till efter att ett problem har blivit (eller iaf just då vid tillfället såg ut att vara) löst.

Er övriga & SeniorLemuren:
Men men, det blir lite svettigt. Nu blir det att försöka städa upp och snygga till koden utefter era observationer.
Det verkar uppenbart att en del 'issues' har tillkommit genom kodskrivandets gång som vore bäst att ta tag i redan nu innan jag fortsätter.

Min nästa fråga, ang. LCD'n. Hur "anropar" jag den separat? Såsom påpekades här i tråden. :humm:
Samt vilka övriga problem med koden bör prioriteras? :shock:
Tack på förhand

För info:
I nuläget fungerar den så att den kan köras upp, ner och när den slår i botten (tar i en sensor) så stannar den.
På sin 2x16 LCD visar den pulser som passerat om den kört upp/ner, samt den visar texten 'Up' eller 'Down', samt texten 'Stop' när sensorn sätter stopp för nerfärden.
Ett problem jag spontant skulle vilja lösa är att texten Up Down och Stop flimrar när de visas, vilket jag inte vet hur man löser. :roll: