查看: 319|回復: 13
打印 上一主題 下一主題

[未解決] 新手求助,github上一個arduino開源CG重心稱的問題

[復制鏈接]
  • TA的每日心情
    開心
    2020-2-18 13:38
  • 簽到天數: 1 天

    [LV.1]初來乍到

    跳轉到指定樓層
    樓主
    發表于 2020-2-18 11:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
    5金幣
    本帖最后由 最強的青蛙 于 2020-2-18 13:37 編輯

    在github找到一個開源CG重心稱的代碼,并按文檔說明搭建了硬件環境。發現程序在串口監視器里跑起來了,但是LCD屏幕并沒有亮。
    特來請教
    1、arduino ide里看到串口監視器里跑起來了


    2、但是i2c 的1602lcd并沒有顯示,在代碼里沒有看到i2c lcd的 SDA SCL指定Arduino板子上的接口。我自做主張把SDA接了A4,SCL接了A5 。(
    LCD屏是OK的,跑過LCD例子,屏正常顯示。,掃描屏的地址0x27,看代碼注釋里面提到I2C 1602lcd 是44780的,我用的I2C 1602 LCD  是85741)

    3、查看代碼判斷邏輯我還有點懵
    output == 0   //if output to serial terminal   大概的意思就是==0的情況下從串口輸出
    output != 0    //如果
    != 0的情況下 從i2c LCD輸出


        Serial.println("You have I2CDISP defined, but output is not 2. Are you sure thats right?");
    ---------------------------------------
    從串口監視器來看,就沒出現過
    output != 0的情況。。

    我把開源代碼全部貼上來,請大神們幫我看下問題出在哪里呢?。。夢想菜鳥先謝過各位大神了



    kittenblock中小學創客名師推薦的圖形化編程軟件

    /*
       CG scale for F3F & F3B models
       Olav Kallhovd 2016-2017
    
       CG Scale main components:
       1 pc load sensor front YZC-133 2kg
       1 pc load sensor rear YZC-133 3kg
       2 pc HX711 ADC, one for each load sensor (128bit resolution)
       1 pc Arduino Pro for the scale
       1 pc Arduino Pro for the Serial display
       1 pc 16*2 HD44780 LCD for the Serial display
       3D printed parts
    
       Max model weight with sensors above: 4 to 4,5kg depending on CG location
    
    */
    
    #include <HX711_ADC.h> //https://github.com/olkal/HX711_ADC can be installed from the library manager
    //Number of samples and some filtering settings can be adjusted in the HX711_ADC.h library file
    //The best RATE setting is usually 10SPS, see HX711 data sheet (HX711 pin 15, can usually be set by a solder jumper on the HX711 module)
    //RATE 80SPS will also work fine, but conversions will be more noisy, so consider increasing number of samples in HX711_ADC.h
    
    //HX711 constructor (dout pin, sck pint):
    HX711_ADC LoadCell_1(A2, A3); //HX711 pins front sensor (DOUT, PD_SCK)
    HX711_ADC LoadCell_2(A0, A1); //HX711 pins rear sensor (DOUT, PD_SCK)
    
    
    // I2C-Display, if available
    // Enable I2C-Display?
    // #define I2CDISP
    #ifdef I2CDISP
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x3F or 0x27 for a 16 chars and 2 line display
    #endif
    
    byte ledPin = 3;
    byte batRefPin = A4;
    char toLCD[20];
    byte output;
    boolean ledState;
    long t1;
    long t2;
    
    const int printInterval = 500; // LCD/Serial refresh interval
    
    //*** configuration:
    //*** set dimensional calibration values:
    const long WingPegDist = 1198; //calibration value in 1/10mm, projected distance between wing support points, measure with calliper
    const long LEstopperDist = 300; //calibration value 1/10mm, projected distance from front wing support point to leading edge (stopper pin), measure with calliper
    //*** set scale calibration values (best to have the battery connected when doing calibration):
    const float ldcell_1_calfactor = 954.0; // user set calibration factor load cell front (float)
    const float ldcell_2_calfactor = 799.0; // user set calibration factor load cell rear (float)
    //***
    const long stabilisingtime = 3000; // tare precision can be improved by adding a few seconds of stabilising time
    //***
    const long CGoffset = ((WingPegDist / 2) + LEstopperDist) * 10;
    
    void setup() {
      //***
      // 0: Serial-Console (Your PC); 
      // 1: Serial-LCD (2nd Arduino with SimpleSerialDisplay)
      // 2: I2C-LCD (define I2CDISP above!)
      output = 0;
      //***
      
      Serial.begin(9600);
      Serial.write(254);
      Serial.write(128);
      Serial.print("F3X COG scale   ;");
      Serial.write(254);
      Serial.write(192);
      Serial.print("Bat:");
      int batval = readBattVoltage();
      Serial.write((char)(batval / 1000) + 48);
      Serial.print(".");
      Serial.write((char)((batval % 1000) / 100) + 48);
      Serial.write((char)((batval % 100) / 10) + 48);
      Serial.print("V     ");
      if (output == 0) { //if output to serial terminal
        Serial.println();
        Serial.println("Wait for stabilising and tare...");
      }
    #ifdef I2CDISP
      if (output != 0)
        Serial.println("You have I2CDISP defined, but output is not 2. Are you sure thats right?");
    
      Serial.println("Initializing I2C-Display");
      lcd.init();
      lcd.backlight();
      lcd.setCursor(0, 0);
      lcd.print("F3X COG scale,");
      lcd.setCursor(0, 1);
      lcd.print("at your service!");
    #endif
    
    
      LoadCell_1.begin();
      LoadCell_2.begin();
      byte loadcell_1_rdy = 0;
      byte loadcell_2_rdy = 0;
      while ((loadcell_1_rdy + loadcell_2_rdy) < 2) { //run startup, stabilisation and tare, both modules simultaneously
        if (!loadcell_1_rdy) loadcell_1_rdy = LoadCell_1.startMultiple(stabilisingtime);
        if (!loadcell_2_rdy) loadcell_2_rdy = LoadCell_2.startMultiple(stabilisingtime);
      }
      LoadCell_1.setCalFactor(ldcell_1_calfactor); // set calibration factor
      LoadCell_2.setCalFactor(ldcell_2_calfactor); // set calibration factor
    
      pinMode(ledPin, OUTPUT); //led
      digitalWrite(ledPin, HIGH);
    
      if (output == 1) { //if output to LCD
        Serial.write(254);
        Serial.write(127); // clear lcd
      }
    }
    
    int readBattVoltage() { // read battery voltage
      long battvalue = 0;
      battvalue += analogRead(batRefPin);
      battvalue += analogRead(batRefPin);
      battvalue *= 4883L; // analog reading * (5.00V*1000000)/1024 (adjust value if VCC is not 5.0V)
      battvalue /= 640L; // this number comes from the resistor divider value ((R2/(R1+R2))*1000)/noof analogreadings (adjust value if required)
      //Serial.println(battvalue);
      if (battvalue < 7500) { //
        //low bat warning code goes here, not implemented
      }
      return battvalue;
    }
    
    void flashLED() {
      if (t2 < millis()) {
        if (ledState) {
          t2 = millis() + 2000;
          ledState = 0;
        }
        else {
          t2 = millis() + 100;
          ledState = 1;
        }
        digitalWrite(ledPin, ledState);
      }
    }
    
    void loop() {
      //library function update() should be called at least as often as HX711 sample rate; >[email protected], >[email protected]
      //longer delay in scetch will reduce effective sample rate (be careful with delay() in loop)
      LoadCell_1.update();
      LoadCell_2.update();
    
      // calculate CG and update serial/LCD
      if (t1 < millis()) {
        t1 = millis() + printInterval;
        float a = LoadCell_1.getData();
        float b = LoadCell_2.getData();
        long weightAvr[3];
        float CGratio;
        long CG;
        weightAvr[0] = a * 100;
        weightAvr[1] = b * 100;
        long weightTot = weightAvr[0] + weightAvr[1];
    
        if (weightAvr[0] > 500 && weightAvr[1] > 500) {
          long a = weightAvr[1] / 10;
          long b = weightAvr[0] / 10;
          CGratio = (((a * 10000) / (a + b))); 
          CG = ((((WingPegDist) * CGratio) / 1000) - ((WingPegDist * 10) / 2) + CGoffset);
        }
        else {
          CG = 0;
        }
        // if output = 0: print result to serial terminal:
        if (output == 0) {
          for (byte a = 0; a < 2; a++) {
            Serial.print("weight_LdCell_");
            Serial.print(a + 1);
            Serial.print(": ");
            long i = weightAvr[a];
            if (i < 0) {
              Serial.print('-');
              i = ~weightAvr[a];
            }
            Serial.print(i / 100);
            Serial.print('.');
            if ((i % 100) < 10) {
              Serial.print("0");
            }
            Serial.print(i % 100);
            Serial.print("      ");
          }
          Serial.print("CG:");
          Serial.print(CG / 100);
          Serial.print('.');
          Serial.println(CG % 100);
        } else if (output == 1) { //if output = 1: print to serial LCD
          toLCD[0] = 254;
          toLCD[1] = 192;
          toLCD[2] = 'W';
          toLCD[3] = 't';
          toLCD[4] = ':';
          if (weightTot < 0 && weightTot >= - 100) {
            weightTot = 0;
          }
          if (weightTot < -100) {
            toLCD[5] = 'E';
            toLCD[6] = 'r';
            toLCD[7] = 'r';
            toLCD[8] = '.';
          }
          else {
            toLCD[5] = (char)(weightTot / 100000) + 48;
            toLCD[6] = (char)((weightTot % 100000) / 10000) + 48;
            toLCD[7] = (char)((weightTot % 10000) / 1000) + 48;
            toLCD[8] = (char)((weightTot % 1000) / 100) + 48;
          }
          toLCD[9] = ' ';
          if (CG != 0) {
            toLCD[10] = 'C';
            toLCD[11] = 'G';
            toLCD[12] = ':';
            toLCD[13] = (char)(CG / 10000) + 48;
            toLCD[14] = (char)((CG % 10000) / 1000) + 48;
            toLCD[15] = (char)((CG % 1000) / 100) + 48;
            toLCD[16] = '.';
            toLCD[17] = (char)((CG % 100) / 10) + 48;
          }
          else {
            for (byte s = 10; s < 18; s++) {
              toLCD = ' ';
            }
          }
          toLCD[18] = ';';
          for (byte i = 0; i < sizeof(toLCD) - 1; i++) {
            Serial.write(toLCD);
          }
        } else if (output == 2) { //if output = 2: print to I2C LCD
          #ifdef I2CDISP
          lcd.clear();
          // 1st Line: Weight
          lcd.setCursor(0, 0);
          if (weightTot < 0 && weightTot >= - 100)
            weightTot = 0;
          if (weightTot < -100)
            lcd.print("Wt: Error!");
          else {
            sprintf(toLCD, "Wt: %ug", weightTot/100);
            lcd.print(toLCD);
          }
          // 2nd Line: CG
          lcd.setCursor(0, 1);
          if (CG == 0)
            lcd.print("CG: Error!");
          else {
            sprintf(toLCD, "CG: %ld.%ldmm", CG/100, CG%100);
            lcd.print(toLCD);
          }
          #endif
        }
        readBattVoltage();
      }
      flashLED();
    }


    最佳答案

    查看完整內容

    不好意思上面說錯了,應該加上 output = 2; //1改成2 代碼中有提到這個,0代表串口輸出,2表示i2c LCD
  • TA的每日心情
    奮斗
    2020-4-1 00:08
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    沙發
    發表于 2020-2-18 11:04 | 只看該作者
    最強的青蛙 發表于 2020-2-19 10:09
    謝謝你再次幫我分析代碼,我在171上加上了 output = 1 后  ,LCD還是無變化

    ...

    不好意思上面說錯了,應該加上 output = 2; //1改成2
    代碼中有提到這個,0代表串口輸出,2表示i2c LCD

    kittenblock中小學創客名師推薦的圖形化編程軟件

    
    void setup() {
      //***
      // 0: Serial-Console (Your PC); 
      // 1: Serial-LCD (2nd Arduino with SimpleSerialDisplay)
      // 2: I2C-LCD (define I2CDISP above!)
      output = 0;
      //***




  • TA的每日心情
    奮斗
    2020-4-1 00:08
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    板凳
    發表于 2020-2-18 12:00 | 只看該作者
    來湊個熱鬧,我是這么理解的,其它的都好就LCD沒亮唄,LCD的驅動應該在<LiquidCrystal_I2C.h>里邊吧,里面如果沒有說scl  sda咋接的話,那應該就是接板子上sda scl唄,具體就看什么板子了。
  • TA的每日心情
    開心
    2020-2-18 13:38
  • 簽到天數: 1 天

    [LV.1]初來乍到

    地板
     樓主| 發表于 2020-2-18 13:01 | 只看該作者
    本帖最后由 最強的青蛙 于 2020-2-18 13:05 編輯
    長野驚風 發表于 2020-2-18 12:00
    來湊個熱鬧,我是這么理解的,其它的都好就LCD沒亮唄,LCD的驅動應該在里邊吧,里面如果沒有說scl  sda咋接 ...

    板子上的sda scl 也試過,,我看了下代碼,正常的話串口監視器會提示
    "You have I2CDISP defined, but output is not 2. Are you sure thats right?",實際的串口監視器里并沒有顯示這個,按代碼邏輯,顯示這個之后才會點亮LCD。


    kittenblock中小學創客名師推薦的圖形化編程軟件

    #ifdef I2CDISP
    
      if (output != 0)
    
        Serial.println("You have I2CDISP defined, but output is not 2. Are you sure thats right?");
    
     
    
      Serial.println("Initializing I2C-Display");
    
      lcd.init();
    
      lcd.backlight();
    
      lcd.setCursor(0, 0);
    
      lcd.print("F3X COG scale,");
    
      lcd.setCursor(0, 1);
    
      lcd.print("at your service!");
    
    #endif


    該用戶從未簽到

    5#
    發表于 2020-2-18 13:11 | 只看該作者
    所以,你的第一個問題應該是怎么點亮 LCD

    跑一下庫的例子看看?
  • TA的每日心情
    開心
    2020-2-18 13:38
  • 簽到天數: 1 天

    [LV.1]初來乍到

    6#
     樓主| 發表于 2020-2-18 13:35 | 只看該作者
    本帖最后由 最強的青蛙 于 2020-2-18 13:40 編輯
    Zoologist 發表于 2020-2-18 13:11
    所以,你的第一個問題應該是怎么點亮 LCD

    跑一下庫的例子看看?

    跑過例子  LCD是OK的
  • TA的每日心情
    奮斗
    2020-4-1 00:08
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    7#
    發表于 2020-2-18 14:44 | 只看該作者
    本帖最后由 長野驚風 于 2020-2-18 14:52 編輯
    最強的青蛙 發表于 2020-2-18 13:35
    跑過例子  LCD是OK的
    稍認真地看了下代碼
    第三十行
    // #define I2CDISP 這行是不是要去掉注釋
  • TA的每日心情
    開心
    2020-2-18 13:38
  • 簽到天數: 1 天

    [LV.1]初來乍到

    8#
     樓主| 發表于 2020-2-18 21:14 | 只看該作者
    長野驚風 發表于 2020-2-18 14:44
    稍認真地看了下代碼
    第三十行
    // #define I2CDISP 這行是不是要去掉注釋

    好的,我看下。
  • TA的每日心情
    開心
    2020-2-18 13:38
  • 簽到天數: 1 天

    [LV.1]初來乍到

    9#
     樓主| 發表于 2020-2-18 22:11 | 只看該作者
    本帖最后由 最強的青蛙 于 2020-2-18 23:01 編輯

    感謝大神幫我幫我查看代碼,我去掉注釋后編譯上傳,
    1、串口成功顯示“Initializing I2C-Display”

    2、lcd屏也亮了并顯示
    “F3X COG scale
    at your service!”

    3、不過現在屏幕一直停留在 F3X COG scale
    at your service! 。按照我對邏輯的理解,當我對2個711傳感器施壓屏幕應該會出現 wt:xxx 和 CG:xxx 才對。

    串口監視器里,wt 和CG 一直在正常跑,我截個圖給你看下。



    ------------------------
    4、基于上面,,我是不是排查這部分

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #endif
    
    
      LoadCell_1.begin();
      LoadCell_2.begin();
      byte loadcell_1_rdy = 0;
      byte loadcell_2_rdy = 0;
      while ((loadcell_1_rdy + loadcell_2_rdy) < 2) { //run startup, stabilisation and tare, both modules simultaneously
        if (!loadcell_1_rdy) loadcell_1_rdy = LoadCell_1.startMultiple(stabilisingtime);
        if (!loadcell_2_rdy) loadcell_2_rdy = LoadCell_2.startMultiple(stabilisingtime);
      }
      LoadCell_1.setCalFactor(ldcell_1_calfactor); // set calibration factor
      LoadCell_2.setCalFactor(ldcell_2_calfactor); // set calibration factor
    
      pinMode(ledPin, OUTPUT); //led
      digitalWrite(ledPin, HIGH);
    
      if (output == 1) { //if output to LCD
        Serial.write(254);
        Serial.write(127); // clear lcd
      }
    }


  • TA的每日心情
    奮斗
    2020-4-1 00:08
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    10#
    發表于 2020-2-19 00:48 | 只看該作者
    最強的青蛙 發表于 2020-2-18 22:11
    感謝大神幫我幫我查看代碼,我去掉注釋后編譯上傳,
    1、串口成功顯示“Initializing I2C-Display”

    感覺和我想得不太一樣呀,又看了看代碼,每個#ifdef i2cdisp 和#endif之間是控制LCD的代碼,
    程序應該是用output變量控制數據顯示位置,
    按你的描述loop里控制LCD顯示的代碼(第236行到256行)似乎沒有執行,
    可以嘗試在第171行,if之前加一句 output = 1; 試試,
    如果有效果的話,再在loop循環結束時讓output重置為 0 ,應該就能達到想要的效果了。
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    熱門推薦

    5分鐘帶你快速了解新一代開發板:M5STACK
    5分鐘帶你快速了解新一代
    一、什么是M5Stack M5Stack是一種模塊化、可堆疊擴展的開發板,每個模塊
    《Color Unit免費申請試用》
    《Color Unit免費申請試用
    COLOR 是一款顏色識別 Unit,其內部集成TCS3472彩色光數字轉換器,能夠將其檢測到顏色
    【Arduino】168種傳感器系列實驗(137)---TTS文字轉語音合成
    【Arduino】168種傳感器系
    37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是
    【Arduino】u8g2中文字庫制作教程 小白請進
    【Arduino】u8g2中文字庫
    我知道對于這個話題許多大佬們都會,發這個貼子也算是炒冷飯了,所以一開始我也十分糾
    【干貨分享】mega2560原理圖PCB圖紙altium designer18
    【干貨分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本內容被作者隱藏 **** ergo
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   
    快速回復 返回頂部 返回列表
    3d每天组六27个号必中