{"id":622,"date":"2019-12-11T18:58:58","date_gmt":"2019-12-11T18:58:58","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=622"},"modified":"2020-11-04T15:33:58","modified_gmt":"2020-11-04T15:33:58","slug":"arduino-usando-la-funcion-millis-en-lugar-de-delay","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/arduino-usando-la-funcion-millis-en-lugar-de-delay\/","title":{"rendered":"Arduino: Usando la funci\u00f3n millis() en lugar de delay()"},"content":{"rendered":"

\"\"<\/a><\/p>\n

El c\u00f3digo que sigue es un t\u00edpico ejemplo de escritura a trav\u00e9s de la comunicaci\u00f3n serie de Arduino. Escribe \u201cHola\u201d a trav\u00e9s del puerto COM serie<\/strong> (visible con el Monitor Serie<\/strong> de Arduino, en la pesta\u00f1a Herramientas), y espera durante 1000 milisegundos (1 segundo) al final de cada iteraci\u00f3n del bucle. <\/p>\n

void setup() {\r\nSerial.begin(9600);\r\n}\r\n\r\nvoid loop() {\r\nSerial.println(\"Hola\");\r\ndelay(1000);\r\n}<\/pre>\n

La funci\u00f3n delay()<\/strong> es muy f\u00e1cil de usar para crear esperas, pero tiene un inconveniente: deja al microcontrolador \u00abatrapado\u00bb dentro de la ejecuci\u00f3n de esta funci\u00f3n durante el tiempo que se ha indicado. Si hubiese un cambio en un pin que deber\u00eda detectar, o si llegase informaci\u00f3n a trav\u00e9s de cualquiera de las comunicaciones posibles (serie, I2C o SPI) el microcontrolador s\u00f3lo se enterar\u00eda luego de completarse el retardo.<\/p>\n

Una soluci\u00f3n es crear un retardo que no deje insensible al sistema durante un tiempo tan extenso.<\/p>\n

La funci\u00f3n millis()<\/strong><\/p>\n

millis()<\/strong> devuelve el n\u00famero de milisegundos desde que la placa Arduino empez\u00f3 a ejecutar, luego de un reinicio o el encendido. Este n\u00famero se desbordar\u00e1 (volver\u00e1 a cero), despu\u00e9s de aproximadamente 50 d\u00edas.<\/p>\n

Retorna la cantidad de milisegundos en un valor long sin signo<\/strong> (unsigned long<\/strong>).<\/p>\n

  unsigned long tiempo;\r\n  void setup(){\r\n  Serial.begin(9600);\r\n  }\r\n  void loop(){\r\n  Serial.print(\"Tiempo: \");\r\n  tiempo = millis();\r\n  \/\/ imprime el tiempo transcurrido desde el inicio del programa\r\n  Serial.println(time);\r\n  \/\/ esperar un segundo para no enviar cantidades masivas de datos\r\n  delay(1000);\r\n  }<\/pre>\n

Nota:<\/strong> Tenga en cuenta que como el valor de retorno para millis()<\/strong> es un long sin signo<\/strong> (unsigned long<\/strong>), pueden producirse errores l\u00f3gicos si un programador intenta hacer operaciones aritm\u00e9ticas con tipos de datos m\u00e1s peque\u00f1os, como de tipo int<\/strong>. Incluso con los long con signo<\/strong> se pueden producir errores ya que su valor m\u00e1ximo es la mitad que la de su contraparte sin signo.
\n