Arduino IDE for ESP8266 項目(1) 點亮燈+按鍵LED+pwm


官方文檔 http://esp8266.github.io/Arduino/versions/2.1.0/doc/libraries.html

引腳口說明 http://yfrobot.com/thread-11798-1-1.html

數字I/O口 Digital IO
Arduino 引腳號直接對應ESP8266 GPIO 引腳。pinMode,digitalRead,和 digitalWrite 函數照常使用,所以讀取GPIO2引腳,這樣寫:digitalRead(2) 。
數字引腳 0~15可以設置為 INPUT,OUTPUT 或者 INPUT_PULLUP 模式。引腳 16可以設置為INPUT,OUTPUT 或者 INPUT_PULLDOWN_16 模式。在啟動時,引腳被配置為INPUT。
引腳同樣可以提供其他功能,像串行,I2C,SPI。這些函數通常需要使用相應的庫。下圖為ESP-12模塊的引腳圖:

 

可見圖中沒有數字引腳6~11,因為大部分模塊使用這幾個引腳連接了flash存儲芯片了。這些引腳不可使用,否則可能導致程序崩潰。

注意:有些電路板和模塊(ESP-12ED NodeMCU 1.0)也釋放了引腳9和11,如果Flash芯片工作在DIO模式下(默認QIO模式),它們可以被當做IO口使用。
引腳中斷可以使用 attachInterrupt,detachInterrupt函數。除了GPIO16引腳,其他引腳都可以使用中斷功能。標准的Arduino 中斷類型都是支持的:CHANGE,RISING,FALLING。

 

 模擬輸入 Analog input
ESP8266只有一個ADC通道提供給用戶。它可以使用於讀取ADC引腳電壓,也可使用於讀取模塊電源電壓(VCC)。
讀取ADC引腳值電壓,使用analogRead(A0)。輸入電壓范圍:0~1.0V。
讀取模塊電源電壓,使用ESP.getVcc() 且ADC引腳不能連接。另外,下面的代碼必須添加至程序中:
ADC_MODE(ADC_VCC);
這條代碼不能包含在任何函數中,放在程序中 #include 之后即可。
模擬輸出 Analog output
analogWrite(pin, value) 在已有的引腳上使能軟件PWM功能。PWM可以用在引腳0~16。調用analogWrite(pin, 0) 可以關閉引腳PWM。取值范圍:0~ PWMRANGE,默認為1023。 PWM 范圍可以使用analogWriteRange(new_range)語句來更改。
PWM 默認頻率:1KHz。使用analogWriteFreq(new_frequency) 可以更改頻率。

時間與延時  Timing and delays
millis() 和 micros() 分別返回單位為毫秒和微秒的值,復位后值重置。
delay(ms) 暫時程序給定毫秒時間並允許WiFi和TCP/IP任務的運行。delayMicroseconds(us) 暫時程序給定微秒時間。
記住wifi連接后除了素描程序外還有許多代碼需要再芯片上運行。每次loop()函數完成時或當delay被調用時,Wifi和TCP/IP庫都有機會處理任何等待事件。如果你程序中某處有循環,消耗事件大於50ms且沒有調用delay,你可以考慮添加一個調用延時函數以保持Wifi堆棧的平穩運行。
有個 yield()函數和delay(0)功能相同。delayMicroseconds函數,在另一方面,不會為其他任務讓步,所以當延時超過20ms時不推薦使用它。

