Övervaka belastning Feedback-ett ställdon (3 / 5 steg)
Steg 3: Avancerad kodning
Nu när du sett koden, går vi över enskilda avsnitt ge djupare förklaringar.
Först ska vi titta på ett avsnitt av koden i funktionen latchButtons(). Vi kommer att titta på knappen debouncing. När den vänstra knappen trycks, måste tiden efter senaste knapptryckning beräknas. Detta görs genom att använda det senaste värdet som lagrats och anropar funktionen millis() om du vill kontrollera den aktuella tiden. När vi vet att tiden är större då vår debounce tid, kontrollerar funktionen sedan om manöverdonet tillåts att förlänga. Om båda dessa villkor är uppfyllda, kan funktionen fortsätta och göra alla saker relaterade till tryck på knapp.
om (digitalRead (buttonLeft) == låg) //left är framåt
{
currentTimedebounce = millis() - lastButtonpress; / / kolla tid sedan senaste press
om (currentTimedebounce > debounceTime & & dontExtend == false) //once du har utlöst dontExtend, ignorera alla framlänges pressar
{
leftlatch =! leftlatch; / / om motorn är rörliga, stop, om stannade, börja flytta
firstRun = sant; / / ange firstRun flagga att ignorera nuvarande spike
fullyRetracted = false; När du flyttar framåt, är du inte helt indragen
lastButtonpress = millis (); //store tidpunkten för senaste knapptryckning
hemkomst.
} //end om
} //end btnLEFT
Denna nästa avsnitt är while loop inom funktionen motorForward(). Delen att titta på här är de två förseningarna. Loopen startar genom att aktivera den motor controller, och starta motorn. Om det är den första kör dock loopen, finns det en större fördröjning. Denna större försening är att ignorera den nuvarande spike som kommer med start i en motor. När du anger denna försening, vara försiktig och inte sätta den för stor, eftersom det inte finns någon kontroll under det. Om motorn har fastnat av någon anledning, kommer det inte att kunna stoppas tills denna försening är över. Om det inte är den första körningen, finns det en mycket mindre fördröjning.
När motorn är i rörelse, användas getFeedback() för att kontrollera aktuella sensor. firstRun stängs av, så att nästa gång genom öglan den tar små förseningen, snarare än den stora en. Och slutligen, knapparna kontrolleras för att se vilka nya åtgärder bör vidtas.
medan (dontExtend == false & & leftlatch == hög) {
digitalWrite (EnablePin, hög);
analogWrite (PWMPinA, speeed);
analogWrite (PWMPinB, 0); //move motor
om (firstRun == true) delay(firstfeedbacktimedelay);
annat delay(feedbacktimedelay); liten fördröjning att få snabba
getFeedback();
firstRun = false;
latchButtons();
} //end medan
Nästa avsnitt är alla i rutinen getFeedback(). Den rutinmässiga startar genom att läsa den analoga pin ansluten till sensorn, sedan agerar därefter.
Den första som är markerade är om motorn är på det gränser. Koden vet när motorn är på gränsen när den aktuella behandlingen är 0. Ibland finns det en falsk behandling, så vi måste ställa in en räknare, så att motorn bara stannar när det är faktiskt på gränsen. Denna del av koden har att räkna till hitLimitsmax innan motorn kommer att sluta. Om det räknas mindre så att disken återställs.
om (CRaw == 0 & & hitLimits < hitLimitsmax) hitLimits = hitLimits + 1.
annat hitLimits = 0; Kontrollera om motorn är på gränsen och aktuellt har slutat
Denna nästa del är precis efter träff gränserna. Om motorn går framåt när det nått gränsen, stängs rightlatch. Om det rörde sig bakåt, stängs leftlatch. Koden är densamma för leftlatch.
om (hitLimits == hitLimitsmax & & rightlatch == hög) {
rightlatch = låg;
hitLimits = 0;
} //end om
Slutligen, den nuvarande gränsen kontrolleras mot det maximala. Om det är över, leftlatch är avstängd, och motorn är inte längre tillåtet att förlänga. Om du vill aktivera förlängning, måste motorn återföras.
om (CRaw > maxAmps) {
dontExtend = sant;
leftlatch = låg; stoppa om feedback är över maximum
} //end om
Nu när vi har gått över koden, kan vi anpassa den efter dina behov.