millis (): lahat ng kailangan mong malaman tungkol sa pagpapaandar ng Arduino

Arduino UNO pagpapaandar ng millis

Ang Arduino ay may isang mahusay na repertoire ng mga pagpapaandar upang gumana sa paglipas ng panahon. Isa na rito millis (), isang tagubilin na magbibigay sa iyo ng oras sa milliseconds mula nang nakabukas ang Arduino board. Ito ay maaaring mukhang walang katotohanan, at nagsisilbi lamang itong malaman kung kailan nabuksan ang hob, ngunit ang totoo ay mayroon itong higit pang mga praktikal na aplikasyon.

Por ejemplo, maaari itong magamit upang matukoy ang oras na lumipas sa pagitan ng dalawa o higit pang mga kaganapan, iwasan ang pag-debounce (bounce) ng isang pindutan, atbp. Maaari rin itong ipakita upang maipakita ang oras ng pagpapatupad sa mga kritikal na yugto ng code, na tinitiyak na gagana ang programa sa real time.

Paggana ng Millis ()

millis function na Arduino

Tulad ng nabanggit ko na, ang pagpapaandar ng Arduino millis ay ginagamit upang sukatin ang oras, at ginagawa ito sa milliseconds (ms), kaya't ang pangalan nito. Sa madaling salita, ang numerong halaga na ibabalik ng pagpapaandar na ito kapag isinama mo ito sa iyong sketch ay isang pansamantalang data na ipinahayag sa yunit na iyon.

Dapat mong malaman na ang maximum na halaga ng variable na ito ay matagal na hindi pinirmahan, iyon ay, mahaba nang walang karatula. Mahalaga ito, dahil kung gagamitin ang isang mas maliit, maaaring maganap ang mga problema sa lohika. Bilang karagdagan, dapat mong malaman na maaari itong tumagal ng hanggang 50 araw ng oras (4.320.000.000 ms), sa sandaling maabot ang halagang ito ay magsisimulang muli at magsisimulang muli mula sa zero.

Ang isa pang bagay na kailangan mong malaman ay ang paggana ng millis ay hindi gumagamit ng mga parameter.

Iba pang mga pansamantalang pagpapaandar ng Arduino

Ang Arduino ay may iba pang mga pag-andar na nauugnay sa oras para magamit mo sa iyong code. Isa na rito ang sikat na pagkaantala (), ngunit may higit pa:

  • antala (): Ito ang pinaka ginagamit at karaniwan sa lahat ng mga pag-andar ng Arduino. Gumagamit din ito ng milliseconds bilang millis (). At magkakaroon din ito ng uri na hindi naka-sign ng mahaba, pati na rin walang pagkakaroon ng halaga ng pagbabalik. Pangunahin itong ginagamit upang ipakilala ang mga pag-pause sa pagpapatupad ng isang programa, na may maraming mga application.
  • delayMicroseconds (): ay hindi gaanong ginagamit sa mga sketch, sa kasong ito ay matagal pa rin itong hindi naka-sign, na walang halaga ng pagbabalik, at sa kasong ito gumagamit ito ng microseconds. Sa kasalukuyan, ang isang maximum na halaga ay maaaring makamit sa katumpakan ng 16383, at ang minimum na 3μs. Kung kailangan mong hawakan ang naghihintay ng mas mahaba kaysa sa na, inirerekumenda na gumamit ng pagkaantala ().
  • micros (): nagbabalik din ng isang numerong halaga sa microseconds (μs) mula nang simulang ipatupad ng Arduino board ang programa. Iyon ay, ito ay tulad ng millis (), ngunit may isa pang yunit. Sa katunayan, gumagamit din ito ng hindi naka-sign na mahabang uri at hindi rin ito gumagamit ng mga parameter. Ngunit mayroon itong ilang mga karagdagang pagkakaiba, tulad ng pag-reset at pagsisimula mula sa zero kapag umabot sa 70 minuto. Tungkol sa paglutas nito ng 4 μs, o sa madaling salita, ang halagang ibabalik nito ay palaging isang maramihang apat (4, 8, 12, 16,…). Tandaan na ang 1000 μs ay katumbas ng 1 ms at 1.000.000 ay katumbas ng 1 s.

Millis () mga halimbawa sa Arduino IDE

Screenshot ng Arduino IDE

