Skip to content

Instantly share code, notes, and snippets.

@masuidrive
Created September 17, 2024 16:01
Show Gist options
  • Save masuidrive/91ec4752dbafef50106d577eb73e7a55 to your computer and use it in GitHub Desktop.
Save masuidrive/91ec4752dbafef50106d577eb73e7a55 to your computer and use it in GitHub Desktop.
M5 ATOM Matrixでi2c scanner
#include <M5Atom.h>
#include <Wire.h>
// 高位4ビット(0-F)の5x3パターン
const uint8_t hexPatternsHigh[16][5] = {
// 0
{0b111, 0b101, 0b101, 0b101, 0b111},
// 1
{0b010, 0b110, 0b010, 0b010, 0b111},
// 2
{0b111, 0b001, 0b111, 0b100, 0b111},
// 3
{0b111, 0b001, 0b111, 0b001, 0b111},
// 4
{0b101, 0b101, 0b111, 0b001, 0b001},
// 5
{0b111, 0b100, 0b111, 0b001, 0b111},
// 6
{0b111, 0b100, 0b111, 0b101, 0b111},
// 7
{0b111, 0b001, 0b010, 0b100, 0b100},
// 8
{0b111, 0b101, 0b111, 0b101, 0b111},
// 9
{0b111, 0b101, 0b111, 0b001, 0b111},
// A
{0b111, 0b101, 0b111, 0b101, 0b101},
// B
{0b110, 0b101, 0b110, 0b101, 0b110},
// C
{0b111, 0b100, 0b100, 0b100, 0b111},
// D
{0b110, 0b101, 0b101, 0b101, 0b110},
// E
{0b111, 0b100, 0b111, 0b100, 0b111},
// F
{0b111, 0b100, 0b111, 0b100, 0b100},
};
// 低位4ビット(0-F)の5x2パターン
const uint8_t hexPatternsLow[16][5] = {
// 0
{0b11, 0b11, 0b11, 0b11, 0b11},
// 1
{0b10, 0b10, 0b10, 0b10, 0b10},
// 2
{0b11, 0b01, 0b11, 0b10, 0b11},
// 3
{0b11, 0b01, 0b11, 0b01, 0b11},
// 4
{0b10, 0b10, 0b11, 0b01, 0b01},
// 5
{0b11, 0b10, 0b11, 0b01, 0b11},
// 6
{0b11, 0b10, 0b11, 0b11, 0b11},
// 7
{0b11, 0b01, 0b10, 0b10, 0b10},
// 8
{0b11, 0b11, 0b11, 0b11, 0b11},
// 9
{0b11, 0b11, 0b11, 0b01, 0b11},
// A
{0b11, 0b10, 0b11, 0b10, 0b10},
// B
{0b10, 0b10, 0b11, 0b10, 0b11},
// C
{0b11, 0b10, 0b10, 0b10, 0b11},
// D
{0b10, 0b10, 0b11, 0b10, 0b11},
// E
{0b11, 0b10, 0b11, 0b10, 0b11},
// F
{0b11, 0b10, 0b11, 0b10, 0b10},
};
// 高位桁(0-F)の数字を表示する関数
void displayHexHigh(uint8_t digit, uint32_t color) {
if (digit > 15) digit = 15;
for(int row=0; row<5; row++) {
uint8_t pattern = hexPatternsHigh[digit][row];
for(int col=0; col<3; col++) {
if(pattern & (1 << (2 - col))) { // 左から右へ
int x = col;
int y = row;
int pixelIndex = y * 5 + x; // 行優先でピクセルを設定
M5.dis.drawpix(pixelIndex, color);
}
}
}
}
// 低位桁(0-F)の数字を表示する関数
void displayHexLow(uint8_t digit, uint32_t color) {
if (digit > 15) digit = 15;
for(int row=0; row<5; row++) {
uint8_t pattern = hexPatternsLow[digit][row];
for(int col=0; col<2; col++) {
if(pattern & (1 << (1 - col))) { // 左から右へ
int x = col + 3; // 3と4列目に配置
int y = row;
int pixelIndex = y * 5 + x; // 行優先でピクセルを設定
M5.dis.drawpix(pixelIndex, color);
}
}
}
}
// 数字を表示する関数
void displayHex(uint8_t high, uint8_t low) {
// 内蔵マトリックスをクリア
for(int i=0; i<25; i++) {
M5.dis.drawpix(i, 0); // 消灯
}
// 高位桁を赤色で表示
displayHexHigh(high, 0x660000);
// 低位桁を青色で表示
displayHexLow(low, 0x000066);
// 表示を更新
// M5.dis.run();
}
void setup() {
M5.begin(true, false, true); // M5Atomの初期化(シリアルモニター無効)
Wire.begin(26, 32); // I2Cのピンを設定(SDA=26, SCL=32)
// 起動メッセージとして"00"を表示
displayHex(0, 0);
delay(3000); // 3秒待機
}
void loop() {
int foundAddress = -1;
for(int address=1; address <127; address++) {
Wire.beginTransmission(address);
int error = Wire.endTransmission();
if(error == 0){
foundAddress = address;
// アドレスが見つかった場合
uint8_t highNibble = (address >> 4) & 0x0F;
uint8_t lowNibble = address & 0x0F;
Serial.printf("addr=%02x\n", address);
// アドレスを16進数で表示
displayHex(highNibble, lowNibble);
delay(500); // 表示時間
}
else{
// デバイスが見つからなかった場合は消灯
if(address == foundAddress) {
for(int i=0; i<25; i++) {
M5.dis.drawpix(i, 0); // 消灯
}
}
}
delay(100); // スキャン速度調整
}
delay(1000); // 全アドレススキャン後に待機
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment