首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino fsr和LCD问题

Arduino fsr和LCD问题
EN

Stack Overflow用户
提问于 2014-01-17 21:18:41
回答 1查看 375关注 0票数 0

我正在做一个项目,这需要使用arduino uno,4个力传感器和一个16x2的LCD。我正在尝试通过按钮的实现将力传感器的读数显示在LCD上。例如。如果我按下向上按钮,它应该显示第一个力传感器读数。问题是,即使没有力施加在它上面,它也只能显示一个巨大的数字143164976.0000。请建议是否有一个问题,我的编码。

代码语言:javascript
复制
    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;
    }
EN

回答 1

Stack Overflow用户

发布于 2014-01-17 23:00:40

第一个可能的问题是,这种症状听起来像是签名与未签名的冲突。我在您的代码中看到了以下调用

代码语言:javascript
复制
ulForceSensorConductance = conductanceFunction(ulForceSensorResistance,                 iForceSensorVoltage);

哪里

代码语言:javascript
复制
int conductanceFunction(long x, long y)

代码语言:javascript
复制
int iForceSensorVoltage;

您正在将一个int(带符号)传递给第二个参数。在数学上使用它,并创建

代码语言:javascript
复制
long result;

并将其作为INT返回。

你可能会有其他的问题。您应该遵循一些基本的诊断程序。假设这个问题在所有渠道上都存在。如果不是,那么它很可能是电气的。专注于一个频道。

输入各种变量的打印,以查看预期的移动情况,并验证数学是否如预期的那样

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21187046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档