LGT8F328P arduino 下使用低功耗睡眠模式

這個與網上多數搜到的arduino uno 那種 看門狗定時的代碼不一樣 。感覺更簡單(如果我認識的沒錯的話。。。)

 

首先要加載LGT8F328P的庫,建議用這個第三方。連不上的話,自己想辦法上網聯。。。。

https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json

這個需要多謝如下鏈接和官方的努力,而且這個是可以調整CPU頻率的 1-32MHZ!

https://github.com/dbuezas/lgt8fx 

現在最高版本是1.0.5

"name": "LGT8fx Boards",
          "architecture": "avr",
          "version": "1.0.5",
          "category": "lgt8fx",
          "url": "https://github.com/dbuezas/lgt8fx/releases/download/v1.0.5/lgt8f-1.0.5.zip",
          "archiveFileName": "lgt8f-1.0.5.zip",
          "checksum": "SHA-256:6bde3060b7a9102eed89c32a163bd99db4129231ed7847a6245b2fa44433fff5",
          "size": "598269",

 

他官網的功耗說明:

Power consumption @ 5v

Clock Pro mini style w/o power LED Pro mini style Nano style
32MHz 12.7mA 15.0mA 32.6mA
16MHz 9.2mA 11.5mA 27.8mA
8MHz 7.1mA 9.4mA 25.4mA
4MHz 5.9mA 8.2mA 23.3mA
2MHz 5.3mA 7.6mA 23.4mA
1MHz 5.0mA 7.3mA 22.8mA

 

裝好後 下面說正事

本來我也以爲這個睡眠起牀是兼容arduino庫的,使用看門狗WDT喚醒,但是怎麼拭都不行,最終我看到了這個

https://www.geek-workshop.com/thread-33249-1-1.html

原來是需要PMU庫,那個纔是LGT的低功耗庫

上兩個OCROBOT的例程

pmu_autowakeup

#include <PMU.h>

volatile uint8_t g_LastState;
volatile uint8_t g_IntFlag;

void setup()
{
  Serial.begin(9600);

  pinMode(2,INPUT);
  digitalWrite(2, HIGH);

  attachInterrupt(0, donothing, FALLING);
  g_LastState = digitalRead(2);
  g_IntFlag = 0;
}
 
void loop()
{
    Serial.write("hello, I am working!\n");
    
    // power/down mode 
    if(g_LastState == HIGH)
    {
      Serial.println("Change to falling");
      attachInterrupt(0, donothing, FALLING);      
    }
    else
    {
      Serial.println("Change to rising");
      attachInterrupt(0, donothing, RISING);      
    }

    Serial.flush();
  
    PMU.sleep(PM_POFFS0, SLEEP_4S);  
    g_LastState = digitalRead(2); 
}

void donothing()
{
    //g_IntFlag = 1;
}

 pmu_poweroff

#include <PMU.h>

uint8_t sleepPin = 7;
uint8_t vTmp = 0;

void setup()
{
  Serial.begin(9600);
    
  attachInterrupt(0, donothing, LOW);  // enable EXINT0 for wakeup
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);  // internall pullup

  pinMode(sleepPin, INPUT);
  digitalWrite(sleepPin, HIGH);  // internal pullup 
}

void loop()
{
  Serial.write("hello, I am working!\n");
  delay(10);
  
  // enable power/off 
  if(digitalRead(sleepPin) == 0)
    PMU.sleep(PM_POFFS0);  
}

void donothing()
{
  // dummy function
}

附上一個我的垃圾程序

#include <PMU.h>

uint8_t sleepPin = 7;
uint8_t vTmp = 0;
volatile long g_IntFlag = 0;
volatile boolean LED_state = 1;
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Serial.write("hello, I am working!\n");
  delay(100);
  Serial.println(LED_state);
  delay(100);
  Serial.println(g_IntFlag);
  delay(100);
  g_IntFlag++;

  if (g_IntFlag % 2 == 0) {
    digitalWrite(LED_BUILTIN, LED_state);
    LED_state = !LED_state;
  }
  ;
  PMU.sleep(PM_POFFS0, SLEEP_1S);
}

LGT8F328P 還是不錯的,如果大家要實驗,推薦試試OCROBOT的開發板。

如果拿來用,還有更簡版,價格比arduino mini 可合適多了 ,而且自帶12位ADC 也是相當實用的DD

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章