Hoe grote rekensommen op de juiste manier te verwerken

alleen een vraag die een eenvoudig antwoord vereist. Hoe verwerk ik een groot aantal rekenkundige stappen in Arduino efficiënt en precies?

Ik heb bijvoorbeeld deze codefunctiesetup:

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;

}

Nu heb ik de juiste datatypen voor al deze variabelen ingesteld en ze zijn een combinatie van float, int en long. Ik denk niet dat het een probleem is met het gegevenstype. Wat ik krijg als ik het laatste antwoord in het tijdschrift afdruk, is hetzelfde nummer, ongeacht de invoer die de gebruiker invoert.

Ik vermoed dat ik de code zodanig moet formatteren dat hij elke regel stap voor stap uitvoert en het antwoord verifieert voordat hij doorgaat naar de volgende rekenlijn. Zo ja, dan heb ik voor elke rekenkundige stap een functie nodig? Of is er een eenvoudiger manier om dit te verwerken dat ik mis.

Elke begeleiding wordt op prijs gesteld. Bedankt.

Hier is de code in zijn geheel:

unsigned long batterymoment,num1,num2,input,totalmoment;
double buoyancymoment,wheelmoment,cgwheels,mainmass,nosemass,maindistance,nosedistance;
double mainmoment,nosemoment,netmoment,netcg,staticmargin,answer;
double centrebuoyancy = 14.164;
double mainarm = 14.3;
double adc = 11.4;
double meanadc = 22.65;
double nosearm = 1.8;
int totalmass = 12404;
int batterymass = 720;
int buoyancymass = 4401;
int batteryposition,wheelweight;
boolean mySwitch = false;

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;  
 }

void setup() {
  Serial.begin(9600);
  num1=0;
  num2=0;
  Serial.println("Enter battery position");
 }

void loop() {
  while (Serial.available()){
    batteryposition = Serial.read();
    if(batteryposition>47 && batteryposition<58){  
      if(!mySwitch){
         num1=(num1*10)+(batteryposition-48);
      }else{
         num2=(num2*10)+(batteryposition-48);
        }
       }

if(batteryposition==61){
  input=num1+num2;
  calc();
  Serial.print("Static margin is: ");
  Serial.println(answer);
  num1=0;
  num1=0;
  mySwitch=false;
  }
 }
}

Dus afhankelijk van de gebruikersinvoer, zullen de berekeningen het uiteindelijke uitvoerantwoord veranderen. Als er bijvoorbeeld een 5 moet worden ingevoerd, moet de uitvoer -4.22 zijn op basis van mijn berekeningen in Excel.

0
Toon alstublieft de verklaringen, het werkelijke resultaat en het verwachte resultaat. En zet wat extra Serial.print ("antwoord:"); Serial.println (antwoord); debugging code in om u te helpen het probleem te isoleren.
toegevoegd de auteur Dave X, de bron
En wat drukt het uit? Ik zou een "input = 5;" in de code vóór calc (), en probeer dan foutopsporing in calc() te ontrafelen tot je iets onverwachts krijgt.
toegevoegd de auteur Dave X, de bron
Nogmaals, wilt u num1 tweemaal wissen of was u van plan om num2 te wissen na de verwerking.
toegevoegd de auteur Dave X, de bron
Wat ik nuttig heb gevonden, is het testen van complexe algoritmen in een spreadsheet of kleine console-applicatie (zelfs niet zo complexe). Als ik ze eenmaal aan het werk heb, converteer ik naar Arduino-code, wat vrij eenvoudig is. Dit is geen garantie voor bug-vrije code, maar het is redelijk dichtbij.
toegevoegd de auteur Nayt Grochowski, de bron
het drukt -113.70 af ongeacht de invoer @DaveX
toegevoegd de auteur TestOChangeO, de bron

2 antwoord

Je krijgt elke keer dezelfde waarde omdat dat de waarde is die wordt berekend.

Ik denk dat je iets mis hebt met hoe je je formule hebt geïmplementeerd. Als u begint met "answer =" en de variabelen herhaaldelijk vervangt door de formules of waarden waaruit deze variabelen bestaan, krijgt u dit:

answer = (11.4 - (((4401 * 14.164) + (((((12404 - 4401) * (1 - ((14.3 - (12404 - 4401))/((14.3 - (12404 - 4401)) + (12404 - 4401 - 1,8)))))/2) * 14,3) + (((((12404 - 4401) * (1 - ((12404 - 4401 - 1,8)/((12404 - 4401 - 1,8) + (14,3 - (12404 - 4401))))))/2) * 1.8))/12404))/22.65

Daar is helemaal niets variabel aan.

Uw invoerwaarde wordt gebruikt om batterymoment te berekenen. batterymoment waarmee we totalmoment berekenen. totalmoment wordt gebruikt om wheelmoment te berekenen. wheelmoment wordt gebruikt om cgwheels te berekenen. cgwheels wordt nooit voor iets gebruikt .

3
toegevoegd

Volgens uw opmerkingen werkt de calc() -functie niet zoals verwacht.

Verander calc() als:

void calc() {
  Serial.print("input:");Serial.println(input);
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;
  Serial.print("answer:");Serial.println(answer);  
 }

en kijk of het de verwachte invoer krijgt en werkt zoals verwacht. Voeg vervolgens foutopsporingsinstructies toe totdat u de mismatch ontdekt.

Ik zou meer van een functie of een reeks beter gedefinieerde functies veranderen en ze dan afzonderlijk testen.

Omdat uw code er is, is er interactie tussen globale variabelen, seriële parsing en berekeningen. Als je het opsplitst in verschillende stukken, kun je isoleren waar het probleem zit.

0
toegevoegd