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.