[solved] Arduino mega 6 hc-sr04 sensoren

Hallo,

ik ben Rob 20 jaar al een tijdje af en toe bezig met arduino
maar niet echt een prof
heb al wel een aantal leuke projectjes gemaakt :wink:

nu stuit ik op een probleem.

ik ben voor een groter project bezig om van een aantal HC-SR04 sensoren een digitaal uitgangs signaal te maken om deze door te sturen naar mijn plc.

ik heb er voor gekozen om dat met de sr04 sensoren en een arduino mega te doen omdat ultrasone sensoren die ik zo plug and play kan aansluiten op een plc een klein fortuin kosten :confused:

het plan is als volgt ik heb 2 groepjes van 3 sensoren als een van deze sensoren binnen een waarde van 5 tot 50cm vallen dan zal een relais hoog worden met deze relais zal ik dus de ingangs spanning voor de plc schakelen

elk groepje sensoren heeft dus een eigen relais

nu had ik alles werkend met deze code :

#define trig1 22 //trigger sensor 1
#define trig2 24 //trigger sensor 2
#define trig3 26 //trigger sensor 3
#define trig4 28 //trigger sensor 4
#define trig5 30 //trigger sensor 5
#define trig6 32 //trigger sensor 6
#define echo1 23 //echo sensor 1
#define echo2 25 //echo sensor 2
#define echo3 27 //echo sensor 3
#define echo4 29 //echo sensor 4
#define echo5 31 //echo sensor 5
#define echo6 33 //echo sensor 6

int Relais1 = 34;
int Relais2 = 35;
int maxDistance = 50;
int minDistance = 5;
long microSecond1, cmDistance1;
long microSecond2, cmDistance2;
long microSecond3, cmDistance3;
long microSecond4, cmDistance4;
long microSecond5, cmDistance5;
long microSecond6, cmDistance6;



void setup() {
 Serial.begin (115200);
 pinMode(trig1, OUTPUT);
 pinMode(trig2, OUTPUT);
 pinMode(trig3, OUTPUT);
 pinMode(trig4, OUTPUT);
 pinMode(trig5, OUTPUT);
 pinMode(trig6, OUTPUT);
 pinMode(echo1, INPUT);
 pinMode(echo2, INPUT);
 pinMode(echo3, INPUT);
 pinMode(echo4, INPUT);
 pinMode(echo5, INPUT);
 pinMode(echo6, INPUT);
 pinMode(Relais1, OUTPUT);
 pinMode(Relais2, OUTPUT);

 
 }
void loop() {
 digitalWrite(trig1, LOW);
 delayMicroseconds(2);
 digitalWrite(trig1, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig1, LOW);
 microSecond1 = pulseIn(echo1, HIGH);
 cmDistance1 = microSecond1/58.3;
 delay(10);
 digitalWrite(trig2, LOW);
 delayMicroseconds(2);
 digitalWrite(trig2, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig2, LOW);
 microSecond2 = pulseIn(echo2, HIGH);
 cmDistance2 = microSecond2/58.3;
 delay(10);
 digitalWrite(trig3, LOW);
 delayMicroseconds(2);
 digitalWrite(trig3, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig3, LOW);
 microSecond3 = pulseIn(echo3, HIGH);
 cmDistance3 = microSecond3/58.3;
 delay(10);
 digitalWrite(trig4, LOW);
 delayMicroseconds(2);
 digitalWrite(trig4, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig4, LOW);
 microSecond4 = pulseIn(echo4, HIGH);
 cmDistance4 = microSecond4/58.3;
 delay(10);
 digitalWrite(trig5, LOW);
 delayMicroseconds(2);
 digitalWrite(trig5, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig5, LOW);
 microSecond5 = pulseIn(echo5, HIGH);
 cmDistance5 = microSecond5/58.3;
 delay(10);
 digitalWrite(trig6, LOW);
 delayMicroseconds(2);
 digitalWrite(trig6, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig6, LOW);
 microSecond6 = pulseIn(echo6, HIGH);
 cmDistance6 = microSecond6/58.3;

delay(10);

// detectie voorzijde met sensor 1,2,3
 if (cmDistance1 >= maxDistance, cmDistance2 >= maxDistance ,cmDistance3 >= maxDistance)
 {
  digitalWrite(Relais1, LOW);
 }
 
 else if (cmDistance1 >= minDistance, cmDistance2 >= minDistance, cmDistance3 >= minDistance)
 {
  digitalWrite(Relais1, HIGH);
  Serial.println("Detectie Voorzijde");
 }
 
 else {
 digitalWrite(Relais1, LOW);
}

// detectie achterzijde met sensor 4,5,6
if (cmDistance4>= maxDistance, cmDistance5 >= maxDistance ,cmDistance6 >= maxDistance)
 {
  digitalWrite(Relais2, LOW);
 }
 
 else if (cmDistance6 >= minDistance, cmDistance5 >= minDistance, cmDistance6 >= minDistance)
 {
  digitalWrite(Relais2, HIGH);
  Serial.println("Detectie Achterzijde");
 }
 
 else {
 digitalWrite(Relais2, LOW);
}
 
   delay(10);
 }