串行 Serial
Serial 功能幾乎和普通arduino一樣,除了硬件FIFO (128 bytes for TX and RX)有額外256byte TX and RX緩沖區。傳輸和接收都是中斷驅動。當FIFO和緩沖區分別為滿和空時,讀寫功能將阻止程序的運行。
Serial 使用UART0,即引腳映射GPIO1(TX)和GPIO3(RX)。Serial.begin 之后調用Serial.swap()時,Serial引腳將映射到GPIO15(TX)和GPIO13(RX)。再次調用 swap時 引腳映射將回到GPIO1(TX)和GPIO3(RX)。
Serial1 使用UART1,TX引腳為GPIO2。UART1不能用來接收數據因為通常情況RX引腳被用到flash芯片連接了。使用Serail1,調用 Serial1.begin(baudrate)。
如果Serial1沒有使用且Serial沒有被調換 - 通過在Serial.begin之后調用Serial.set_tx(2)或者直接調用Serial.begin(baud,config,mode,2) 可以將UART0的TX映射到GPIO2。
默認情況下當你調用Serial.begin,Wifi庫診斷輸出是禁用的。再次啟動調試輸出,調用Serial.setDebugOutput(true)。調用Serial1.setDebugOutput(true),Serial1重定向調試輸出。
你也需要使用Serial.setDebugOutput(true)去使能printf()函數的輸出。
Serial和Serial1都支持 5,6,7,8數據位;奇 (O), 偶 (E),無(N) 校驗位;1或2停止位。設置所需模式,調用Serial.begin(baudrate,SRIAL_8N1),Serial.begin(baudrate, SERIAL_6E2), etc.

Progmem

程序內存工作特性和arduino頁非常相似,在只讀存儲器中的存放只讀數據和字符串,為你的應用釋放堆。最重要的區別是在ESP8266上字符串不合並。這意味着在代碼中定義在F("")和PSTR("")中的相同字符串在每個實例中都將占用空間。所以你需要自行管理重復的字符串。
有個附加輔助宏,讓它更容易通過 const PROGMEM 字符串去使用 FPSTR()(__FlashStringHelper)方法。這樣使用將有助於使合並字符串更簡便。Not pooling strings...(這尼瑪什么鬼,不懂)
[C]  純文本查看  復制代碼
?
1
2
3
4
5
String response1;
response1 += F( "http:" );
...
String response2;
response2 += F( "http:" );

1點亮LED

//總共可用    0-15  16皆可IO  pwm 輸出 但是 6-11被系統時鍾占用
//實際可用    0 1(TX) 2  3(RX) 4 5  12 13 14 15 16
// 一般RX  TX留出


void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  
   pinMode(0, OUTPUT); 
   pinMode(1, OUTPUT); 
   pinMode(2, OUTPUT); 
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
  
  digitalWrite(0, LOW);                            // but actually the LED is on; this is because 
  digitalWrite(1, LOW);                            // it is acive low on the ESP-01)
  digitalWrite(2, LOW);   
         
  delay(1000);                      // Wait for a second
  digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH

  digitalWrite(0, HIGH);                            // but actually the LED is on; this is because 
  digitalWrite(1, HIGH);                            // it is acive low on the ESP-01)
  digitalWrite(2, HIGH);  
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}

  

 

  

 

2按鍵點亮LED

#define PIN_LED 16 //定義LED燈:PIN_LED所對應的引腳為16號

#define KEY_FLASH 0 //定義KEY_FLASH 對應0號引腳,其實就是FLASH按鍵位置



void setup() {

  Serial.begin(115200);

  Serial.setDebugOutput(true);

  pinMode(PIN_LED, OUTPUT); //初始化PIN_LED引腳模式為輸出

  pinMode(KEY_FLASH, INPUT);//初始化Flash按鍵模式為輸入

  digitalWrite(PIN_LED,HIGH);//初始LED燈置為低電平,表示點亮

  delay(1000); //延時1秒

}

//自定義按鍵函數

void keydo(){

 //讀出當前按鍵狀態,0表示抬起斷開,1為按下接通

 int k;

 k=digitalRead(KEY_FLASH);

 Serial.println("\r\n keydo:");

 Serial.write(k);

 Serial.println();

 if(k==0) 

  digitalWrite(PIN_LED,HIGH); //高電平表示燈滅

  else

  digitalWrite(PIN_LED,LOW);

}



void loop() {

  //digitalWrite(PIN_LED, LOW);  

  delay(500);                      

  keydo();

  //digitalWrite(PIN_LED, HIGH);  

  delay(500);                      

}

  

 

3生成PWM

 

#define PIN_LED 16



void setup() {

  pinMode(PIN_LED, OUTPUT);

  analogWrite(PIN_LED, 0);//模擬信號輸出

}



