Büyük aritmetik doğru şekilde nasıl işlenir

sadece basit bir cevap gerektiren bir soru. Arduino'da çok sayıda aritmetik adımı verimli ve hassas bir şekilde nasıl işlerim?

Örneğin, bu kod işlevi kurulumuna sahibim:

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;

}

Şimdi tüm bu değişkenler için veri tiplerini doğru şekilde kurdum ve float, int ve long'un bir kombinasyonu. Veri tipi ile ilgili bir sorun olduğunu düşünmüyorum. Son yanıtı seride yazdırdığımda aldığım şey, kullanıcının girdiği girdiden bağımsız olarak aynı sayıdır.

Sanırım kodu, her satırı adım adım gerçekleştirecek ve bir sonraki aritmetik çizgiye geçmeden önce cevabı doğrulayacak şekilde biçimlendirmem gerekiyor. Öyleyse, her aritmetik adım için bir işleve ihtiyacım olacak mı? Ya da bunu eksik olduğumu işlemek için daha basit bir yol var.

Herhangi bir rehberlik takdir edilmektedir. Teşekkürler.

İşte bütünüyle kod:

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;
  }
 }
}

Dolayısıyla, kullanıcı girdisine bağlı olarak, hesaplamalar nihai çıktı cevabını değiştirecektir. Örneğin, bir 5 girilmesi gerekiyorsa, excel'deki hesaplamalara dayanarak çıktı -4.22 olmalıdır.

0
Lütfen beyanları, gerçek sonucu ve beklenen sonucu gösteriniz. Serial.println (cevap); Sorunu izole etmenize yardımcı olmak için kod hata ayıklama.
katma yazar Dave X, kaynak
Ve ne yazıyor? Bir "input = 5;" koyardım calc() 'den önceki kodda ve beklenmedik bir şey elde edinceye kadar calc ()' da difft hata ayıklama işlemini deneyin.
katma yazar Dave X, kaynak
Yine, num1'i iki kez silmek mi istiyorsunuz yoksa işlemden sonra num2'yi silmek istediniz mi?
katma yazar Dave X, kaynak
Yararlı bulduklarım, bir elektronik tablo veya küçük bir konsol uygulamasında karmaşık algoritmaları test etmektir (çok karmaşık olmayanlar bile). Onları çalıştırdıktan sonra, oldukça basit olan Arduino koduna dönüyorum. Bu, hatasız kodların garantisi değildir, ancak oldukça yakındır.
katma yazar Nayt Grochowski, kaynak
@DaveX girişine bakılmaksızın -113,70 basıyor
katma yazar TestOChangeO, kaynak

2 cevap

Her seferinde aynı değeri alıyorsunuz çünkü hesaplanan değer budur.

Formülünüzü nasıl uyguladığın konusunda yanlış bir şeyiniz olduğunu düşünüyorum. "Cevap =" dan başlar ve değişkenleri tekrar tekrar formüllerle veya bu değişkenleri oluşturan değerlerle değiştirirseniz, bununla sonlanırsınız:

cevap = (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

Bununla ilgili hiçbir şey değişmez.

Girdi değeriniz batterymoment değerini hesaplamak için kullanılıyor. totalmoment değerini hesaplamak için batterymoment kullanıyoruz. wheelmoment değerini hesaplamak için totalmoment kullanılıyor. cgwheels değerini hesaplamak için wheelmoment kullanılıyor. cgwheels hiç bir şey için kullanılmaz .

3
katma

Yorumlarınıza göre calc() işlevi beklendiği gibi davranmıyor.

Calc() değerini değiştirmek için:

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);  
 }

Beklenen girdileri aldığını ve beklendiği gibi çalışıp çalışmadığını kontrol edin. Ardından, yanlış eşleşmeyi keşfedinceye kadar süreç içinde hata ayıklama ifadeleri ekleyin.

Daha fazla fonksiyona veya daha iyi tanımlanmış fonksiyonlara dönüşür ve bunları ayrı ayrı test ederim.

Kodunuz olduğu gibi, global değişkenler, seri ayrıştırma ve hesaplamalar arasında etkileşim vardır. Farklı parçalara ayırırsanız, sorunun nerede olduğunu ayırabilirsiniz.

0
katma