Проблемы Arduino с fsr и LCD

Я делаю проект, который требует использования Arduino Uno, 4 датчиков силы и ЖК-дисплея 16x2. Пытаюсь вывести показания датчиков силы на ЖКИ с реализацией кнопок. Например. если я нажму кнопку вверх, он должен отобразить первое показание датчика силы. Проблема в том, что он просто отображает огромное число 143164976.0000, даже если к нему не применяется сила. Пожалуйста, посоветуйте, есть ли проблема с моим кодированием.

    int iForceSensorReading;     // the analog reading from the FSR resistor divider
    int iForceSensorReading1;
    int iForceSensorReading2;
    int iForceSensorReading3;
    int iForceSensorVoltage;     // the analog reading converted to voltage
    int iForceSensorVoltage1;
    int iForceSensorVoltage2;
    int iForceSensorVoltage3;
    unsigned long ulForceSensorResistance;// The voltage converted to resistance, can be                 very big so make "long"
    unsigned long ulForceSensorResistance1;
    unsigned long ulForceSensorResistance2;
    unsigned long ulForceSensorResistance3;
    unsigned long ulForceSensorConductance;
    unsigned long ulForceSensorConductance1;
    unsigned long ulForceSensorConductance2;
    unsigned long ulForceSensorConductance3;
    float FsrForce = 0;       // Finally, the resistance converted to force
    float FsrForce1 = 0;
    float FsrForce2 = 0;
    float FsrForce3 = 0; 
    #include <Wire.h>
    #include <Adafruit_MCP23017.h>
    #include <Adafruit_RGBLCDShield.h>
    Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
    #define RED 0x1
    #define YELLOW 0x3
    #define GREEN 0x2
    #define TEAL 0x6
    #define BLUE 0x4
    #define VIOLET 0x5
    #define WHITE 0x7
    void setup(void){
      Serial.begin(9600);   // send debugging information via the Serial monitor
      lcd.begin(16, 2);
      lcd.print("Hand Muscle");
      lcd.setCursor(0,1);
      lcd.print("Meter");
      lcd.setBacklight(WHITE);
    }
    uint8_t i=0;
    void loop(void){
    uint8_t buttons = lcd.readButtons();
    iForceSensorReading = analogRead(A0);//read index finger pressure
    delay(30);
    // analog voltage reading ranges from about 0 to 1023 which maps to 0V to 5V (=                 5000mV)
    iForceSensorVoltage = map(iForceSensorReading, 0, 1023, 0, 5000);
    ulForceSensorConductance = conductanceFunction(ulForceSensorResistance,                 iForceSensorVoltage);
    if (ulForceSensorConductance <= 1000){
        FsrForce = ulForceSensorConductance / 80;    
        } 
    else{
        FsrForce = ulForceSensorConductance - 1000;
        FsrForce /= 30;
       }
    iForceSensorReading1 = analogRead(A1);//read middle finger pressure
    delay(30);
    iForceSensorVoltage1 = map(iForceSensorReading1, 0, 1023, 0, 5000);
    if (iForceSensorVoltage1 == 0){
      } 
    else{
    ulForceSensorConductance1 = conductanceFunction(ulForceSensorResistance1,         iForceSensorVoltage1);
    delay(30);
      }
    if (ulForceSensorConductance1 <= 1000){
        FsrForce1 = ulForceSensorConductance1 / 80;
        } 
    else{
    FsrForce1 = ulForceSensorConductance1 - 1000;
    FsrForce1 /= 30;  
        }
    iForceSensorReading2 = analogRead(A2);// read ring finger pressure
    delay(30);
    iForceSensorVoltage2 = map(iForceSensorReading2, 0, 1023, 0, 5000);
    ulForceSensorConductance2 = conductanceFunction(ulForceSensorResistance2,         iForceSensorVoltage2);
    if (ulForceSensorConductance2 <= 1000){
    FsrForce2 = ulForceSensorConductance2 / 80;
      }
    else{
    FsrForce2 = ulForceSensorConductance2 - 1000;
    FsrForce2 /= 30;   
      }
    iForceSensorReading3 = analogRead(A3);//read little finger pressure
    delay(30);
    iForceSensorVoltage3 = map(iForceSensorReading3, 0, 1023, 0, 5000);
    ulForceSensorConductance3 = conductanceFunction(ulForceSensorResistance3,         iForceSensorVoltage3);
    if (ulForceSensorConductance3 <= 1000) 
    {FsrForce3 = ulForceSensorConductance3 / 80;    
    }else 
    {FsrForce3 = ulForceSensorConductance3 - 1000;
     FsrForce3 /= 30;   
     }
    if (buttons) {
        lcd.clear();
        lcd.setCursor(0,0);
        if (buttons & BUTTON_UP) {
        lcd.print("Index Finger: ");
        lcd.setCursor(0,1);
        lcd.print(FsrForce,DEC);
        lcd.setBacklight(WHITE);
        }
        if (buttons & BUTTON_DOWN) {
        lcd.print("Little Finger: ");
        lcd.setCursor(0,1);
        lcd.print(FsrForce3,DEC); 
        lcd.setBacklight(WHITE);
        }
        if (buttons & BUTTON_LEFT) {
        lcd.print("Middle Finger: ");
        lcd.setCursor(0,1);
        lcd.print(FsrForce1,DEC); 
        lcd.setBacklight(WHITE);
        }
        if (buttons & BUTTON_RIGHT) {
        lcd.print("Ring Finger: ");
        lcd.setCursor(0,1);
        lcd.print(FsrForce2,DEC);  
        lcd.setBacklight(WHITE);
        }
        if (buttons & BUTTON_SELECT) {
        lcd.print("SELECT ");
        lcd.setBacklight(WHITE);
        }
      }
    }
    // The voltage = Vcc * R / (R + FSR) where R = 10K and Vcc = 5V
    // so FSR = ((Vcc - V) * R) / V  
    int conductanceFunction(long x, long y)
    {long result;
     x = 5000 - y; // fsrVoltage is in millivolts so 5V = 5000mV
     x *= 10000; // 10K resistor
     x /= y;
     result = 1000000/x; //ulForceSensorConductance2 = 1000000 measured in micromhos
     return result;
    }

person DaneXJJ    schedule 17.01.2014    source источник


Ответы (1)


первая вероятная проблема, этот симптом звучит как подписанный и неподписанный конфликт. Я вижу в вашем коде следующие вызовы

ulForceSensorConductance = conductanceFunction(ulForceSensorResistance,                 iForceSensorVoltage);

куда

int conductanceFunction(long x, long y)

но

int iForceSensorVoltage;

Вы передаете int (signed) во второй аргумент. Использование его в математике и создание результирующей переменной

long result;

и возвращая это как INT.

Где у вас могут быть другие проблемы. Вы должны следовать некоторым основным диагностическим процедурам. Предположим, что эта проблема на ВСЕХ каналах. если нет, то скорее всего электрическая. Фокусировка на одном канале.

ОТПЕЧАТАЙТЕ различные переменные, чтобы увидеть, что движется так, как ожидалось, и проверить, что математические расчеты соответствуют ожиданиям.

person mpflaga    schedule 17.01.2014