Created
September 17, 2024 16:01
-
-
Save masuidrive/91ec4752dbafef50106d577eb73e7a55 to your computer and use it in GitHub Desktop.
M5 ATOM Matrixでi2c scanner
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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