Arduino - Como reemplazar delay por millis. El problema del overflow y la aritmética binaria.

แชร์
ฝัง

ความคิดเห็น • 37

  • @DASSLogic
    @DASSLogic ปีที่แล้ว +1

    Muchas gracias por tu video, y la verdad que mas allá del contenido que es muy bueno, le pones toda la onda!! Nuevo Suscriptor.

  • @uuu2714
    @uuu2714 ปีที่แล้ว

    le agradezco mucho su tiempo pa explicar esta funcion tan necesaria, siga así compare

  • @tegotube
    @tegotube ปีที่แล้ว +1

    Muchas gracias Guillermo por tus videos, son muy didácticos. Entiendo que tampoco habría problema con la comparación dentro del if con la resta si declaramos el intervalo como el tipo: uint16_t que para los valores de intervalo típicos es suficiente y ocupa un poco menos de memoria. Saludos.

  • @santig1399
    @santig1399 3 ปีที่แล้ว

    Hola, Guillermo. Acabo de encontrar tu canal y me parece genial el contenido. Gracias!

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      Hola Santiago! Bienvenido y gracias por pasar y por el comentario.
      Me alegro mucho de que lo encuentres útil.
      Un abrazo!

  • @diegoalbertodiazdiaz5733
    @diegoalbertodiazdiaz5733 2 ปีที่แล้ว

    ¿Cómo que este video no tiene muchas visitas?
    Este video es uns Joya.

    • @guillermogerard
      @guillermogerard  2 ปีที่แล้ว

      Ja ja, Gracias Diego! Me alegro que te guste!

  • @beasty082007
    @beasty082007 3 ปีที่แล้ว +1

    Buenísimo Guille, no tenia idea que se podía hacer algo así... gracias por compartirlo.

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      Grande rab! Venís parejito con los videos 👌 mirá que en los comentarios me hicieron un par de preguntas interesantes que complementan el tema, están buenas para leerlas. Un abrazo

  • @alejandromurillo2174
    @alejandromurillo2174 2 ปีที่แล้ว +1

    Guillermo gracias por tu aporte a la comunidad de programadores, podrías realizar porfa una práctica con motor, teclado y pantalla LCD al mismo tiempo... Gracias Éxitos...😁✔️

    • @guillermogerard
      @guillermogerard  2 ปีที่แล้ว

      Buenas Alejandro! Me alegro que te haya servido y me anoto la sugerencia, me parece que sería bastante útil. Un abrazo!

  • @jmch1369
    @jmch1369 2 ปีที่แล้ว

    Buenisimo ,,Gracias

  • @miguelgentile1333
    @miguelgentile1333 4 ปีที่แล้ว

    Muy buenos tus vídeos!!

    • @guillermogerard
      @guillermogerard  4 ปีที่แล้ว

      Hola Miguel! Gracias por suscribirte, eso me alienta a seguir subiendo este tipo de videos. Me alegro mucho que te hayan gustado. Si te interesa algun tema en particular no tenes mas que sugerirlo y vemos si sale video de eso, un abrazo!

    • @miguelgentile1333
      @miguelgentile1333 4 ปีที่แล้ว

      @@guillermogerard
      Podrías hacer un vídeo de comunicación i2c bien explicado como siempre haces? Gracias

    • @guillermogerard
      @guillermogerard  4 ปีที่แล้ว

      Seguro! Te refieres a los fundamentos teoricos de como funciona el protocolo I2C en general, o a la aplicacion practica, como por ejemplo conectar sensores a un arduino o comunicar 2 arduinos entre si?

    • @miguelgentile1333
      @miguelgentile1333 4 ปีที่แล้ว

      @@guillermogerard si si perfecto ..!! Gracias por contestar!

    • @miguelgentile1333
      @miguelgentile1333 4 ปีที่แล้ว +2

      @@guillermogerard es decir la parte teórica y práctica!!

  • @facundocordero1
    @facundocordero1 4 ปีที่แล้ว

    Muy bueno, claro y didáctico! Gracias! Me sirvió la primera parte porque me preocupaba el rollover ya que mi dispositivo va a quedar funcionando en un lugar alejado y poco accesible. Me quedé a ver lo de aritmética binaria por interés y Platformio no voy a usar xq solo tengo que resolver este proyecto (con una nodeMCU). Me gustaría un video para sincronizar con horario NTP (arg). Gracias!!!

    • @guillermogerard
      @guillermogerard  4 ปีที่แล้ว +1

      Hola Facundo, gracias por tu comentario! Me alegro que te haya servido.
      Con respecto al tiempo con NTP: es muy fácil hacerlo, incluso hay librerías escritas muy fáciles de usar, te dejo ésta como ejemplo para que mires qué sencillo es obtener la hora: github.com/arduino-libraries/NTPClient

  • @adrianal3913
    @adrianal3913 3 ปีที่แล้ว +1

    consulta si yo pongo un una variable unsigned long =40 y otra igual a 30.luego hago 30-40 y le digo q muestre el resultado por serie . me muestra cualquier cosa por q sera no lo hace positivo

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      Buenas Adrian! Me mostras como lo estas sacando por el serie y lo que te muestra? Probablemente sea un problema de formato

    • @adrianal3913
      @adrianal3913 3 ปีที่แล้ว

      @@guillermogerard
      unsigned long primero=30;
      unsigned long segundo=40;
      unsigned long resultado;
      void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      }
      void loop() {
      // put your main code here, to run repeatedly:
      resultado=primero-segundo;
      Serial.println(resultado);
      delay(1000);
      }
      resultado
      4294967286

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว +1

      ​ @Adrian A Recien pude verlo Adrian. Te esta dando el resultado correcto 😁, pero entiendo por qué estas confundido: seguramente vos estabas esperando ver el numero "10" impreso por el serie, pero eso no es correcto. Para que entiendas lo que pasa y la relacion de esto con el video, imaginate que tanto tu variable "primero", como tu variable "segundo" son valores de millis, ok? Entonces, como vos estas calculando primero - segundo, resulta que primero esta representando el tiempo final de millis y segundo seria el tiempo inicial, hasta ahi me imagino que me seguis. Ahora, si tu millis inicial era en este caso 40, y tu valor de millis final es 30, eso quiere decir que en el medio hubo un rollover, ya que millis, cuando vos tomaste el tiempo = 40, siguio contando: 41, 42, 43....hasta llegar a 2^32 (el valor maximo de unsigned long). En ese momento ocurrio el rollover, volvio el contador a 0 y siguio contanto: 1, 2, 3 ... hasta llegar a 30, donde vos tomaste el tiempo final. Cuantos millis pasaron entre esos dos eventos de toma de tiempo? Bueno, pasó todo lo que faltaba desde 40 hasta llegar al maximo (2^32=4294967295) + 30 + 1(por el paso por cero). O sea: 4294967295-40+30+1=4294967286, que es el numero que estas sacando por tu puerto serie 🎊🎉 Espero que se haya entendido, es un poco dificil explicar con palabras (saldria mas facil con un dibujo, obviamente). De todas maneras si no se entendio espero tu proxima pregunta! Un saludo!

    • @adrianal3913
      @adrianal3913 3 ปีที่แล้ว

      @@guillermogerard si si se complica jaj entonces a ver si me queda claro ahi me da el valor correcto por el codigo de arduino dice este esta haciendo una resta y tiene q dar asi. pero cunado hace la comparacion del los millis en el if usa el complemento A2. bueno muchas gracias por responder

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      @@adrianal3913 Si, tanto cuando hace la comparacion en el if como aca en tu ejemplo de la resta esta usando el complemento a 2. La "complicacion" se da cuando usas un tipo de datos sin signo, se entiende?

  • @latabernadelcarpincho
    @latabernadelcarpincho ปีที่แล้ว

    gracias

  • @marlonturciosmolina6946
    @marlonturciosmolina6946 3 ปีที่แล้ว

    🙋🏾‍♂️Guillermo si quiero usar un pin analógico que debo usar
    o utilizo

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      Hola Marlon! Yo siempre prefiero const contra la opción del define, me gusta tener el checkeo de tipos hasta en las constantes. Ninguno de los ocupa memoria del micro, así que usar una constante en este caso es lo mejor. Puro beneficio 😁

  • @Tacho1957
    @Tacho1957 3 ปีที่แล้ว

    Hola Guillermo, antes que nada felicitaciones por los videos, muy interesantes y bien explicados !!!
    Aún así no me queda claro algo: en el min 27 aprox, haces la resta de 7-5 y más adelante 1-7, estos dos números son sin signo (unsigned), pero para hacer la resta necesitas de un bit adicional para el signo, es decir 4 bits, si extrapolamos esto a unsigned long (32 bits) necesitarías un bit 33 para el signo ?, el micro siempre hace la sustracción con signo y luego descarta este bit de signo para el resultado ?
    Gracias por tu tiempo para brindarnos este excelente material y por las respuestas, saludos

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      Hola @Tacho1957, bienvenido y muchas gracias por el comentario! Me siento alagado.
      A ver si te puedo ayudar a clarificar eso porque lo acabo de ver y en el video no quedó tan claro como me parecia cuando lo hice 😁.
      En realidad nunca hay un bit extra, un sistema de 32 bits tiene 32 bits y nada mas. Lo que pasa en realidad es que cuando se usan cantidades con signo, el bit mas significativo se usa como el indicador de signo, y cuando se usa el mismo tipo de datos pero sin signo, se usa como cantidad (bueno, tecnicamente, como se ve en el video, el bit de signo es una cantidad siempre) En el ejemplo super simple que muestro en el video estoy usando un sistema hipotetico que usa 3 bits para representar cierto tipo de datos que se usa para contar, y el mismo tipo se usa cuando hacemos la resta. El hecho de que yo dibuje 4 bits es por claridad, para que se entienda lo que estaba haciendo con los numeros (aunque claramente no lo logré, jajajaja) Ojala se haya entendido un poquito mejor ahora y si no, te espero en la proxima pregunta!

    • @Tacho1957
      @Tacho1957 3 ปีที่แล้ว +1

      @@guillermogerard muchas gracias por la explicación, vos lo explicaste muy bien en el vídeo !!!, soy yo que me cuesta entenderlo 😂
      Entiendo que si tengo 32 bits el bit más significativo es el signo y 31 bits son del valor
      Pero en un caso real, donde el StartTime está al limite del overflow:
      StartTime = 0xffff ffff (32 bits ) y leo
      Millis() = 0 (hizo un rollover o se produjo un overflow)
      el if será:
      If (0+(-4.294.967.295) >= Interval)
      Si represento +4.294.967.295 me alcanza con 32 bits (0xffff ffff), ahora para representar -4.294.967.295 necesito 33 bits: uno para el signo + 32bits para el valor, sería 0x10000 0001 el complemento a 2, que ocupa 33 bits, ahora si efectuó la suma y descarto el bit 33, queda que el tiempo transcurrido es 1, que es coherente con el valor esperado, no se si me explique bien ...
      Muchas gracias por tu respuesta !!!

    • @guillermogerard
      @guillermogerard  3 ปีที่แล้ว

      @@Tacho1957 Jajaja, no, vas bien,vas bien, Exacto, el bit 33 no tiene un lugar para vivir (digamos) o donde estar, asi que se descarta automaticamente. Tu ejemplo esta perfecto 👍👏

  • @Putelquelee
    @Putelquelee 4 ปีที่แล้ว +1

    Que groso. Esas cosas no te las dicen. Tenía un montón de ideas y no sabia como aplicarlas al no saber cómo funciona el temporizador. Gracias. Saludos y a la espera del próximo

    • @guillermogerard
      @guillermogerard  4 ปีที่แล้ว +1

      Grande Hugo! Siempre primero 😆. En este me acordé que tengo que hacer un vídeo de testing en arduino (o cualquiera de las otras plataformas soportadas) usando platformio. Los test son una herramienta muy poderosa y se usan mucho (muchísimo) en desarrollo fuera del mundo de los microcontroladores; pero sin embargo en arduino no se suele ver a menudo