|
使用M5StickC,我制作了一个简单的测试仪,它只能检查导通性并测量电压,支持StickC Plus
- #include <M5StackAuto.h>
-
- const int inputBeepPin = 26;
- const int inputAnalogPin = 36;
-
- hw_timer_t *timer;
- QueueHandle_t xQueue;
- TaskHandle_t taskHandle;
-
- const int16_t listCount = 1000;
- int16_t list[listCount];
- int16_t listIndex = 0;
-
- // 定时器中断
- void IRAM_ATTR onTimer() {
- int16_t data;
-
- // 数据采集
- data = analogRead(inputAnalogPin);
-
- // 发送队列
- xQueueSendFromISR(xQueue, &data, 0);
- }
-
- // 实际计时器处理任务
- void task(void *pvParameters) {
- int16_t data;
- int drawX = 9999;
-
- // 初始化屏幕
- M5.Lcd.fillRect(0, 8 * 3, M5.Lcd.width(), M5.Lcd.height(), DARKGREY);
-
- // 初始化变量
- data = analogRead(inputAnalogPin);
- for (int i = 0; i < M5.Lcd.width(); i++) {
- list[i] = data;
- }
-
- while (1) {
- // 等待直到定时器中断
- xQueueReceive(xQueue, &data, portMAX_DELAY);
-
- // 更新数据
- list[listIndex] = data;
- listIndex++;
- listIndex = listIndex % M5.Lcd.width();
- int16_t minVal = 4096;
- int16_t maxVal = 0;
- for (int i = 0; i < M5.Lcd.width(); i++) {
- minVal = min(minVal, list[i]);
- maxVal = max(maxVal, list[i]);
- }
-
- //X轴计算
- drawX++;
- if (M5.Lcd.width() <= drawX) {
- // 进行右端初始化
- drawX = 0;
- }
-
- // 处理显示
- int drawY = map(4095 - data, 0, 4095, 8 * 3, M5.Lcd.height() - 1);
- M5.Lcd.fillRect(drawX, 8 * 3, 16, M5.Lcd.height(), DARKGREY);
- M5.Lcd.drawPixel(drawX, drawY, WHITE);
- Serial.println(data);
- M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 0);
- M5.Lcd.printf("min %5.3fV\n", 3.3 * minVal / 4095);
- M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 1);
- M5.Lcd.printf("max %5.3fV\n", 3.3 * maxVal / 4095);
- M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 2);
- M5.Lcd.printf("now %5.3fV\n", 3.3 * data / 4095);
- }
- }
-
- void setup() {
- M5.begin();
- pinMode(inputBeepPin, INPUT_PULLUP);
- pinMode(inputAnalogPin, ANALOG);
- pinMode(M5_LED, OUTPUT_OPEN_DRAIN);
- digitalWrite(M5_LED, HIGH);
- M5.Beep.setVolume(1);
-
- // 画面
- M5.Lcd.setRotation(3);
- M5.Lcd.fillScreen(BLACK);
- M5.Lcd.setCursor(0, 0);
- M5.Lcd.println("M5StickC Tester");
- M5.Lcd.println(" GPIO26 LowBeep");
- M5.Lcd.println(" GPIO36 AnalogIn");
-
- //队列创建
- xQueue = xQueueCreate(1, sizeof(int16_t));
-
- // 以Core1的优先级5启动任务
- xTaskCreateUniversal(
- task, // 任务功能
- "task", // 任务名称(无意义)
- 8192, // 堆大小
- NULL, // 任务参数
- 5, // 优先级(越大越高)
- &taskHandle, // 任务句柄
- APP_CPU_NUM // 执行的CPU(PRO_CPU_NUM or APP_CPU_NUM)
- );
-
- // 使用四个计时器中的第一个
- // 每1微秒计数一次(任意频率)
- // true:计数
- timer = timerBegin(0, getApbFrequency() / 1000000, true);
-
- // 定时器中断设定
- timerAttachInterrupt(timer, &onTimer, true);
-
- // 计时器设置为微秒
- timerAlarmWrite(timer, 20 * 1000, true);
-
- // 定时器启动
- timerAlarmEnable(timer);
- }
-
- void loop() {
- static bool beep = false;
- M5.update();
- if (!digitalRead(inputBeepPin)) {
- if (!beep) {
- beep = true;
- M5.Beep.tone(1000, 1000000);
- digitalWrite(M5_LED, LOW);
- }
- } else {
- if (beep) {
- beep = false;
- M5.Beep.mute();
- digitalWrite(M5_LED, HIGH);
- }
- }
-
- delay(1);
- }
复制代码
|
|