Go Down

Topic: sensor HC-SR04 (Read 11559 times) previous topic - next topic

Dewaele

sorry we spreken de zelfde taal maar toch versta ik jullie niet zo goed .

MAS3

OK, dat kan.

Maar nu weet ik niet wat je wel, en wat je niet begrepen hebt.
Is er iets in mijn vorige post wat je wel begrepen hebt, en iets wat je niet begrepen hebt ?
Of snap je helemaal niets van wat daar staat ?

Het probleem in je code dat je nu het best eerst aanpakt, is met deze regel beschreven:

"Het is niets anders dan wat je met de aansluitingen van je sensoren doet in de code."

Dus kijk eens in je code wat je daar doet om het verschil te maken tussen de beide sensoren.
Als je dat ook doet voor de resultaten, kom je verder.
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

Dewaele

ik weet niet wat jullie willen zeggen ?
maar ik ben met arduino begonnen als tijdverdrijf .
ben 57 jaar , en ben op zoek naar een oplossing van mijn probleem .
en als ik het door heb is er geen oplossing van mijn probleem en kan er geen twee sensoren aan 1 arduino
werken . dus zal ik maar een octosonar kopen .

MAS3

Niemand heeft gezegd dat er geen oplossing voor je probleem is, want dan zou er gelogen worden.
Natuurlijk is er wel een oplossing.
Maar het is wel belangrijk dat je zelf de oplossing ook ziet, en dat is waarom er niemand de code voor je gaat schrijven / afmaken.
Want dan ga je er niet erg veel van leren en sta je met je volgende projectje met dezelfde vraag weer achter de oren te krabben.

Wat je veranderd had in je laatste code kan niet werken.
Dat gaat fout in het stukje waarin je dit doet:

Code: [Select]
(distance ,1 < 30)

Je zou het wel op die manier kunnen doen maar je maakt het jezelf alleen maar onnodig lastig en is in dit geval meer werk dan noodzakelijk.
Wat Nico je voorstelde was om dit te doen:

Code: [Select]
(distance1 < 30)

Ik hoop dat je dit verschil herkent.
Natuurlijk moet er dan ook een distance2 zijn, zoals Nico ook vertelde.


En overigens; de leeftijden van Nico en mezelf zitten helemaal niet zo ver van de jouwe, dus leeftijd heeft hier niets mee te maken.
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

nicoverduin

Ik ben pas 63. Nog minstens 37 te gaan :) :)
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Dewaele

(distance1 < 30) als ik dit aanbreng heeft ie fout aan

ZUID

#21
Dec 09, 2019, 08:34 am Last Edit: Dec 09, 2019, 08:49 am by ZUID
distance is een variabele.
distance1 zou dat ook moeten zijn.

Ik neem aan dat de compiler een fout aangaf.  Welke?
Voor mij is het zo een beetje raden wat er "fout" ging.
PS. 73 jaar

Dewaele

distance staat in het rood maar als ik distance1 van maak komt het in het zwart .
als ik dan compiler heeft ie distance1 was not declared in this scope

Dewaele

zo werk het wel , maar de sensors weken te samen



Code: [Select]


  int trigPin2  = 2 ;
  int echoPin2 = 3 ;
  int trigPin1  = 4 ;
  int echoPin1 = 5 ;   
 
 
  int revright = 8 ;       //REVerse motion of Left motor
  int fwdleft = 9 ;       //ForWarD motion of Left motor
  int revleft = 10 ;      //REVerse motion of Right motor
  int fwdright = 11 ;

  int duration = pulseIn( echoPin2, HIGH );
  int distance = (duration * 0.0343) / 2;

 
  void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT );
 
  Serial.begin(96000);
}
        void loop() {
       
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin2, LOW);
      duration = pulseIn(echoPin2, HIGH);
      distance = (duration * 0.0343) / 2;

    if (distance <  30)

      digitalWrite(trigPin1, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin1, LOW);
      duration = pulseIn(echoPin1, HIGH);
      distance = (duration * 0.0343) / 2;

   
     
          if (distance< 30){
 

 
   
         

  digitalWrite(8,  LOW);
  digitalWrite(9,  LOW);
  digitalWrite(10,  LOW);
  digitalWrite(11,  LOW);
    delay(1000);   


       
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  delay(500);

       
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(2000); 


   
  digitalWrite(8, LOW );
  digitalWrite(9, LOW );
  digitalWrite(10, LOW );
  digitalWrite(11, HIGH );
  delay(500);         
 

  digitalWrite(8,  LOW);
  digitalWrite(9,  LOW);
  digitalWrite(10,  LOW);
  digitalWrite(11,  LOW);
  delay(1000);
 

     
   
     } else  {
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
          }}

ZUID

Code: [Select]
int duration = pulseIn( echoPin2, HIGH );
  int distance = (duration * 0.0343) / 2;


Met deze code VOOR de start van de SETUP en de LOOP worden twee variabele gedefinieerd.
De getoonde berekening wordt hier EENMALIG uitgevoerd.

Wijziging van "duration" of van "distance" hebben hier geen invloed meer op.
In de LOOP worden ze daarom telkens opnieuw uitgerekend.
Als je nu daar een tweede "duration" en/of "distance"  nodig hebt moet je dus ook zorgen dat er aan het begin van je code een tweede wordt gemaakt.

In dit geval dus een tweede  int met bijvoorbeeld de naam distance2.

Kijk ook eens bij: https://www.arduino.cc/en/Reference/VariableDeclaration
Maar er is vast nog wel meer te vinden met Google.



Dewaele


heb de code aangepast met duration1 en distance1 en 2 , probleem blijft altijd zelfde 
er werkt maar 1 sensor en altijd in viod loop de onderst


Code: [Select]

 const int trigPin1  = 2 ;
 const  int echoPin1 = 3 ;
 const int trigPin2  = 4 ;
 const int echoPin2 = 5 ;   
 
 
 const int revright = 8 ;       //REVerse motion of Left motor
 const int fwdleft = 9 ;       //ForWarD motion of Left motor
 const int revleft = 10 ;      //REVerse motion of Right motor
 const int fwdright = 11 ;

  volatile float duration1 = pulseIn( echoPin1, HIGH );
  volatile float distance1 = (duration1 * 0.0343) / 2;
  volatile float duration2 = pulseIn( echoPin2, HIGH );
  volatile float distance2 = (duration2 * 0.0343) / 2;


  void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT );
 
  Serial.begin(96000);
}
        void loop() {
       
      digitalWrite(trigPin1, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin1, LOW);
      duration1 = pulseIn(echoPin1, HIGH);
      distance1 = (duration1 * 0.0343) / 2;
     
    if (distance1 <  30)
   
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin2, LOW);
      duration2 = pulseIn(echoPin2, HIGH);
      distance2 = (duration2 * 0.0343) / 2;

   
     
          if (distance2 < 30){

MAS3

Hoi.

De variabele duration is maar voor 1 regel code van belang.
Na die regel wordt ie omgerekend van een tijdseenheid naar een afstand, en die afstand komt dan in distance1 of distance2 terecht.
Daarom hoef je geen duration1 en duration2 te maken, deze variabele mag gerust overschreven worden in de volgende sectie van je code.
Dus kun je volstaan met duration.

Verder declareer je in regels 15 en 16 niet alleen 2 variabelen, maar vult die ook meteen met een resultaat uit pulseIn.
Omdat je niet net daarvoor je ping gestuurd hebt, zal er ook geen echo terug komen.
Daarom wacht pulseIn totdat de voor ingestelde tijd verlopen is, en geeft het "eindeloze" wachten dan op met het resultaat nul.
Daar is op zich niets mis mee, maar het kost je wel 2 keer onnodig wachten.

De code die je laat zien is nog niet af.
Daar heb ik eerder ook al naar gehint, maar ben er tot nog toe niet verder op ingegaan omdat je eerst iets anders moest begrijpen.

In regel 53 stel je een voorwaarde aan distance2, maar wat er dan moet gebeuren mis ik.

In regel 41 stel je een voorwaarde aan distance1, en daarna moet er niets gebeuren en gaat de code verder.
Dus als je nog meer dan 53 regels hebt, dan geloof ik meteen dat alleen distance2 iet zou kunnen bewerkstelligen, maar distance1 wordt alleen beoordeeld en daar word verder helemaal niets mee gedaan.
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

Dewaele

hoi.

sorry, heb alles uitgezocht maar kan maar 1 sensor doen werken .
weet niet wat ik moet veranderen bij   if ( distance1 > 30) en  if ( distance2  < 30) {.
als ik dat verander werken de twee sensoren maar niet zo als ik wil





Code: [Select]


int trigPin2  = 2 ;
int echoPin2 = 3 ;
int trigPin1  = 4 ;
int echoPin1 = 5 ;


int revright = 8 ;       //REVerse motion of Left motor
int fwdleft = 9 ;       //ForWarD motion of Left motor
int revleft = 10 ;      //REVerse motion of Right motor
int fwdright = 11 ;

volatile float duration ;
volatile float distance1 ;
volatile float distance2 ;



void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT );

  Serial.begin(96000);
}
void loop() {

  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);
  distance1 = (duration * 0.0343) / 2;
  Serial.print("distance1: ");
  Serial.println(" cm");


  if ( distance1 > 30)



    digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration = pulseIn(echoPin2, HIGH);
  distance2 = (duration * 0.0343) / 2;
  Serial.print("distance: ");
  Serial.println(" cm");


  if ( distance2  < 30) {


    digitalWrite(8,  LOW);
    digitalWrite(9,  LOW);
    digitalWrite(10,  LOW);
    digitalWrite(11,  LOW);
    delay(1000);

    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
    delay(500);

    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    delay(2000);

    digitalWrite(8, LOW );
    digitalWrite(9, LOW );
    digitalWrite(10, LOW );
    digitalWrite(11, HIGH );
    delay(500);

    digitalWrite(8,  LOW);
    digitalWrite(9,  LOW);
    digitalWrite(10,  LOW);
    digitalWrite(11,  LOW);
    delay(1000);

  } else  {
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    digitalWrite(10, HIGH);
    digitalWrite(11, LOW);

  }
}
[\code]

MAS3

#28
Dec 11, 2019, 12:22 am Last Edit: Dec 11, 2019, 12:24 am by MAS3
Hoi.


Een if statement gebruik je om een stukje code onder door jou te bepalen voorwaarden uit te voeren.
Om dat te doen moet dit als volgt opgebouwd worden:

Code: [Select]
if (voorwaarde) {
  //uit te voeren code
}


Dat betekent dus dat als aan jouw voorwaarde wordt voldaan, dan word datgene wat het eerst na de controle van die voorwaarde staat, uitgevoerd.
Wanneer je dat tussen { } haakjes zet, dan kunnen er meer dan 1 regel uitgevoerd worden.
Maar om helemaal te begrijpen wat dat betekent, moet je wel weten wanneer een regel ten einde is voor de IDE.
Want een nieuwe regel op je monitor, is dat dus niet.
Een regel word pas beƫindigd wanneer er een ; puntkomma staat (daar zijn wel uitzonderingen op).

In jouw code word regel 49 uitgevoerd wanneer aan de voorwaarde in regel 45 word voldaan en anders niet.
De autoformat die je hebt gebruikt voor het plaatsen van de code laat je dat ook zien.
Want alleen die ene regel 49 is nog een extra spatie ingesprongen (en daarmee heb je meteen het bewijs dat je IDE je op die manier helpt).

Ik weet zeker dat dat niet is wat je wilde.

Want op regel 49 word de ping voor de 2e meting gegeven en dat word overgeslagen als de 1e meting niet tot het gewenste resultaat heeft geleid.
En daarmee gaat bij een ongewenst resultaat (distance1), meting 2 al helemaal fout.


Ik weet niet wat je wilde gaan doen als aan de voorwaarde in regel 45 word voldaan.
Maar als ik de code had geschreven, dan was het laatste teken op regel 45 een { geweest.
Sommigen zetten dat teken liever op regel 46, dat mag iedereen dus voor zichzelf weten en voor de IDE maakt het dus helemaal niets uit.
De regels code type ik dan in met elke keer als er een ; komt ook een nieuwe regel want dat ziet er mooi overzichtelijk uit.
Uiteindelijk eindigt het stukje dat onder voorwaarde moet worden uitgevoerd weer met een }





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

Dewaele

hoi.

kan deze code niet inbrengen , als ik  if (condition) zet krijg ik altijd fout .


if (voorwaarde) {
  //uit te voeren code
}
if (condition) {
  //uit te voeren code
}

Go Up