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 ()
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
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...
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.