Skip to content

{Update} Can I suggest an update the to I2C tester.ino #51

@MDAR

Description

@MDAR

On my journey of finding out what is wrong with the 8Servo units that I have, I have needed to get my head around I2C ports and how to scan them.

As the StickC and StickC-Plus have two ports, I modified your I2C_tester.ino code so that I can toggle between the ports, after a restart

This is the script I used for the M5StickC

Pressing Button A will set it to the TOP / HAT I2C port and restart

Pressing Button B will set it to the Bottom / Grove port and restart

It's not pretty code, but it does work.

I just wish I could get the 8Servo (or in fact the Servo Hat) to work.

/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
*                  Equipped with M5StickC sample source code
*                          配套  M5StickC 示例源代码
* Visit for more information: https://docs.m5stack.com/en/core/m5stickc
* 获取更多资料请访问: https://docs.m5stack.com/zh_CN/core/m5stickc
*
* Describe:  I2C Scanner.  I2C探测
* Date: 2021/7/27
*******************************************************************************
*/
/*
This program scans the addresses 1-127 continuosly and shows the devices found
on the TFT. 该程序连续扫描地址 1-127 并显示在外部(内部)I2C发现的设备。
*/
#include <M5StickC.h>
#include <Preferences.h>

Preferences preferences;

int I2C_SDA = 0;
int I2C_SCL = 26;

bool releaseA = false;
bool releaseB = false;
bool portName = 1;

String portNameAlias = "Top Port";

int textColor = YELLOW;

void btn_task(void *arg) { // set this VOID as a task, to run outside of LOOP
    while (1) {
   
        if (M5.BtnA.wasPressed() ) {
            releaseA = !releaseA;
              Serial.println("Chaneg Define");
//        Wire.end();
//            delay (300);
//        Wire.begin(0, 26); // Detect external I2C, Top pins if this sentence is  added,
 I2C_SDA = 0;
 I2C_SCL = 26;
        Serial.println("TOP I2C port activated");
            M5.Lcd.setCursor(0, 0);
            M5.Lcd.println("   RESTARTING                          ");
        portName = 1;
  // Store the counter to the Preferences
  preferences.putUInt("I2C_SDA", I2C_SDA );
  preferences.putUInt("I2C_SCL", I2C_SCL );
  preferences.putBool("portName", portName);

  // Close the Preferences
  preferences.end();
  delay(300);
  ESP.restart();

        }
             if (M5.BtnB.wasPressed() ) {
            releaseB = !releaseB;
              Serial.println("Chaneg Define");
 //       Wire.end();
 //           delay (300);
 //       Wire.begin(33, 32); // Detect external I2C, Top pins if this sentence is  added,
 I2C_SDA = 32;
 I2C_SCL = 33;
        Serial.println("Bottom Grove I2C port activated");
                    M5.Lcd.setCursor(0, 0);
                    M5.Lcd.println("      RESTARTING                               ");
        portName = 0;
  // Store the counter to the Preferences
  preferences.putUInt("I2C_SDA", I2C_SDA );
  preferences.putUInt("I2C_SCL", I2C_SCL );
  preferences.putBool("portName", portName);

  // Close the Preferences
  preferences.end();
  delay(300);
  ESP.restart();
        }
        M5.update();
        vTaskDelay(20);
    }
    
}

void setup() {
    M5.begin();    // Init M5StickC(Init of external I2C is also included ).
                   // 初始化M5StickC(初始化外部I2C也包含在内)
    Serial.begin(9600);
    Serial.println("  ");
        Serial.println(" Hello World ");
        Serial.println("  ");

     preferences.begin("I2C", false);
     I2C_SDA = preferences.getUInt("I2C_SDA", 0); // 0 is incase the prefer does not exist
     I2C_SCL = preferences.getUInt("I2C_SCL", 26); // 26 is incase the prefer does not exist
     Wire.begin(I2C_SDA, I2C_SCL);
     portName = preferences.getBool("portName", 1); // 1 is incase the prefer does not exist, changed later to Top or BASE
if (portName){
  portNameAlias = "Top Port";
  }
else {
  portNameAlias = "Base Port";
}

Serial.println( " I2C Pins in use - SDA = "+String(I2C_SDA)+" , SCL = "+String(I2C_SCL) );

  //   Wire.begin();  // Init wire and join the I2C network. // joins Grove port by default
  //   Wire.begin(0, 26); // Detect external I2C, Top pins if this sentence is  added,
  // Wire.begin(33,32);  //Detect external I2C, Grove port if this sentence is  added,

    M5.Lcd.setTextColor(
        YELLOW);  // Set the font color to yellow.  设置字体颜色为黄色
    M5.Lcd.setRotation(3);                  // Rotate the screen.  旋转屏幕
  //  M5.Lcd.println("M5StickC I2C Tester");  // Print a string on the screen.
                                            // 在屏幕上打印字符串
    Serial.println("M5StickC I2C Tester - "+portNameAlias);
   // Serial.println("M5StickC I2C Tester - Bottom  Port ");

    delay(3000);
    M5.Lcd.fillScreen(
        BLACK);  // Make the screen full of black (equivalent to clear() to
                 // clear the screen).  使屏幕充满黑色(等效clear()清屏)

     xTaskCreate(btn_task,   /* Task function. */
                "btn_task", /* String with name of task. */
                8096,       /* Stack size in bytes. */
                NULL,       /* Parameter passed as input of the task */
                1,          /* Priority of the task. */
                NULL);      /* Task handle. */
}



void loop() {
scanI2C();
delay(200);
}

void scanI2C() {
 //   Wire.begin(I2C_SDA, I2C_SCL);

    int address;
    int error;
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.println("scan "+portNameAlias+" [HEX]");
   // M5.Lcd.println("scan Base port [HEX]");
    Serial.println("   'END' "+portNameAlias+"   ");
    Serial.println("     New Scan >>   ");

    for (address = 1; address < 127; address++) {
        Wire.beginTransmission(
            address);  // Data transmission to the specified device address
                       // starts.   开始向指定的设备地址进行传输数据
        error = Wire.endTransmission(); /*Stop data transmission with the slave.
                   停止与从机的数据传输 0: success.  成功 1: The amount of data
                   exceeds the transmission buffer capacity limit.
                   数据量超过传送缓存容纳限制 return value:              2:
                   Received NACK when sending address.  传送地址时收到 NACK 3:
                   Received NACK when transmitting data.  传送数据时收到 NACK
                                              4: Other errors.  其它错误 */
        if (error == 0) {
            M5.Lcd.print(address, HEX); // show the Decimal address as a HEX value
            M5.Lcd.print(" ");
            Serial.print("Found @ 0x");
            Serial.print(address,HEX); // show the Decimal address as a HEX value
            Serial.print("  & ");
        } else
            M5.Lcd.print(".");
           // Serial.println(" ----- ");

        delay(10);
    }

    if (textColor == YELLOW) {
        textColor = CYAN;
    } else
        textColor = YELLOW;
    M5.Lcd.setTextColor(textColor,
                        BLACK);  // Set the foreground color of the text to
                                 // textColor and the background color to BLACK.
                                 // 设置文字的前景色为textColor背景色为BLACK
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions