zoukankan      html  css  js  c++  java
  • 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("
     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();    
    }
    

      

  • 相关阅读:
    MAVEN学习笔记之私服Nexus(2)
    MAVEN学习笔记之基础(1)
    mybatis 高级映射和spring整合之逆向工程(7)
    IPC之共享内存
    IPC之SystemV
    IPC之消息队列
    IPC之信号量
    线程同步
    线程函数
    线程基础
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/8292444.html
Copyright © 2011-2022 走看看