Campaña contra la función delay

Entiendo que la función delay tiene un gran atractivo desde el punto de vista didáctico, pero hace caer a los novatos en una mala interpretación de la estructura de los programas, por eso creo que hay que hacer un pedido para eliminar el programa blink del ide de arduino como ejemplo de " hola mundo".
Ustedes que creen?

El problema no es el ejemplo Blink, sino la mala utilización de parte de los maestros que enseñan Arduino.
Si lo expiicaras revés que pasaría?

Si alguien empieza con millis() y luego le dice.. ah si y tmb tienen delay() que pasaría?

hace caer a los novatos en una mala interpretación de la estructura de los programas

Humildemente creo que los "novatos", los de verdad, los que creen que por hacer parpadear un led ya se consideran programadores, no tienen ni idea de la estructura de los programas, la gran mayoría cuando de verdad empiezan a ver que no todo es tan fácil, abandonan, están acostumbrados a tenerlo todo para ya, a no estudiar lo básico antes de empezar, y ni hablemos de leer las normas de un foro.
Que conste que mi primer post lo puse sin hacer caso a las normas, incluso después de leerlas. :slight_smile:

Blink tiene el riesgo que hace creer al programador novato que delay() es un recurso de programación, que se puede utilizar en cualquier programa. El ejemplo Blink que esta en la IDE debería llevar, por lo menos, una advertencia sobre la poca utilidad de la función delay y no intentar construir sobre ese ejemplo un programa.
Se que suena muy talibán mi propuesta, pero ahorraría mucha decepción en el novato ¿Cuantas veces vemos un programa inmenso, que costo muchas horas, y debemos decirle que tiene que empezar de cero?

Tiene mucha razón, creo que Blink es un distorsionador de futuros programadores, simplemente les dices, esto es facil de este modo... y con esto resolverás todo siempre
Con el primer pulsador y delay se dan cuenta que esto no era asi!!

yo creo que no, porque puede servir para testear aunque el codigo se escriba en medio segundo; testear pines, leds, zumbadores, etc...

Y de ese modo te mal acostumbras a trabajar de la manera fácil.
Solo lo que tu dices se hace con delay() pero en cuanto tienes un delay(1000) y un pulsador ya terminas preguntando en el foro..." hey como hago para que mi pulsador responda mas rápido.." y todos decimos, usa millis()!!!

Si en lugar de usar delay() aprendes con mills() pues ni te lo planteas

Cuando me preguntes, tu usas delay() si claro solo con Blink y contadas veces, y en general en el contexto de los programas de otros, no mios porque un codigo mio (no por agrandado) seguramente comienza con algo y crece y crece entonces no puedo usar delay en una etapa inicial a sabiendas que luego tendré que quitarlo.
Ya lo hago contemplando que necesitaré mas adelante.

Ola a todos en primer lugar mil disculpas por la malisima ortografia

En miumilde opinion lo primero que uno deveria de aprender es el asm asi no te partes la cabesa cuando te topas con un delay y practicamente puedes dominar cualqrier otro lenguage muy rapido yo en lo personal nunca e echo un proyecto con ningun otro lenguaje.
Si estoy en esto es por la amplia extencion de libreias que disponen y asi decifrar mas rapido como funcionan
Me explico Descargas el datasheet de algun componente y ay veces q dan muy poca informacion y el tiempo esta encima de uno pues buscas algun proyecto con dicho componente lo estudias y ya sbes como funciona y listo
Como dijo el amigo sereno ay muchos por ai que piensan que es muy sencillo.
Agarras un programa le pones unos cuantos retatardos algunas condisiones y ya estubo
Ojala fera asi de sencillo q yo sepa los sistemas criticos siempre estan en asm.
Desde que vi estos avisos e dejado de estudiarlos a profundidad ¡ no c aconseja su uso en reactores nucleares o cualquier sistema critico donde ay vidas en riesgo !

Tus errores de ortografía son para mi TOP1 en este foro!! Jaja

Desde que vi estos avisos e dejado de estudiarlos a profundidad ¡ no c aconseja su uso en reactores nucleares o cualquier sistema critico donde ay vidas en riesgo !

Todo bien pero arduino es para uso hobbista y cuando lo pasas a uso comercial el riesgo es de quien lo emplea y de los recaudos que toma.
Estamos hablando de delay() vs millis() no de ambientes industriales con redundancias de todo tipo y certificaciones.
Dime donde te aceptan un Arduino en un ambiente industrial, sin ir mas lejos, yo nunca pude usar uno en una empresa petrolera, a pesar de que ganaba por mucho las licitaciones y se debe a que no esta ceritificado, pero ese es otro debate.

Pues yo no lo veo tan básico, incluso ya hay PLCs Industriales con Arduino:

Todo depende de la aplicación que se le vaya a dar, pero en uso comercial se puede, tomando las precauciones necesarias y listo.