void loop() {

  for (int i = 0; i < 1024; i++)

  {//電平升高,從明到暗

    analogWrite(PIN_LED, i);

    delay(2);

  }

  for (int i = 1024; i >= 0; i--)

  {//電平降低,從暗到明

    analogWrite(PIN_LED, i);

    delay(2);

  }

}

  4控制舵機

/* Sweep
 by BARRAGAN <http://barraganstudio.com> 
 This example code is in the public domain.

 modified 28 May 2015
 by Michael C. Miller
 modified 8 Nov 2013
 by Scott Fitzgerald

 http://arduino.cc/en/Tutorial/Sweep
*/ 

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // twelve servo objects can be created on most boards
 

void setup() 
{ 
  myservo.attach(2);  // attaches the servo on GIO2 to the servo object 
} 
 
void loop() 
{ 
  int pos;

  for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
} 

  

 5 中斷函數  需要上拉電阻 10k

 

//connect a jumper from GPIO 14 to ground to start test

#define GPIO_PIN 14 

uint8_t led = LOW;


void setup(){
    pinMode(GPIO_PIN, INPUT);
    pinMode(BUILTIN_LED, OUTPUT);
    setLED();
    attachInterrupt(GPIO_PIN, highInterrupt, RISING);

}

void highInterrupt(){
    led = HIGH;
    detachInterrupt(GPIO_PIN);
    attachInterrupt(GPIO_PIN, lowInterrupt, FALLING);
}

void lowInterrupt(){
    led = LOW;
    detachInterrupt(GPIO_PIN);
    attachInterrupt(GPIO_PIN,  highInterrupt, RISING);
}

void setLED(){
    digitalWrite(BUILTIN_LED, led);

}

void loop(){
    setLED();    
}

  

示例2 不可用

 

 

引腳作為輸入的聲明是通過pinMode函數完成的,pinMode函數接收引腳作為第一個參數,並將第二個參數作為模式接收。

pinMode(interruptPin, INPUT_PULLUP);

  

 

最后,我們使用attachInterrupt函數將中斷附加到引腳它接收中斷號碼作為第一個參數,作為第二個參數的中斷服務程序,以及第三個中斷模式。

在第一個參數中,我們將使用  digitalPinToInterrupt函數,該函數接收中斷引腳作為輸入,將實際的數字引腳轉換為特定的中斷號[6]。

作為第二個參數,我們將通過我們將定義后者的處理函數。這個函數不能使用任何參數,也不會返回任何結果[6]。

作為第三個參數,我們可以通過3種支持的中斷類型之一:CHANGE,RISING和FALLING [7]。在我們的情況下,我們不會檢測到信號的下降沿,所以我們通過下降。

const byte interruptPin = 13;  // 13 對應板載LED   2 對應433中斷0
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;
 
void setup() {
 
  Serial.begin(115200);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
 
}
 
void handleInterrupt() {
  interruptCounter++;
}
 
void loop() {
 
  if(interruptCounter>0){
 
      interruptCounter--;
      numberOfInterrupts++;
 
      Serial.print("An interrupt has occurred. Total: ");
      Serial.println(numberOfInterrupts);
  }
 
}

  6 通信433接收

 

//connect a jumper from GPIO 14 to ground to start test

#define GPIO_PIN 14 //  14--D5  不要上拉電阻

uint8_t led = LOW;


void setup(){
    pinMode(GPIO_PIN, INPUT);
    pinMode(BUILTIN_LED, OUTPUT);
    setLED();
    attachInterrupt(GPIO_PIN, highInterrupt, RISING);

}

void highInterrupt(){
    led = HIGH;
    detachInterrupt(GPIO_PIN);
    attachInterrupt(GPIO_PIN, lowInterrupt, FALLING);
}

void lowInterrupt(){
    led = LOW;
    detachInterrupt(GPIO_PIN);
    attachInterrupt(GPIO_PIN,  highInterrupt, RISING);
}

void setLED(){
    digitalWrite(BUILTIN_LED, led);

}

void loop(){
    setLED();    
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM