Seriële miscommunicatie, wat doe ik verkeerd?

Arduino specifieke Software
Berichten: 6
Geregistreerd: 26 Apr 2021, 22:31

Seriële miscommunicatie, wat doe ik verkeerd?

Berichtdoor jawih » 09 Aug 2021, 22:31

Ik heb een problem met de seriële communicatie van mijn project.
Het is een meetopstelling waarmee 2 loadcellen worden uitgelezen met en zonder belasting.
De meetopstelling staat achter een raam en wanneer het zonnetje schijnt wordt e.e.a. nogal warm waardoor er fouten ontstaan.

De belasting bestaat uit twee gewichten die met een motortje telkens enige tijd geligt worden zodat zowel het verloop van de nul-aanwijzing als van de aanwijzing onder belasting kan worden geregistreerd.

Het geheel heeft al een aantal dagen goed gefunktioneerd maar sinds vandaag niet meer.
Bij het opstarten wordt de setup uitgevoerd, daarna moet een startknop bedient worden zodat de metingen kunnen worden uitgevoerd.
Na n metingen gaat de motor naar de volgende positie en worden er weer n metingen uitgevoerd.
De metingen worden naar de seriele monitor gestuurd en dan in een bestand opgeslagen.

Sinds vandaag treedt er een storing op.
De setup wordt goed uitgevoerd.
Als daarna de startknop wordt bedient gaat het soms meteen fout en soms begint het geheel te werken waarna het na korte tijd toch weer fout gaat (Putty: error reading serial device). De Uno blijft echter wel data uitzenden maar de ontvanger (Putty of de eigen serial monitor) kunnen dat niet meer ontvangen.

Ik ben geen held in het schrijven van programma’s dus ik zal wel iets niet geod doen maar wat?

Dit is de listing:

// sturing-hefmotor
const int startmeten = 9; // start-stop knop meten
boolean meting = false;
const int ledPin = 13; // status pin led
const int naarhoog = 8; // drukknop omhoog
const int naarlaag = 10; // drukknop omlaag
int omhoog = 4;//motor naar eindstand hoog
int ishoog = 5;// eindschakelaar hoog
int omlaag = 6;//motor naar eindstand laag
int islaag = 7;// eindschakelaar laag
int n=0; //aantal meetsamples





void setup() {
// put your setup code here, to run once:
Serial.begin(19200);
delay(2000); // wacht 0,1 sec, dan is e.e.a. stabiel
Serial.println("sturing-hefmotor");

pinMode(startmeten, INPUT_PULLUP);
pinMode(naarhoog, INPUT_PULLUP);
pinMode(naarlaag, INPUT_PULLUP);
pinMode(omhoog, OUTPUT);
digitalWrite(omhoog,LOW);
pinMode(omlaag, OUTPUT);
digitalWrite(omlaag,LOW);
pinMode(ishoog, INPUT_PULLUP); //in de eindstand is het signaal laag
pinMode(islaag, INPUT_PULLUP); //in de eindstand is het signaal laag
// het volgende stuk is bedoeld om altijd naar eenzelfde beginstand te gaan: hef is hoog.
while (digitalRead(ishoog)==HIGH){digitalWrite(omhoog, HIGH);}
delay(2000); // wacht 4 sec, dan is de motor in beginstand
digitalWrite(omhoog, LOW);

}

void loop() {

if (digitalRead(naarlaag)==LOW) {
modo();
}
else if (digitalRead(naarhoog)==LOW) {
mohi();
}

if (digitalRead(startmeten)==LOW){ // als de knop ingedrukt is
while(digitalRead(startmeten)==LOW){ } // wacht zolang de knop ingedrukt is
delay(100); // contactdender knop loslaten elimineren
if (meting==false){ // als de boolean 'aan' niet waar is...
meting=true; // start meten:
digitalWrite(ledPin,HIGH); // ledje aan
} // afsluiten if lus
else if ( meting==true){ // als de boolean 'aan' wel waar is...
meting=false; // wordt hij weer omgeschakeld naar uit
digitalWrite(ledPin,LOW); // ledje uit
} // afsluiten else lus
} // afsluiten if lus
//return; // abrupt einde

if ((meting==true) && (n!=0)){
meten(); // voer de meetfunctie uit
Serial.println("meten");
}

else if ((meting==true) && (n==0)&&(digitalRead(islaag)==LOW)){
delay(200); // wacht 0.2 sec
mohi();
}
else if ((meting==true) && (n==0)&&(digitalRead(ishoog)==LOW)){
modo();
}


// meten();
}

// begin call's / subroutines;

void modo(){
Serial.println("hefmotor naar beneden");
while (digitalRead(islaag)!=LOW){
digitalWrite(omhoog,LOW);
delay(100); // wacht 0.1 sec
digitalWrite(omlaag,HIGH);
}
delay(100); // wacht 0.1 sec
n=20;
Serial.println("is laag");
Serial.print("n=");
Serial.println(n);

}

void mohi(){
Serial.println("hefmotor naar boven");
while (digitalRead(ishoog)!=LOW){
digitalWrite(omlaag,LOW);
delay(100); // wacht 0.1 sec
digitalWrite(omhoog,HIGH);
}
delay(100); // wacht 0.1 sec
n=10;
Serial.println("is hoog");
Serial.print("n=");
Serial.println(n);
}

void meten() {

while (n !=0) {
Serial.print("n= ");
Serial.println(n);
delay(200); // wacht 0.1 sec
n--;

}

}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Seriële miscommunicatie, wat doe ik verkeerd?

Berichtdoor shooter » 10 Aug 2021, 17:30

je programma lijkt me prima hoor,alleen de n komt zowel in op als neer voor is dit juist en wat is n eigenlijk.
je doet ook een digitalread == LOW dat is prima maar je mag ook direct if if digitalread (startmeten) gebruiken want als deze LOW is dan is het false.
er staat ook ergens if meting== false je mag ook schrijven if (!meting)
je doet ook ergens !=0 dat kun je beter vervangen door <=0 want 0 hoeft niet 0 te zijn er kan een restje overblijven.
De arduino is niet fout want als die zend gewoon, maar er is wel een USB timing die aangeeft als er een programma geladen wordt. Telkens als je de PC opstart dan wordt de arduino gereset.
Ook het heel veel zenden kan fout gaan, maar je hebt voldoende tijd overal lijkt mij.
Kijk eerst maar eens naar putty en gebruik het ledje(13) als knipper als er een bericht verzonden wordt.
windows is wat betreft USB leuk maar gaat wel vaak scannen en dan ben je de poort ineens kwijt.

doe ook eens cntrl T voor een beter overzicht.
Verder heb je alles prima voor elkaar.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Seo-Ul-Gag en 27 gasten