alleen op magische wijze werkt het plots niet meer:(

ik ben bekend met de newping library
alleen daar mee kreeg ik het niet voor elkaar om de sensoren binnen een bepaalde waarde te laten schakelen

eerst ging ik er van uit dat mijn arduino of sensoren waren overleden maar na het testen van beide blijkt dat niet het geval (getest met de newping library)

wie kan mij helpen ??

Groet Rob

Hoi Rob, welkom.

Wat een hoop ge-delay in die sketch, ik houd daar niet zo van want het is ontzettend zonde van het beetje rekenkracht waar je met je Arduino over beschikt (zie mijn handtekening onderaan).
"Het werkt niet" is zo'n beetje de slechtste klachtomschrijving die iemand ooit kan geven.
Dus dan is de geijkte vraag: "Hoezo werkt het niet ?"
Vertel ons wat je verwacht van je sketch, en wat je in plaats daarvan ziet.

Ik heb geen idee wat er mis gaat en het is heel goed mogelijk dat je een probleem in de code hebt.
Maar in die code zie ik dat je iets via de seriële poort verstuurt, namelijk als je een object hebt gedetecteerd en een relais hebt aangezet.

Gebruik die seriële poort om je probleem op te sporen.
Stuur telkens als je iets gedaan hebt, het resultaat naar die seriële poort.
Dus elke meting, en elke berekening en elke aansturing.
Zet er dan ook gelijk bij wat je stuurt en niet alleen het resultaat.
Na het starten van je sketch en de seriële monitor zie je dan van alles voorbij komen.
Wie weet of je dan ineens iets heel anders ziet als je eigenlijk verwacht.

Hey,

Het raadsel voor mij is nu eigenlijk een beetje dat eerst wel werkte en nu op eens niet meer terwijl ik niks aan de code heb veranderd ook eerdere versies van de code werken niet meer
Terwijl de new Ping wel werkt

heb in tussen al wel een paar keer alles op nieuw op gebouwd maar nog zonder resultaat

Als je code niet is veranderd, moet je op zoek naar wat er wel is veranderd.

Gebruik je nu je toepassing stand alone terwijl je 'm voorheen altijd met de PC verbonden had bijvoorbeeld ?
Dat soort zaken dus.

Ik zu toch eerst eens kijken naar het delay probleem zoals MAS reeds opmerkte. Het is voldoende dat een pinnetje hoog of laag staat en alles staat vast.
Als je dan toch voor delay blijft kiezen voeg dan serial.println() toe zodat je weet wat je code aan het doen is. En waar het dus mis gaat.

En weet jij wat deze lijn code doet?

 if (cmDistance1 >= maxDistance, cmDistance2 >= maxDistance ,cmDistance3 >= maxDistance)

Want ik weet het niet.

Jantje

Jantje

dat stuk code moet als het goed dit betekenen

als : cmdistance1 groter dan maxdistance of cmdistance2 groter dan maxdistance of cmdistance3 groter dan maxdistance

doe dit

als ik de code wijzig naar

dit :

#define trig1 22 //trigger sensor 1
//#define trig2 24 //trigger sensor 2
//#define trig3 26 //trigger sensor 3
//#define trig4 28 //trigger sensor 4
//#define trig5 30 //trigger sensor 5
#define trig6 32 //trigger sensor 6
#define echo1 23 //echo sensor 1
//#define echo2 25 //echo sensor 2
//#define echo3 27 //echo sensor 3
//#define echo4 29 //echo sensor 4
//#define echo5 31 //echo sensor 5
#define echo6 33 //echo sensor 6

int Relais1 = 34;
int Relais2 = 35;
int maxDistance = 50;
int minDistance = 2;
long microSecond1, cmDistance1;
//long microSecond2, cmDistance2;
//long microSecond3, cmDistance3;
//long microSecond4, cmDistance4;
//long microSecond5, cmDistance5;
long microSecond6, cmDistance6;



void setup() {
 Serial.begin (115200);
 pinMode(trig1, OUTPUT);
//pinMode(trig2, OUTPUT);
// pinMode(trig3, OUTPUT);
// pinMode(trig4, OUTPUT);
// pinMode(trig5, OUTPUT);
 pinMode(trig6, OUTPUT);
 pinMode(echo1, INPUT);
 //pinMode(echo2, INPUT);
 //pinMode(echo3, INPUT);
 //pinMode(echo4, INPUT);
 //pinMode(echo5, INPUT);
 pinMode(echo6, INPUT);
 pinMode(Relais1, OUTPUT);
 pinMode(Relais2, OUTPUT);

 
 }
void loop() {
 digitalWrite(trig1, LOW);
 delayMicroseconds(2);
 digitalWrite(trig1, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig1, LOW);
 microSecond1 = pulseIn(echo1, HIGH);
 cmDistance1 = microSecond1/58.3;
 delay(10);
 /**digitalWrite(trig2, LOW);
 delayMicroseconds(2);
 digitalWrite(trig2, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig2, LOW);
 microSecond2 = pulseIn(echo2, HIGH);
 cmDistance2 = microSecond2/58.3;
 delay(1);
 digitalWrite(trig3, LOW);
 delayMicroseconds(2);
 digitalWrite(trig3, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig3, LOW);
 microSecond3 = pulseIn(echo3, HIGH);
 cmDistance3 = microSecond3/58.3;
 delay(1);
 digitalWrite(trig4, LOW);
 delayMicroseconds(2);
 digitalWrite(trig4, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig4, LOW);
 microSecond4 = pulseIn(echo4, HIGH);
 cmDistance4 = microSecond4/58.3;
 delay(1);
 digitalWrite(trig5, LOW);
 delayMicroseconds(2);
 digitalWrite(trig5, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig5, LOW);
 microSecond5 = pulseIn(echo5, HIGH);
 cmDistance5 = microSecond5/58.3;
 delay(1);
 /**/
 digitalWrite(trig6, LOW);
 delayMicroseconds(2);
 digitalWrite(trig6, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig6, LOW);
 microSecond6 = pulseIn(echo6, HIGH);
 cmDistance6 = microSecond6/58.3;

delay(10);

// detectie voorzijde met sensor 1,2,3
 if (cmDistance1 >= maxDistance)//, cmDistance2 >= maxDistance)// ,cmDistance3 >= maxDistance)
 {
  digitalWrite(Relais1, LOW);
 }
 
 else if (cmDistance1 >= minDistance)//, cmDistance2 >= minDistance)//, cmDistance3 >= minDistance)
 {
  digitalWrite(Relais1, HIGH);
  Serial.println("Detectie Voorzijde");
 }
 
 else {
 digitalWrite(Relais1, LOW);
}

// detectie achterzijde met sensor 4,5,6
 if (cmDistance6 >= maxDistance)//, cmDistance5 >= maxDistance ,cmDistance6 >= maxDistance) let op 6 veranderen naar 4
 {
  digitalWrite(Relais2, LOW);
 }
 
 else if (cmDistance6 >= minDistance)//, cmDistance5 >= minDistance, cmDistance6 >= minDistance)idem
 {
  digitalWrite(Relais2, HIGH);
  Serial.println("Detectie Achterzijde");
 }
 
 else {
 digitalWrite(Relais2, LOW);
}

 
   delay(100);
 }

hier maak ik gebruik van slechts 2 van de 6 sensoren en werkt het wel

ja logisch want een komma is geen functie hier moet dus bijv. OR staan denk ik.

Ik heb de komma zo nog nooit gezien in een IF, maar ik ben ook nog maar een beginner.

Je hebt het nu geprobeerd met maar een paar varianten en gezien dat het dan goed gaat.
Dan kun je dus dat 3 keer herhalen, maar telkens onder de geldende voorwaarde voor een ander sensorpaar.
Als een IF niet waar is, dan kost die handeling verder niets want die word overgeslagen.
Dus als je dit achter elkaar zet in plaats van dat je het in 1 keer probeert af te schieten, zal dat geen hele zware consequenties hebben.
En in ieder geval kom je er dan achter of je probleem inderdaad hierin schuilt (wat ik wel waarschijnlijk acht).

Kun je later, als je zeker weet dat je werkende code hebt, proberen het te optimaliseren.

het is opgelost bedankt !

Groet rob

Beste Rob.

Mooi dat het is opgelost, maar wij hebben nu geen idee hoe het nu is opgelost.
Kun je ons vertellen hoe je het werkend hebt gekregen (liefst alle stappen die je hebt genomen) ?

Daar leren wij ook van, en zeker anderen die eventueel tegen hetzelfde probleem aanlopen.
En dat leren is nou precies de bedoeling hier op het forum.