2014-10-29 2 views
0

Я хочу разработать беспроводную систему датчиков VOC. Я использовал TGS2602, Arduino Nano и XBee Pro S1.My Arduino Nano отправляет неверные значения (датчик)

Это мой код:

int value ; 
const int gasSensor = A0; 

void setup() { 
    Serial.begin(9600); 
} 

void loop() { 
    int value = analogRead (gasSensor); 

    float volt = (value/1023.0)*5.0 ; // Rechne die von ADC ausgegebenen Werten in Volt um 
    float Rs1 = 10*(5-volt)/volt;  // Rechne den Widerstandswert 
    //Serial.print("40B7DEF1");   // Sensorname 
    //Serial.print("\t");    // Tabulator 

    // Kalibrierungsarray der Länge N = 17 
    float Rs [17] = {57.84260516, 2.200081335, 1.606762875, 1.178596714, 0.944910617,  0.865628395, 0.764262648, 0.687566798, 0.626992561, 0.567101091, 0.544815465, 0.496850952, 0.474860336, 0.474860336, 0.442046642, 0.423905489, 0.402219139}; 
    float ppmValue [17] = {0, 5, 10, 15, 20, 24, 28.25, 32.5, 37.75, 43.25, 48.75, 53.25, 57.75, 62.50, 67.50, 75.5, 77.5}; 

    if (Rs1 >= Rs [0]) 
    { 
     float ppm = ppmValue [0]; 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println(ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [0;5] 
    if (Rs[1] < Rs1 && Rs1 < Rs[0]){ 
     float ppm = ppmValue [0] + ((-Rs1 + Rs [0])/(Rs[0] - Rs [1]))*(ppmValue [1] - ppmValue[0]); 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [5;10] 
    else if (Rs[2] < Rs1 && Rs1 < Rs[1]){ 
     float ppm = ppmValue [1] + ((-Rs1 + Rs [1])/(Rs[1] - Rs [2]))*(ppmValue [2] - ppmValue[1]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [10;15] 
    else if (Rs[3] < Rs1 && Rs1 < Rs[2]){ 
     float ppm = ppmValue [2] + ((-Rs1 + Rs [2])/(Rs[2] - Rs [3]))*(ppmValue [3] - ppmValue[2]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [15;24] 
    else if (Rs[4] < Rs1 && Rs1 < Rs[3]){ 
     float ppm = ppmValue [3] + ((-Rs1 + Rs [3])/(Rs[3] - Rs [4]))*(ppmValue [4] - ppmValue[3]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [24;28.25] 
    else if (Rs[5] < Rs1 && Rs1 < Rs[4]){ 
     float ppm = ppmValue [4] + ((-Rs1 + Rs [4])/(Rs[4] - Rs [5]))*(ppmValue [5] - ppmValue[4]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [28.25;32.5] 
    else if (Rs[6] < Rs1 && Rs1 < Rs[5]){ 
     float ppm = ppmValue [5] + ((-Rs1 + Rs [5])/(Rs[5] - Rs [6]))*(ppmValue [6] - ppmValue[5]); 
     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [32.5;37.75] 
    else if (Rs[7] < Rs1 && Rs1 < Rs[6]){ 
     float ppm = ppmValue [6] + ((-Rs1 + Rs [6])/(Rs[6] - Rs [7]))*(ppmValue [7] - ppmValue[6]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [37.75;43.25] 
    else if (Rs[8] < Rs1 && Rs1 < Rs[7]){ 
     float ppm = ppmValue [7] + ((-Rs1 + Rs [7])/(Rs[7] - Rs [8]))*(ppmValue [8] - ppmValue[7]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [43.25;48.75] 
    else if (Rs[9] < Rs1 && Rs1 < Rs[8]){ 
     float ppm = ppmValue [8] + ((-Rs1 + Rs [8])/(Rs[8] - Rs [9]))*(ppmValue [9] - ppmValue[8]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 
    // Interpolation: ppm [48.75;53.25] 
    else if (Rs[10] < Rs1 && Rs1 < Rs[9]){ 
     float ppm = ppmValue [9] + ((-Rs1 + Rs [9])/(Rs[9] - Rs [10]))*(ppmValue [10] - ppmValue[9]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [53.25;57.75] 
    else if (Rs[11] < Rs1 && Rs1 < Rs[10]){ 
     float ppm = ppmValue [10] + ((-Rs1 + Rs [10])/(Rs[10] - Rs [11]))*(ppmValue [11] - ppmValue[10]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [57.75;62.5] 
    else if (Rs[12] < Rs1 && Rs1 < Rs[11]){ 
     float ppm = ppmValue [11] + ((-Rs1 + Rs [11])/(Rs[11] - Rs [12]))*(ppmValue [12] - ppmValue[11]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [62.5;67.5] 
    else if (Rs[13] < Rs1 && Rs1 < Rs[12]){ 
     float ppm = ppmValue [12] + ((-Rs1 + Rs [12])/(Rs[12] - Rs [13]))*(ppmValue [13] - ppmValue[12]); 
     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [67.5;75.5] 
    else if (Rs[14] < Rs1 && Rs1 < Rs[13]){ 
     float ppm = ppmValue [13] + ((-Rs1 + Rs [13])/(Rs[13] - Rs [14]))*(ppmValue [14] - ppmValue[13]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    // Interpolation: ppm [75.5;77.5] 
    else if(Rs[15] < Rs1 && Rs1 < Rs[14]){ 
     float ppm = ppmValue [14] + ((-Rs1 + Rs [14])/(Rs[14] - Rs [15]))*(ppmValue [15] - ppmValue[14]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    else if(Rs[16] < Rs1 && Rs1 < Rs[15]){ 
     float ppm = ppmValue [15] + ((-Rs1 + Rs [15])/(Rs[15] - Rs [16]))*(ppmValue [16] - ppmValue[15]); 

     //PPM Ausgabe 
     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000);} 

    else if (Rs1 >= Rs [16]) 
    { 
     float ppm = ppmValue [16]; 

     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    else if (Rs1 < Rs [16]) 
    { 
     float ppm = 80; 

     //Serial.print ("ppm: "); 
     Serial.print("1");   // Sensorname 
     Serial.print("\t");   // Tabulator 

     Serial.println (ppm); 
     delay(30000); 
    } 

    delay(3000); 
} 

Я не знаю, что я делаю неправильно, но ценности, я получаю все неправильно. Кажется, что эти значения не из аналоговой. Как я могу исправить эту проблему?

+0

Что вы подразумеваете под «все неправильно»? Что вы получаете? Кстати в вашем коде вы не отправляете значение, но вы просто отправляете '1 0' всякий раз, когда значение выше 57.84 ... – frarugi87

+1

Это много повторяющийся код, который отличается только индексом в массиве« Rs ». Это может быть намного короче, делая это в цикле «для». –

+0

Привет, frarugi87, большое спасибо за ваш вопрос. Я получаю 3,3 ppm, 3,4 ppm .... эти значения определенно не от моего датчика. – user3559628

ответ

1

В вашем коде есть все ваши> и < назад. Следовательно, работает только код:

else if (Rs1 < Rs [16]) 

Пока вы на нем, позвольте мне помочь вам немного изменить код. Это действительно написано в длинной форме, и это займет много времени, чтобы отлаживать/редактировать любой код таким образом.

Заменить все ваш КСФ с:

for (int i = 0; i <= 16; i++) { 
    if (Rs1 < Rs [i]) { 
     if (i = 0) { 
      float ppm = ppmValue [i]; 
     } 
     else{ 
      float ppm = ppmValue [i-1] + ((-Rs1 + Rs [i-1])/(Rs[i-1] - Rs [i]))*(ppmValue [i] - ppmValue[i-1]); 
     } 
     //Serial.print ("ppm: "); 
     Serial.print("1"); 
     // Sensorname 
     Serial.print("\t"); 
     // Tabulator 
     Serial.println (ppm); 
     delay(30000); 
     break; 
    } 
    else if (Rs1 > Rs [16]) { 

     float ppm = 80; 
     //Serial.print ("ppm: "); 
     Serial.print("1"); 
     // Sensorname 
     Serial.print("\t"); 
     // Tabulator 
     Serial.println (ppm); 
     delay(30000); 
    } 
} 

Надеется, что это помогает!

+2

Если вы много раз набираете код, копируя/вставляя и редактируя только одну его часть, вам, вероятно, лучше использовать массивы и для. У вас уже были массивы, поэтому вы были на полпути. Счастливое кодирование! – djUniversal

+0

Hi djUniversal, thansk для ваших ответов. Но этот код не работает, потому что я делаю интерполяцию для вычисления значения ppm. – user3559628

+0

Извините, просто понял, что вы изменили формулу там (не видели ширину кода на моем телефоне). Я изменил свой код для соответствия. Должен работать сейчас. Вы пытались просто изменить знаки вокруг? Это работало? – djUniversal

Смежные вопросы