Si se fue a la luna con un procesador 1 millon de veces menos capaz que los de hoy en día, ahora no vamos a poder hacer cosas robustas y bien hechas con un Atmega y Arduino.

Mi humilde opinión.

El post trata de millis vs delay, no desvirtuemos volviendo al tema de plc con arduino, ya sabemos que se puede hacer, pero no verás ninguna instrucción delay en un PLC. Solo verás temporizadores que vas a programar como para conseguir ese efecto.

El 90% de las consultas de software vienen con el mismo problema: muchas cosas juntas que no funcionan bien porque siempre hay un delay. Pero... ¿Cómo explicamos el funcionamiento de millis?

El primer problema cuando se enfrenta un novato en arduino es que desconoce que es un programa: un conjunto de instrucciones que se ejecutan una detrás de la otra, bifurcaciones, etc. Por lo tanto no llegan a entender muy bien el concepto de loop muchas veces.

Y, por lo tanto, aquí entra el poderoso delay que soluciona sus problemas de aprendizaje muy deprisa, el programa hace lo que queremos, hasta que lo complicamos...

El ejemplo muy claro es el del botón que ya expuso Surbyte, en cuanto tienen que leer un botón... ya falla por todos sitios y vienen a pedir ayuda al foro. No entienden el proceso de loop y usan digitalRead para leer un botón, como cuando pulsan hace cosa raras, le meten un delay y funciona, entonces cuando meten un segundo botón o quieren hacer otra cosa...

En la sección tutoriales, el primer tutorial trata de millis, y es una traducción al español del tutorial de Nick Gammon, que el hombre es una máquina, pero no trata el tema muy bien y la explicación es válida para "programadores avanzados"...

Por ejemplo, este post Riego automatico con RTC al que nadie aun ha respondido. Llevo unos días intentando ver como explicarle, pero si empieza aclarando: "No logré entender cómo funciona la función millis()". El trabajo se complica porque mete un delay de 24 horas...

Si os pongo este código:

unsigned long t;

void setup() {
  pinMode(13,OUTPUT);
}
void loop() {
  if ( millis()-t > 1000 )  {
    digitalWrite(13, !digitalRead(13));
    t = millis();
  }
}

Todos los presentes entendeis en seguida de que se trata, pero un novato...

En mi humilde opinión creo que lo primero que hay que intentar hacer es explicar como funciona loop, y luego introducir el concepto de millis.

PD. Estoy intentando hacer una serie de tutoriales para luego subirlos al foro, pero siempre parto del mismo problema, quiero hacer que se entienda, pero intentando explicar un tema básico, me doy cuenta de que antes debería explicar otros tantos temas muy básicos... Os dejo en el attachment un archivo .zip con un documento .rtf que es el borrador de uno que estoy preparando, en ese veo que tendría que explicar primero: conexiones de botón, entradas/salidas y millis... No es fácil hacerlo...

PD2. 8ram te digo lo mismo que decía un profesor de lengua que tube: "habla lo mal que quieras, pero cuando escribas, hazlo bien", por dios, menos mal que te disculpaste primero...

como leer un boton.zip (37 KB)

Yo creo que se trata de comodidad.
La gente últimamente hace las cosas para sacárselas de encima. Es casi cultural y es global.
Si eres programador lo quieres hacer bien. Te informas de como se hace algo y lo haces. Si no lo eres y solo quieres resolver tu tarea, delay es la solución para ellos. Es fácil, no hay nada que entender.
Si un profesor comienza enseñando con delay como hacer parpadear un led.. listo, eso quedo fijado como fuego. De quien es la responsabilidad, del chancho o de quien le da de comer? Simple respuesta.

Quienes en este foro tienen problemas con delay() pues en general novatos (leer que resalté en general).
Cuántos de estos novatos siguen en el foro? No muchos.
Los que siguen, son y han sido históricamente permeables a aprender nuevas ideas, incluyendo millis().
Al menos eso he visto desde que llegué a este foro y es por eso que afirmo lo anterior.

Hoy la vida me ha dado la posibilidad de adoptar un adolescente de 13 años y justamente estoy luchando con esto mismo, lo fácil vs la manera que a la larga te dará frutos.
Imaginen que elige? Claramente no quiere luchar pero de a poco lo va entendiendo.
Claramente esta en la categoría del novato que sigue en el foro y por lo tanto es receptivo.
Así que supongo que estoy explicando también donde últimamente pongo mi esfuerzo en el foro.

Debemos ver las señales en aquellas personas que tienen interés.
Es fácil detectarlo desde nuestras casas? Claro que no.

Y si te equivocas pensando que no le interesa y pasa lo contrario. Bueno, puede escribir y dirá algo como: he visto que muchos usan millis() y entonces .... ya le tiramos con lo que siempre hacemos.

Toda guia, tutorial sirve @victorjam, asi que hazla como gustes que tendrá buena recepción. También he pensado en lo mismo.