Ito ang lahat ng mga salita, at ang pinakamahusay na pagtingin sa millis () na pagpapaandar ay sa pamamagitan ng pagpapakita ng ilang mga halimbawa ng mga simpleng sketch sa Arduino IDE upang maaari mong makita ang ilang mga application at gumamit ng mga kaso. Kaya narito ang ilan praktikal na mga halimbawa...

Maaaring magamit sa lahat ng mga board ng Arduino

1-Halimbawa para sa ipaliwanag ang gamit mula sa millis ():

unsigned long inicio, fin, transcurrido;  // Declarar las variables a usar
void setup(){
   Serial.begin(9600);  //Iniciar la comunicación serial
}
void loop(){
   inicio=millis();  //Consultar ms desde que inició la ejecución del sketch
   delay(1000);  //Espera 1 segundo
   fin=millis();  //Consultar ms fin del sketch
   transcurrido=fin-inicio;  //Calcula el tiempo desde la última lectura
   Serial.println(transcurrido);  //Muestra el resultado en el monitor serial
   delay(500);  //Esperar medio segundo
}

Sukatin ang oras sa pagitan ng dalawang serial message:

unsigned long tiempo1 = 0;  //Declaramos las variables e iniciamos a 0
unsigned long tiempo2 = 0;
unsigned long diferenciaTiempo = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("Envía la letra A/a por la terminal serial");
}

void loop() {
  if(Serial.available() > 0){
     char datoRecibido = Serial.read();
     if(datoRecibido == 'A' || datoRecibido == 'a'){
        tiempo1 = millis();
        Serial.println("Envía la letra B/b por la terminal Serial");
     }
     else if(datoRecibido == 'b' && datoRecibido == 'B'){
        tiempo2 = millis();
        diferenciaTiempo = tiempo1-tiempo2;
        Serial.print("El tiempo transcurrido entre el primer y último dato enviado es: ");
        Serial.print(diferenciaTiempo);
     }
   }
}

Hacer kumurap ng isang LED may millis ():

int estadoLed;  //Almacena el estado del LED (Encendido o apagado)
int periodo = 100;  //Tiempo que está el LED encendido o apagado
unsigned long tiempoAnterior = 0;  //Almacena tiempo de referencia para comparar
void setup() {
    pinMode(13,OUTPUT);  //Configura el pin 13 como salida para el LED
}
void loop() {
  if(millis()-tiempoAnterior>=periodo){  //Evalúa si ha transcurrido el periodo programado
    estadoLed=!estadoLed;  //Cambia el estado del LED cada 100ms
    digitalWrite(13,estadoLed);  //Actualiza el estado del LED al actual
    tiempoAnterior=millis();  //Almacena el tiempo actual como referencia
    }
}

Gumawa ng isang simpleng tagasunod upang magpadala ng teksto sa pamamagitan ng serial monitor sa iba't ibang mga agwat ng oras gamit ang millis ():

#define INTERVALO_MENSAJE1 3000
#define INTERVALO_MENSAJE2 5000
#define INTERVALO_MENSAJE3 7000
#define INTERVALO_MENSAJE4 15000
 
unsigned long tiempo_1 = 0;
unsigned long tiempo_2 = 0;
unsigned long tiempo_3 = 0;
unsigned long tiempo_4 = 0;
 
void print_tiempo(unsigned long tiempo_millis);
 
void setup() {
    Serial.begin(9600);
}
 
void loop() {
    if(millis() > tiempo_1 + INTERVALO_MENSAJE1){
        tiempo_1 = millis();
        print_tiempo(tiempo_1);
        Serial.println("Soy");
    }
   
    if(millis() > tiempo_2 + INTERVALO_MENSAJE2){
        tiempo_2 = millis();
        print_tiempo(tiempo_2);
        Serial.println("Un mensaje");
    }
   
    if(millis() > tiempo_3 + INTERVALO_MENSAJE3){
        tiempo_3 = millis();
        print_tiempo(tiempo_3);
        Serial.println("De");
    }
   
    if(millis() > tiempo_4 + INTERVALO_MENSAJE4){
        tiempo_4 = millis();
        print_tiempo(tiempo_4);
        Serial.println("Esperanza");
    }
}
 
void print_tiempo(unsigned long tiempo_millis){
    Serial.print("Tiempo: ");
    Serial.print(tiempo_millis/1000);
    Serial.print("s - ");
}

Alam mo na yun para higit pang impormasyon maaari mong i-download ang libreng kurso sa Arduino sa programa sa PDF.


Maging una sa komento

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.