En el caso de hacer con tiempo un anti rebote también tendría que usar millis no? Si usaría delay se pararía la función hora y la función led , no? Es en el minuto 1:10:00 del video
Correcto, en este caso el delay() mataría nuestras otras funciones... Para un antirebote agregaría un tiempoactual3 y una variable auxiliar "rebotando" para saber en que momento está haciendo ruido el botón. Algo así: int lecturaboton = digitalRead(6); if(lecturaboton != lecturaboton_old){ if(lecturaboton == 0 && rebotando == false){ int lecturaled13 = digitalRead(13); digitalWrite(13, !lecturaled13); rebotando = true; } } lecturaboton_old = lecturaboton; if(rebotando == true){ if(millis() >= tiempoactual3 + 200){ tiempoactual3 = millis(); rebotando = false; } } Espero se entienda, me avisas cualquier cosa. Saludos!
@@cefuve gracias voy viendo por partes y practicando avancé bastante desde que arranque lo que más me gusta de los videos es que se ven los errores que uno seguro va a cometer , mil gracias por tanto , una gran vocación de profesor
Hola Anibal, ya encontré el problema... Al parecer Arduino se "pierde" cuando trabaja con variables de distinto tipo, porque la hora la estoy trabajando como int, lo estoy multiplicando por un int, pero el resultado es en long. Por eso hay que avisarle que trabajaremos con long, para ello basta con agregar la letra L después del número para asignarlo como long. Queda algo así: mitiempo = hour*10000L + minute*100 + second; Saludos.
@@cefuve sabes que eso estuve pensando 💭 todo tiene que ser unsignedlong para que no allá conflicto hay un video de un horno eléctrico con un termopar que le pasaba algo similar , que grande profe !!!después te paso el enlace es breve pero es el mismo caso yo lo hice aller pero me daba el mismo error
@@arduindustial2838 Es un desborde de memoria, al multiplicar un int con un int se espera un int, pero en este caso da un long... Solo basta con cambiar la primera multiplicación (de las horas) porque esa se desborda, las demás funcionan impeque.
Hola,un saludo desde España .primero felicitarte por tan buen aporte que haces a personas como yo que siendo aficionados en el tema de la programación nos cuesta demasiado encontrar personas como tú,que entregan su conocimiento de manera tan didáctica y profesional. Llevo muchos meses mirando videeos de uno y otro lado,pero ninguno como tú,.eres el mejor.por eso quiero darte las GRACIAS así en mayúsculas ,eres un krack.un abrazo
Hola Jhon, muchas gracias por tu comentario, ya que así puedo saber si lo estoy haciendo bien o mal y seguir con esta misión, llevar la electrónica a la mayor cantidad de gente posible. Saludos!
Ufff este vídeo debe valer oro, me faltan los tres últimos videos de principiante... Terminadolos me vengo a este, soy nuevo y esa función me dio algunos dólares de cabeza y aún no la domino bien pero se que con tus videos lo lograré
Hola! Muy bueno el video, muy clara la explicación de la función millis. Me sirve para mejorar un controlador de temperatura, que parpadea el display 2 x 16 al mostrar la hora y la temperatura. Respecto a los límites del rango de tiempo, lo resolví transformando ambos límites en segundos de la siguiente forma (hours * 3600 + minutes * 60 + seconds) y que se cumpla la condición si (millis() / 1000) se encuentra entre el minimo y el máximo. De esta forma, no se sale del rango de una variable int y no es necesario "castear" al mezclar variables de distinto tipo. Saludos y gracias!
Saludos profe soy Rubén Espinoza desde Perú,que gran explicación al terminar de ver sus vídeos volveré a repasar el curso . Eres un genio profe mil bendiciones y gracias
Problema resuelto 01:44:00 Este surge al mezclar int con long, ya que hour es int y lo multiplico por un int, pero el resultado sobrepasa la capacidad del int, por ende debemos decirle que al menos uno de ellos es long, por ejemplo: mitiempo = hour*10000L + minute*100 + second; Con la L después de 10.000 le digo a Arduino que la operación contiene un long, por ende el resultado deberá adaptarse a la variable con máxima capacidad (long tiene más capacidad que int), y así muestra el número como corresponde, ya que estaremos trabajando con las variables que corresponden. Otra forma podría ser: mitiempo = hour*pow(10,4) + minute*pow(10,2) + second; O si asignamos todas las variables como long: long hour = 14; long minute = 28; long second = 0; Saludos!
Me fascina la manera en que explicas amigo, he aprendido bastante contigo, muchas gracias por compartir tus conocimientos. Estaría muy bien que hicieras mas videos sobre este tema. Saludos.
Muy buen video, me ha gustado mucho la dinamica de tu video y la alegría con la que lo haces. Aparte, muy buena explicación de los temas, los ejemplos que incluiste. Sin duda un canal que recomendaría.
Excelente video profe!! no sabe cuanto tiempo estuve esperando esta clase!! esperemos por favor que sigan más videos sobre millis en distintas aplicaciones que se le puedan dar, con servos, pulsadores, leds, etc! Muchas gracias!!!
Estoy pensando en hacer algunas secciones para ordenar los videos, una de ellas puede ser "ProgramandoSinDelay" jajaja o algo por el estilo. Gracias por comentar, saludos!
¡Felicitaciones! Tienes una capacidad didáctica innata. Tus clases son muy claras y entretenidas. Aprovechando el tema tratado sobre multitsrea usando Millis, por favor, ¿podrías guiarme un poquito en cómo proceder para hacer un temporizador "Time on delay" y otro "Time of delay" sin que se atasque todo el proceso? Gracias de antemano.
Gracias por tu comentario. Respecto a tu pregunta, preliminarmente probaría con estampar el tiempo al momento de accionar la entrada, algo como: if (in == HIGH && in_old == LOW) { tiempo_actual = millis(); } if (in == HIGH) { if (millis() - tiempo_actual > 5000){ digitalWrite(salida, HIGH); } } else { digitalWrite(salida, LOW); } Me comentas como te va, Saludos!
gran ayuda para entender lo del millis y lo del bool que los tenía un poco atravesados muchas gracias fantástico video, solo eché un poco de menos la buena música de fondo que sueles poner en tus videos al volumen perfecto para que se te oiga con claridad un detallazo que muchos descuidan
Creo que ahora puse más bajo el volumen de la música, seguro con auriculares se escucha... Es un arte ponerle música a los videos jajaja ya lo perfeccionare. Saludos!
Excelente video, hay un módulo RTC (real time clock) para evitar las inexactitudes del cristal de cuarzo de la arduino, tambien lleva una pila para retener la hora y creo que calendario, saludos!
Así es, el módulo que mencionas tiene varias características muy interesantes. En este video ruclips.net/video/tTzIitB9LBw/видео.html enseño a hacer un despertador digital con dicho módulo. Saludos!
Hola buenas tardes Cefuve quisiera decirle que en esta parte 1:41:18 también podría haberlo hecho de la siguiente forma bool mínimo = hour == 13 && minute == 15 && second >= 30; bool máximo = hour == 13 && minute == 16 && second
Hola Martin, el problema con esa forma, es que no puedes establecer rango más largos. Imagina que quiero establecer 1 hora de funcionamiento: mínimo = hour == 13 && minute == 15 && second >= 30; máximo = hour == 14 && minute == 15 && second
Eres muy excelente explicando...solo le sugiero que aumente el tamaño de las letras en los videos ya que mucha gente los ve desde el celular y ya también muchos ya no vemos mucho
Hola, el return se usa principalmente para devolver un valor desde una función, se puede usar dentro de un if... No se a que te refieres con cerrar el loop. Si tienes un if dentro del loop que ejecuta el return sin devolver valor, el flujo de ejecución se irá al principio del loop. Saludos!
Hola. Sigo incondionalmente tus vídeos. No solo se aprende, sinó que quieres más. Una pregunta: ¿como calculamos que condensador poner para evitar rebotes?
Hola, gracias por verlos. Con respecto a tu pregunta, no tengo una fórmula, solo te recomiendo probar con condensadores entre 10nF y 100nF, a mayor valor, más lenta es la reacción. Saludos.
Los baudios es la velocidad a la que se transmiten los datos mediante comunicación serial. La velocidad con que se imprime en monitor serie dependerá de cómo está estructurado tu código.
hola buenas me gusto el concepto del vídeo. y es como mencionas si copio y pego no se aprende. estoy con un proyecto de un invernadero inteligente. que tus conocimientos lo pueden sacar adelante. la verdad no estoy a la altura del proyecto y me lo planteo un amigo con su necesidad. y yo con gusto me brindo para lo que se necesites.
Hola Lucas, gracias por comentar. Al final del comentario no terminé de entender tu intención... Pero puedo decirte que con perseverancia se pueden lograr muchas cosas!! así que te motivo a seguir practicando, que no te darás cuenta cuando logres hacer tus propios códigos. Saludos!
@@cefuve hola buenas otra vez. Sabes que en el anterior video ví algo que me va ayudar mejor. Y es lo de dejar el loop limpio. Y que cada Voi haga la instrucción. De igual manera te escribí a tu página personal para cotizar.
La utilización de funciones personalizadas, no? Es un buen recurso para ordenar el código, hay que intentar no abusar mucho de esa técnica... En la tarde pretendo darme un tiempo para revisar todas mis redes, saludos!
@@cefuve hola saludos, quiero que active 1 pulsador el servo a 90grados, luego que suelte el pulsador un tiempo después desactive el servo y vuelva a 0grados
@@cefuve como ese eso de flancos de subida y de bajada, no soy diestro en esto y solo quiero hacer esta especificación del servo para poder pasar la mayeria
Existe algun programa para arduino que haga depuración, así tipo como lo hace el visual studio,?? para ver como se comportan las variables línea por línea
Hola , gracias por el aporte que hacés. Si quiero activar una salida por 15 minutos Y luego apague mientras sigo leyendo temperatura o una entrada analógica cómo puedo armar ese temporizador?
Hola Ronaldo, puedes usar esta técnica, con millis, o la de mi otro video, usando delay. Principalmente estableces una variable de conteo y un tiempo fijo, que por cada pasada, aumente en 1 el conteo. Así, pasado cierto conteo, sabrás cuanto tiempo ha pasado y podrás condicionarlo con un if. Saludos!
Excelente video. Muchas gracias por explicar en profundidad. Prodras darme una ayuda, para usar 10 botones y 10 led. Cada botón encenderá o apagará un led por separado (botón 1 corresponde a led ,1, botón 2 a led 2, etc). Además estos led deben prender y apagar de manera intermitente hasta que sean apagados. Si tenés algún vídeo que pueda orientarme te agradecería enormemente. Saludos y muchas gracias.
Hola Nicolas, el video anterior a este es la forma más simple: multitasking usando delay. Y apoyarse con variables auxiliares para activar/desactivar párpados. Algo como... count = 0 blink1 = false LOOP: if (boton1 == 1){ blink1 = !blink1 } delay(10) count++ if (count > 10){ count = 0 if (blink1 == true) digitalWrite(pin, !digitalRead(pin)) } }
@@cefuve muchas gracias por responder. perfecto lo pondré en practica (no sabia que con blink hacia el parpadeo). Estoy viendo un video que explicas acerca de los pulsadores. son excelentes tus videos. nuevamente muchas gracias, saludos desde argentina.
No hay de que Nicolas. blink es el nombre de la variable solamente, el parpadeo lo hace todo el conjunto del código que te envié... Hay un video de la sección #coding donde simulo la operación de una impresora, si no me equivoco ahí hice parpadear un led de forma similar. Saludos!
Te hago una consulta en este video, ya que no he encotrado uno en el que trates el tema, y si lo tienes, me interesaría acceder: tipo de datos struct, arrays de struct y punteros. Otro tema que también me interesaría es guardar estados en eeprom, para recuperar el estado del programa ante cortes de energía eléctrica. Saludos y gracias!
Hola Cesar, tengo una duda , cuando se realiza un reloj y abres el monitor serie siempre empieza a contar desde la hora que tengo puesta en las variables, ¿hay alguna manera de cuando abra el monitor serie vea el reloj en tiempo real, que no sea en un display o similar? Gracias.
Hola Manuel, se podría hacer eso, pero necesitarías un módulo extra RTC... Lo otro sería usar la macros __TIME__, que toma la hora actual del sistema ¡al momento de compilar! Prueba este código: String tiempo = __TIME__; int s = tiempo.substring(6).toInt(); int m = tiempo.substring(3, 5).toInt(); int h = tiempo.substring(0, 2).toInt(); Serial.println(tiempo); Serial.println(h); Serial.println(m); Serial.println(s); Saludos!
PROBLEMA hago exactamente lo mismo que explicas en el minuto 33:40 pero el count no me devuelve números, sino que me imprime count cada "tiempoactual+1000", uso la misma placa. agradecería un aporte. excelente tus videos!!!!
Te felicito por tu manera de explicar, eres muy didactico. Como haría Yo para colocarle a un secuencia de 5 led lo siguiente: Al primer Led 5 minutos prendido, al segundo Led 4 minutos, al tercer Led 3 minutos, al cuarto Led 2 minutos y al 5 Led 1 minuto? y listo... Que haga solo eso cada vez que Yo reinicie el Arduino.
Gracias Eddy, como le veo yo, se podría hacer con simples delay... En el setup los estableces todos como salidas e inmediatamente después los enciendes todos, luego en el loop los vas apagando uno por uno: delay(60000); digitalWrite(led5, LOW); delay(120000); digitalWrite(led4, LOW); delay(180000); digitalWrite(led3, LOW); delay(240000); digitalWrite(led2, LOW); delay(300000); digitalWrite(led1, LOW); Saludos!
@@cefuve Muchas gracias mi hermano, Yo pense que había una manera de colocar minutos en vez de segundos... Era por si les queria dar mucho más tiempo, por ejemplo 15 minutos a uno de ellos, eso es para Yo hacer un juego de luches en el en el jardín que tengo en el patio de mi casa, y que se enciandan cada cierto tiempo, y me cambie los colores de los reflectores que estoy colocando en mi jardín... jejeje, Lo voy a probar... Comence ayer a ver tus videos, y mi parecer creo que son los mas claros de muchos que he visto en la Red... Muy amable por responder.
Se podría simplificar haciendo la operación matemática dentro de los paréntesis: delay(15 x 60 x 1000); donde 60x1000 significa 1 minuto, y el 15 se va modificando dependiendo de los minutos que se requieran. Importante mencionar, que todo tiene su límite cuando hablamos de número en microcontroladores, en este caso, para la función delay, se especifica que el tipo de variable es unsigned long. www.arduino.cc/en/reference/delay Esa variable almacena desde el 0 al 4294967295, por lo que podríamos hacer delay de aproximadamente 49 días... Saludos!
Hola profe gracias por tus videos muy buenos, la explicación super me podrías orientar para realizar un semáforo con millis o Multitasking pero estoy atorado en como aplicarlo
Hola Rene, para que no te calientes la cabeza, dentro del millis realiza un contador y luego le pones condiciones a la cuenta. Si el contador está entre 0 y 5 que se encienda la luz verde. Si el contador está entre 6 y 7 que se encienda la luz amarilla. Si el contador está entre 8 y 15 que se encienda la luz rojo. Luego pones un if que reinicie el contador al pasar de 15. Saludos!
Hola, justo en el último video "solución: funciones de mantenimiento impresora" muestro como reconocer entre flanco de subida y flanco de bajado... Básicamente uso una variable auxiliar para guardar el estado anterior de la lectura y compararla con la lectura actual: if ( lectura_actual != lectura_anterior ) { if ( lectura_actual == 0 ) { //flanco de bajada } if ( lectura_actual == 1 ) { //flanco de subida } } //Si es el estado de reposo es 1 Saludos!
Hola me parece el video muy bueno, pero me gustaría que cuando es una unidad de horas, segundos y minutos aparecería 01 y no 1 y ademas que podría aparecer el reloj como tal no imprimiendo la hora cada segundo y si se podría en una pantalla digital seria la pera. Muchas gracias eres un fenómeno, me tendré que ver el video mas de una vez para aprender un poco. Gracias otra vez
Hola Juan, para que aparezcan los ceros, sería así: if(hour < 10) Serial.print("0"); Serial.print(hour); Serial.print(":"); if(minute < 10) Serial.print("0"); Serial.print(minute); Serial.print(":"); if(second < 10) Serial.print("0"); Serial.println(second); Se podría adaptar perfectamente a cualquier pantalla, mas o menos, de la misma forma. Saludos!
Hola Jhon, en el tiempo 1:21:21 lo tengo de esa forma... ah, te refieres a usar OR? con los slash / algo así como: hour == 13 || minute == 15 || second >= 30 Gracias por comentar, saludos!
Hola, primero no debes usar un for, debes aprovechar el loop en conjunto con una variable contadora y un if para condicional el rango. int x = 4; void loop(){ if(digitalRead(pin) == LOW){ //boton x = 0; //inicialización del for } if( x < 4 ){ //condición del for x++; //iteración del for //se ejecuta 3 veces después de presionar el botón } }
Hola cesar espero que te estés cuidando estuve trabajando en este proyecto el cual convertí en un cuenta horas para las máquinas y conseguí un módulo eeprom externo para probar !! Feliz hasta que me di cuenta que no usa la misma librería que la eeprom interna 🤔, ahora viene la pregunta :usaste estas eeprom ? Podrás orientarme para poder grabar y leer ?
Hola Anibal, como es eso de cuenta horas para las máquinas, algo como tiempo de operación de una máquina? Que eeprom estás usando? Hay un montón de opciones, comunicación paralela, I2C, SPI, RS232, etc... Saludos!
@@cefuve Es un cuenta horas así cuando llega a un valor predeterminado imprima un mensaje “precisa servicio” en un auxiliar del contactor de marcha del motor principal hago accionar lo que simuló con el pulsador . Se calcula 600hs de vida del aceite y la idea que a las 1800 mande otro mensaje de cambio de filtro separador de aceite .Para eso es indispensable que la información se grabe cada minuto por si se interrumpe la energía , el módulo es At24c08 trabaja con I2c pero no usa la librería eeprom.
@@cefuve hola cesar acá en un vídeo explican en italiano la forma de grabar la memoria; y si la graba (lo trascribí y probé) lleva un montón de código y tiene un delay pequeño que creo que no va a interferir. La idea seria, por ejemplo: Empieza a funcionar la maquina, corre el tiempo y cada 1min graba en los primeros 4 espacios la hora .En los en el 5° y 6°espacio los min ;para que en el caso de corte de suministro o al finalizar el día se apague el equipo guarde la cuenta para poder seguir el día siguiente . Luego grabaría el 7°,8°,9°.10°para la hora y así sucesivamente. el tema es que no me quedo claro como cambiar las posiciones creo que como esta el código siempre graba en la posición 0 . Quedo en espera cuando tengas un tiempo lo veas; HAY POCOS VÍDEOS QUE EXPLIQUEN EN DETALLE . Desde ya gracias por la paciencia y la dedicación para explicar !!! #include #define disk1 0x50 int hora=24; int minutos=54; void setup() { Serial.begin(9600); Wire.begin();
unsigned int addr=1; Serial.println("funciona la eeprom"); writeEEPROM(disk1, addr,minutos); int n=readEEPROM(disk1,addr); Serial.println(n); } void loop() {} void writeEEPROM(int i2caddr,unsigned int maddr, byte data){ Wire.beginTransmission(i2caddr); Wire.write((int)(maddr>>8)); Wire.write((int)(maddr&0xFF)); Wire.write(data); Wire.endTransmission(); delay(5); } byte readEEPROM(int i2caddr,unsigned int maddr){ Wire.beginTransmission(i2caddr); Wire.write((int)(maddr>>8)); Wire.write((int)(maddr&0xFF)); Wire.endTransmission(); Wire.requestFrom(i2caddr,1); byte rdata=1; if(Wire.available()){ rdata=Wire.read(); } return rdata; }
Hola Anibal, disculpa la demora. Aquí hay que tener muy en cuenta la forma de organización de la memoria y el tamaño de los tipos de variables. La memoria guarda de a 8 bits por dirección, algo como: dir = data 0 = 00000000 1 = 00000000 2 = 00000000 3 = 00000000 En el caso del reloj, trabajamos con números que se pueden almacenar perfectamente en 8 bits, así puedes guardar cada dato en cada dirección, ejemplo: Guardar hora inicio 08:30:15 writeEEPROM(disk1, 0, horas); writeEEPROM(disk1, 1, minutos); writeEEPROM(disk1, 2, segundos); Quedaría algo así: dir = data 0 = 00001000 (8) 1 = 00011110 (30) 2 = 00001111 (15) 3 = 00000000 Después lees de la siguiente forma: byte data1 = readEEPROM(disk1, 0); byte data2 = readEEPROM(disk1, 1); byte data3 = readEEPROM(disk1, 2); Saludos!
Una pregunta, quizás sin mucho sentido: Si el tipo de variable "unigned long" tiene un valor máximo de 32 bits, si se tiene un proyecto funcionando de forma indefinida y se usa la función "millis", en algún momento esa variable se desbordará. ¿que pasa en ese momento? ¿vuelve a tener el valor =0? ¿Como afectaria en ese caso al proyecto?
Es una muy buena pregunta Fermin, respuesta rápida, vuelve a 0. Respuesta larga, te pego la respuesta que di en otro de mis videos... Hagamos el ejercicio de que llegamos al desborde. 1 s = 1.000 milis 1 minuto = 60.000 milis 1 hora = 3.600.000 milis 1 día = 86.400.000 milis (unsigned long = 4.294.967.295) Por ende, en 49 días tendrémos la variable en: 4.233.600.000 En 49 días y 17 horas estará en: 4.294.800.000 En 49 días, 17 horas y 2 minutos estará en: 4.294.920.000 En 49 días, 17 horas, 2 minutos y 47 segundos estará en: 4.294.967.000 Entonces, analicemos el código en el borde de la variable... if(millis() >= tiempo_actual + 1000){ tiempo_actual = millis(); } - En 49 días, 17 horas, 2 minutos y 47 segundos if(millis() >= tiempo_actual + 1000){ tiempo_actual = 4.294.967.000; } - En 49 días, 17 horas, 2 minutos y 48 segundos if(millis() >= 4.294.967.000 + 1000){ //la suma desborda a tiempo_actual //quedando la condición (millis() >= 705) //y como millis también se desborda, //después entrará nuevamente al if tiempo_actual = 705; }
@@cefuve Gracias Cesar, con la explicación de cómo quedaría el desborde ha quedado muy claro con el funcionamiento. Es una forma de comprobar cuando se produce el desbordamiento en un proyecto de larga duración y que pueda darse esa situación.
tengo una idea con una banda vhf (118-136 mhz) para recibir señales PTT al Rpi, luego use Rpi para controlar un tablero de relés que controla algunas luces. tengo un codigo pero tengo la variable previousMillis y una variable llamada timeLastPush y no se bien ¿Dónde se actualizan? y ¿Dónde se usan? //constant value which will not change: const int PTT = 6; const int REL1 = 2; const int REL2 = 3; const int REL3 = 4; const int REL4 = 5; intervalo largo sin signo = 600000UL; // intervalo en el que apagar un relé //valores que cambiarán: int PTTState = 0; int PTTPushCounter = 0; int últimoestadoPTTS = 0; unsigned largo anteriorMillis = 0; // almacenará la última vez que se actualizó un relé. actualMillis largo sin signo = 0; unsigned long timeLastPush = 0; //Milisek. desde la última vez que se presionó PTT .. sin firmar long timeOutPTT = 10000; // Tiempo de espera en milisegundos DFRobot_LCD lcd(16,2); // Tipo de pantalla LCD configurada 16 caracteres y 2 líneas. void setup() { // inicializando lcd lcd.init(); // inicia el puerto serie para LCD Serial.begin(9600); Serial.println("PTT LISTO"); lcd.setCursor(0,0); //Configuración de pines conectados por el esquema pinMode(PTT,INPUT); pinMode(REL1, SALIDA); pinMode(REL2, SALIDA); pinMode(REL3, SALIDA); pinMode(REL4, SALIDA); Serial.begin(9600); Serial.println("PTT LISTO"); } void loop() { // leer el pin de entrada PTT: PTTState = digitalRead(PTT); // compara el PTTState con su estado anterior if (PTTState != lastPTTState && lastPTTState == 0) { //Si cambió el estado del PTT AND lastPTTState = 0, if ((millis() - timeLastPush) > timeOutPTT ) { //If timeout -límite para PTT alcanzado: timeLastPush = millis(); //Establece el inicio del nuevo contador de tiempo ahora, PTTPushCounter = 0; //Establece el contador PTT en 0. } // si el estado ha cambiado, incrementa el contador if (PTTState == HIGH) { // si el estado actual es HIGH, entonces el PTT pasó de desactivado a activado: PTTPushCounter++; Serial.println("PTT EMPUJADO"); Serial.print("NÚMERO DE PULSACIONES DE PTT: "); Serial.println(PTTPushCounter); } } // Retrasa un poco para evitar rebotes delay(50); // guarda el estado actual como el último estado, para la próxima vez que pase por el ciclo lastPTTState = PTTState; if (PTTPushCounter %4 == 3) { lcd.clear(); lcd.setCursor(3,0); lcd.print("RELÉ 1 ENCENDIDO!"); escritura digital (REL1, ALTA); }
si (PTTPushCounter %6== 5) { lcd.clear(); lcd.setCursor(3,0); lcd.print("RELÉ 2 ENCENDIDO!"); escritura digital (REL2, ALTO); } if (PTTPushCounter %8== 7) { lcd.clear(); lcd.setCursor(3,0); lcd.print("RELÉ 3 ENCENDIDO!"); escritura digital (REL3, ALTA); } si (PTTPushCounter %10== 9) { lcd.clear(); lcd.setCursor(3,0); lcd.print("RELÉ 4 ENCENDIDO!"); escritura digital (REL4, ALTO); } actualMillis=millis(); if ((currentMillis - previousMillis) >= intervalo) { // guarda la última vez que encendimos/apagamos el relé lcd.clear(); lcd.setCursor(0,0); lcd.print("¡TODOS LOS RELÉS APAGADOS!"); escritura digital (REL1, BAJO); escritura digital (REL2, BAJO); escritura digital (REL3, BAJO); escritura digital (REL4, BAJO);
Hola Agustin, según tu código, el timeLastPush se usa para timeout (se agotó el tiempo), que si después de un tiempo, no se recibe nueva info, se reseteo el contador. if (PTTState != lastPTTState && lastPTTState == 0) { if ((millis() - timeLastPush) > timeOutPTT ) { timeLastPush = millis(); PTTPushCounter = 0; } Y la variable previousMillis es un "delay" que ejecuta instrucciones cada cierto tiempo (lo que manda la variable intervalo). Es otra forma de hacer lo que explico en el video. if ((currentMillis - previousMillis) >= intervalo) { lcd.clear(); lcd.setCursor(0,0); lcd.print("¡TODOS LOS RELÉS APAGADOS!"); escritura digital (REL1, BAJO); escritura digital (REL2, BAJO); escritura digital (REL3, BAJO); escritura digital (REL4, BAJO); anteriorMillis = millis(); Serial.println(anteriorMillis); } Saludos.
Excelente video. Creo que el problema que tienes con la lógica es este: Tu creaste las condiciones de inicio y final bien pero trabajaste con el negado. Prueba si no fue según entendí, que si el negado y el final eran falsos es que se te cumple. Sino creo que escribiste el negado del "o" y es la suma de fe cada negado. Gracias :)
@@elturco7367 Eso quedaría como una NAND, que lo probé antes... Incluso más adelante en el video me apareció otro problema, por eso terminé usando otra estrategia totalmente distinta. Mira, si se niegan individualmente, queda: if( !minimo || !maximo ) Y si aplicamos el teorema de De Morgan, nos queda como una multiplicación negada: if( !(minimo && maximo) ) Saludos.
hola profe eres seco, me sirvió bastante su video en un proyecto que estoy diseñando con arduino. Soy programador de PLC y necesitaba saber de la multitarea en arduino la verdad que cada minuto de su video vale la pena verlo, hay proyectos pequeños que no amerita el uso de un PLC, tomare un cursito de arduino, eso si le falta mas practica con las compuertas lógicas jajajaj saludos profe desde concepción.
Hola César, te dejo invitado a ver mi curso de Arduino en youtube, es básico pero da una base firme para seguir avanzando. Se me corrio la lógica mientras explicaba?? A veces la cabeza me hace cortocircuito jajajajaja. Saludos al gran Concepción!
Hola cesar porque cuando lo multiplicaste por 10000 daba ese error? Y si en 100000 funciono , y en el caso de los minutos sobra un cero ósea tendría que ser por 100 en vez de mil ? Me encariñe un poco en el error que tiraba cuando multiplicas la hora por 10000
Como viste en el video, quedé "plop", y para no quedarme pegado lo dejé con 100.000... Pero hay algo que no debo estar viendo, a ti te da el mismo error?
@@cefuve hoy vi la facción de video mañana lo practico y te cuento cómo resulto esta muy bueno pasarlo a número entero ya que se podría grabar en una eeprom externa por ejemplo en la fabricación de un horometro para alguna máquina ! Pero quede desconcertado con ese error mañana te cuento cómo me fue
Siii, en la desesperación se me vino esa idea (después de alguna horas jaja) y la verdad, tiene bastante potencial... En cuanto tenga tiempo probaré de nuevo el código, pero aislado, a ver que pasa. Y esperaré tu retroalimentación, Saludos!
loopX: for (int i = 0; i < alarm; i++) { digitalWrite(buzzerCtl, HIGH); digitalWrite(ledBuiltIn, HIGH); delay(500); digitalWrite(buzzerCtl, LOW); digitalWrite(ledBuiltIn, LOW); delay(500); } delay(1000); goto loopX; } buenas amigo como haria para agreagar el tiempo de retardo con milli().
Hola Jorge, no es llegar y meter millis en un código, se debe plantear desde cero el problema, para generar el algoritmo necesario ¿Qué se supone que hace esa sección de código? p.d: No te recomiendo usar goto en lenguajes de alto nivel...
hay lcd sensor de temperatura ,sensor de bateria, feedback,timer es un spwm que ido modificando funciona pero quiero meter un sensor de corriente pero en el void loop se queda como parado en la lcd pero mido las salidas y parece funcionas pero con retraso .
esa parte hace que cuando se activa la alrma por alguno de los sensores enciende los led y activa el buzer sin fin hasta que lo reinicie y tambien apaga el spwm
Por lo que entiendo, quieres que la alarma y el led enciendan y apaguen indefinidamente. La forma rápida de hacerlo con millis sería algo como: if(millis() - tiempoactual > 500){ tiempoactual = millis(); digitalWrite(buzzerCtl, !digitalRead(buzzerCtl)); digitalWrite(ledBuiltIn, !digitalRead(ledBuiltIn)); } Saludos!
Por favor necesito de tu ayuda :c ...Cómo podría hacer un ciclo for pero con millis? Sé que en teoría no se podría pero quiero tratar que al entrar a un if, el código se ejecute x número de veces y luego salga de este, continuando así con el código, soy muy novato en muchas cosas pero estoy tratando de implementar millis en mis códigos pero no sé cómo hacer que se ejecute una cierta cantidad de veces y luego deje hacerlo hasta que se le vuelva a ordenar :( , cualquier ayuda estaría más que agradecido, Muchas gracias por tus vídeos me han motivado bastante a continuar con Arduino!🔥✨
Hola, no entiendo muy bien lo que necesitas, porque no le encuentro sentido a hacer un for con millis... Si que se puede hacer un for con if, sería algo así: x = 10; en el loop: if(x > 0){ //se repite hasta que x sea 0 x = x - 1; } Después para entrar de nuevo, solo debes asignar el número de repeticiones a la variable x. Saludos!
@@arturovilla5441 te refieres a un variador de velocidad para motor mediante pwm? y que se pueda modificar el valor de pwm con un potenciometro? A no ser que quieras una frecuencia de pwm especial, no tiene sentido usar millis ya que hay una función especial para generar pwm (analogWrite). Saludos.
No me explique bien, tu teoría es que este encendido cuando las dos se cumplan 1:21 (te complicas) si pones una para encender (se mantiene encendido hasta que le digas lo contrario) y después la otra hora para apagar con == así cuando llegue a esa hora exacta hace el cambio, nada de ≤= ni ≥=
@@jorgenavarro3473 Aaah si, me compliqué entero, pero al final del video usé otra técnica que me dio los resultados esperados (01:42:06). De eso se trata el video, de prueba y error, saludos!
hola profe yo se que tiene que hacer cosas y que posible mente desconfié de mi al ser un extraño, pero quiero crear un grupo en DISCORD de Arduino español ya que no hay o no he encontrado aun, entonces quiero que me ayude con ese sueño. y si le interesa la idea me puede escribir ( memio Andrium#3318 ) ahí le dejo mi usuario si me quiere buscar
Hola, había escuchado hablar de discord, pero hasta ahora no me había decantado por probarlo, se ve bastante interesante, sobre todo la interfaz... Había pensado en algún momento, hacer un foro en mi página web, pero como bien dices, el tiempo es el que falta. Por ahora no está en mis planes generar comunidad en dicha plataforma, pero me hice una cuenta por si haces un grupo y me quieres invitar!! cefuve_electronics#2440 Saludos!
@@cefuve hola compa, claro con mucho gusto estará las puertas abiertas, y si sabes de otras personas que sepan de arduino y me quieran ayudar con todo gusto los recibo con las manos abiertas y que tengas linda tarde
En el caso de hacer con tiempo un anti rebote también tendría que usar millis no? Si usaría delay se pararía la función hora y la función led , no? Es en el minuto 1:10:00 del video
Correcto, en este caso el delay() mataría nuestras otras funciones... Para un antirebote agregaría un tiempoactual3 y una variable auxiliar "rebotando" para saber en que momento está haciendo ruido el botón. Algo así:
int lecturaboton = digitalRead(6);
if(lecturaboton != lecturaboton_old){
if(lecturaboton == 0 && rebotando == false){
int lecturaled13 = digitalRead(13);
digitalWrite(13, !lecturaled13);
rebotando = true;
}
}
lecturaboton_old = lecturaboton;
if(rebotando == true){
if(millis() >= tiempoactual3 + 200){
tiempoactual3 = millis();
rebotando = false;
}
}
Espero se entienda, me avisas cualquier cosa.
Saludos!
@@cefuve gracias voy viendo por partes y practicando avancé bastante desde que arranque lo que más me gusta de los videos es que se ven los errores que uno seguro va a cometer , mil gracias por tanto , una gran vocación de profesor
Hola Anibal, ya encontré el problema... Al parecer Arduino se "pierde" cuando trabaja con variables de distinto tipo, porque la hora la estoy trabajando como int, lo estoy multiplicando por un int, pero el resultado es en long. Por eso hay que avisarle que trabajaremos con long, para ello basta con agregar la letra L después del número para asignarlo como long.
Queda algo así:
mitiempo = hour*10000L + minute*100 + second;
Saludos.
@@cefuve sabes que eso estuve pensando 💭 todo tiene que ser unsignedlong para que no allá conflicto hay un video de un horno eléctrico con un termopar que le pasaba algo similar , que grande profe !!!después te paso el enlace es breve pero es el mismo caso yo lo hice aller pero me daba el mismo error
@@arduindustial2838 Es un desborde de memoria, al multiplicar un int con un int se espera un int, pero en este caso da un long... Solo basta con cambiar la primera multiplicación (de las horas) porque esa se desborda, las demás funcionan impeque.
Hola,un saludo desde España .primero felicitarte por tan buen aporte que haces a personas como yo que siendo aficionados en el tema de la programación nos cuesta demasiado encontrar personas como tú,que entregan su conocimiento de manera tan didáctica y profesional. Llevo muchos meses mirando videeos de uno y otro lado,pero ninguno como tú,.eres el mejor.por eso quiero darte las GRACIAS así en mayúsculas ,eres un krack.un abrazo
Hola Jhon, muchas gracias por tu comentario, ya que así puedo saber si lo estoy haciendo bien o mal y seguir con esta misión, llevar la electrónica a la mayor cantidad de gente posible.
Saludos!
No entiendo como no tienes más suscriptores. Eres el profesor perfecto que estaba buscando. Sigue así por favor!!!
Muchas gracias Luis, saludos!
Ufff este vídeo debe valer oro, me faltan los tres últimos videos de principiante... Terminadolos me vengo a este, soy nuevo y esa función me dio algunos dólares de cabeza y aún no la domino bien pero se que con tus videos lo lograré
Apenas ando viendo aplicación de matrices, este video me aclaro dudas en cuanto al tema.
Oro molido esté video, me gusto tanto que me lo descargue y es la segunda vez que lo veo.
Excelente clase !!! lo importante es que esta súper detallado , mil gracias por tanto !!!
Genial! Gracias por comentar, saludos.
Hola! Muy bueno el video, muy clara la explicación de la función millis. Me sirve para mejorar un controlador de temperatura, que parpadea el display 2 x 16 al mostrar la hora y la temperatura. Respecto a los límites del rango de tiempo, lo resolví transformando ambos límites en segundos de la siguiente forma (hours * 3600 + minutes * 60 + seconds) y que se cumpla la condición si (millis() / 1000) se encuentra entre el minimo y el máximo. De esta forma, no se sale del rango de una variable int y no es necesario "castear" al mezclar variables de distinto tipo. Saludos y gracias!
Hola Jorge, gracias a ti por compartir tu solución y aportar al canal, excelente idea. Saludos!
El mejor canal de enseñanza sobre Arduino. Muchas gracias por tus explicaciones tan claras!!
Gracias por tu comentario, Gustavo. Saludos!
Saludos profe soy Rubén Espinoza desde Perú,que gran explicación al terminar de ver sus vídeos volveré a repasar el curso . Eres un genio profe mil bendiciones y gracias
Muchas gracias Rubén, un gran saludo!
waooo, estaba leyendo sobre los microncontroladores AVR y llegue aqui y waoo bro en serio buena explicacion, sin darme cuenta me vi las dos horas :D
Muchas gracias por tu comentario y muchas gracias por ver el video completo :O
Saludos!
Sus videos me han ayudado en algoritmos en pseint gracias por compartir conocimiento
Catedra MAGISTRAL
¡ Muchas gracias !
Muy claro, didactico, y de gran ayuda. Muchas gracias !
Problema resuelto 01:44:00
Este surge al mezclar int con long, ya que hour es int y lo multiplico por un int, pero el resultado sobrepasa la capacidad del int, por ende debemos decirle que al menos uno de ellos es long, por ejemplo:
mitiempo = hour*10000L + minute*100 + second;
Con la L después de 10.000 le digo a Arduino que la operación contiene un long, por ende el resultado deberá adaptarse a la variable con máxima capacidad (long tiene más capacidad que int), y así muestra el número como corresponde, ya que estaremos trabajando con las variables que corresponden.
Otra forma podría ser:
mitiempo = hour*pow(10,4) + minute*pow(10,2) + second;
O si asignamos todas las variables como long:
long hour = 14;
long minute = 28;
long second = 0;
Saludos!
Me fascina la manera en que explicas amigo, he aprendido bastante contigo, muchas gracias por compartir tus conocimientos. Estaría muy bien que hicieras mas videos sobre este tema.
Saludos.
Gracias Carlos, se vendrán más videos... Saludos!
muy bueno.... estos son los videos que valen la pena ver
Valió la pena la desvelada con este magnífico video! Saludos Desde Pátzcuaro México y a darle!!!
Como siempre,Un !! Lujo de explicación !! Muchas gracias por compartir tus conocimientos.
Muchas gracias! saludos.
Muy buen video, me ha gustado mucho la dinamica de tu video y la alegría con la que lo haces. Aparte, muy buena explicación de los temas, los ejemplos que incluiste. Sin duda un canal que recomendaría.
Muchas gracias Leonardo, saludos!
Los vídeos que subes son lo máximo. saludos desde Arequipa-Perú.
Muchas gracias, saludos!
Muy buena la explicación, muy muy wena!... saludos de Paraguay
Wena Nelson jaja saludos!
Excelente video profe!! no sabe cuanto tiempo estuve esperando esta clase!! esperemos por favor que sigan más videos sobre millis en distintas aplicaciones que se le puedan dar, con servos, pulsadores, leds, etc! Muchas gracias!!!
Estoy pensando en hacer algunas secciones para ordenar los videos, una de ellas puede ser "ProgramandoSinDelay" jajaja o algo por el estilo.
Gracias por comentar, saludos!
@@cefuve Muchísimas gracias!! lo estaré esperando :)!!
Genial tu manera de enseñar muchas gracias por tu video, saludos!!
Muchas gracias, saludos!
Muy bien explicado y con buenos ejemplos le felicito y le mando saludos des de Marruecos 😉
Muchas gracias Amrani, Saludos!
Que don para explicar genio..
Master, genial curso 😎👍👍👍
Muy buen video, impecable y amena explicacion siempre, son mi referencia para mis programas.
Genial Simon, gracias por comentar, saludos!
sentí el viento de la rosa de la guadalupe y supe que Cefuve habia subido video! xD gracias profe!
Ponga la florcita en agua jajajaj (aparece una flor, no?)
Gracias profe ! Excelente como siempre !
Saludos Carlos!
Eres un crack!! y todo muy bien explicado, suscrito.
Muchas gracias Samuel, saludos!
Biiienn. Excelente.
¡Felicitaciones!
Tienes una capacidad didáctica innata.
Tus clases son muy claras y entretenidas.
Aprovechando el tema tratado sobre multitsrea usando Millis, por favor, ¿podrías guiarme un poquito en cómo proceder para hacer un temporizador "Time on delay" y otro "Time of delay" sin que se atasque todo el proceso?
Gracias de antemano.
Gracias por tu comentario. Respecto a tu pregunta, preliminarmente probaría con estampar el tiempo al momento de accionar la entrada, algo como:
if (in == HIGH && in_old == LOW) {
tiempo_actual = millis();
}
if (in == HIGH) {
if (millis() - tiempo_actual > 5000){
digitalWrite(salida, HIGH);
}
} else {
digitalWrite(salida, LOW);
}
Me comentas como te va,
Saludos!
Muchas gracias por responder.
Apenas lo pruebe te comento.
Gracias nuevamente.
gran ayuda para entender lo del millis y lo del bool que los tenía un poco atravesados muchas gracias fantástico video, solo eché un poco de menos la buena música de fondo que sueles poner en tus videos al volumen perfecto para que se te oiga con claridad un detallazo que muchos descuidan
Creo que ahora puse más bajo el volumen de la música, seguro con auriculares se escucha... Es un arte ponerle música a los videos jajaja ya lo perfeccionare. Saludos!
Excelente video, hay un módulo RTC (real time clock) para evitar las inexactitudes del cristal de cuarzo de la arduino, tambien lleva una pila para retener la hora y creo que calendario, saludos!
Así es, el módulo que mencionas tiene varias características muy interesantes.
En este video ruclips.net/video/tTzIitB9LBw/видео.html enseño a hacer un despertador digital con dicho módulo.
Saludos!
muy buena la clase te felicito tenes ese don de maestro que muy poco lo tienen
me re sirvió man!
excelente contenido
Gracias ms por los videos son buenos
¡Excelente video como siempre!
Saludos.
Gracias! Saludos
Excelente tu video de programación tienes más videos
Dónde lo puedo ver
Hola, revisa mi canal o busca curso de Arduino cefuve, saludos!
Valió la espera
sublime!!!!!!!!
exelente...
Buena tu clase...
Estoy descargado su clases pana mio... e aprendido algo... no se nada solo soy fanatico graduado.. yo estoy usando el stm32f103c6... tienes whuasa
Si puede hacer una clase pwm
Interesante ver como vas programando en vivo y tienes errores que corriges y te permite mostrar como se analiza y resuelve el problema....
Hola buenas tardes Cefuve quisiera decirle que en esta parte 1:41:18 también podría haberlo hecho de la siguiente forma
bool mínimo = hour == 13 && minute == 15 && second >= 30;
bool máximo = hour == 13 && minute == 16 && second
Hola Martin, el problema con esa forma, es que no puedes establecer rango más largos.
Imagina que quiero establecer 1 hora de funcionamiento:
mínimo = hour == 13 && minute == 15 && second >= 30;
máximo = hour == 14 && minute == 15 && second
Eres muy excelente explicando...solo le sugiero que aumente el tamaño de las letras en los videos ya que mucha gente los ve desde el celular y ya también muchos ya no vemos mucho
Gracias Carlos, tendré presente tu recomendación, saludos.
Excelente . Miguel grau
que clave eso del return, puede ser usado dentro de funciones if else, para cerrar el bucle loop?
Hola, el return se usa principalmente para devolver un valor desde una función, se puede usar dentro de un if... No se a que te refieres con cerrar el loop.
Si tienes un if dentro del loop que ejecuta el return sin devolver valor, el flujo de ejecución se irá al principio del loop.
Saludos!
Hola. Sigo incondionalmente tus vídeos. No solo se aprende, sinó que quieres más.
Una pregunta: ¿como calculamos que condensador poner para evitar rebotes?
Hola, gracias por verlos. Con respecto a tu pregunta, no tengo una fórmula, solo te recomiendo probar con condensadores entre 10nF y 100nF, a mayor valor, más lenta es la reacción.
Saludos.
@@cefuve gracias
Tienes algún ejemplo en donde lo que controles con el botón sea prender o apagar el blink de un led mientras lo demás sigue funcionando?
Hola Diana, si, tengo uno de menú con encoder. También hay otros donde hago más de una tarea al mismo tiempo. Saludos.
Buenazo
La velocidad de refresco de lo que muestra en la pantalla del monitor serial, depende de los baudios?
(9600)?
Los baudios es la velocidad a la que se transmiten los datos mediante comunicación serial. La velocidad con que se imprime en monitor serie dependerá de cómo está estructurado tu código.
hola buenas me gusto el concepto del vídeo.
y es como mencionas si copio y pego no se aprende.
estoy con un proyecto de un invernadero inteligente. que tus conocimientos lo pueden sacar adelante.
la verdad no estoy a la altura del proyecto y me lo planteo un amigo con su necesidad.
y yo con gusto me brindo para lo que se necesites.
Hola Lucas, gracias por comentar. Al final del comentario no terminé de entender tu intención... Pero puedo decirte que con perseverancia se pueden lograr muchas cosas!! así que te motivo a seguir practicando, que no te darás cuenta cuando logres hacer tus propios códigos. Saludos!
@@cefuve hola buenas otra vez.
Sabes que en el anterior video ví algo que me va ayudar mejor.
Y es lo de dejar el loop limpio.
Y que cada Voi haga la instrucción.
De igual manera te escribí a tu página personal para cotizar.
La utilización de funciones personalizadas, no? Es un buen recurso para ordenar el código, hay que intentar no abusar mucho de esa técnica... En la tarde pretendo darme un tiempo para revisar todas mis redes, saludos!
@@cefuve bueno dale.
Hace tranquilo, que andes bien.
@@lucasadolfoperezspangenber4121 A donde lo enviaste? no tengo ningún mensaje con tu nombre. Saludos!
Hola saludos como asocio la función millis a que me retenga el accionamiento de 2 servos
Hola, la libreria de servo por defecto te retiene el grado de giro cuando le das la acción. No entiendo porque quieres usar millis.
@@cefuve hola saludos, quiero que active 1 pulsador el servo a 90grados, luego que suelte el pulsador un tiempo después desactive el servo y vuelva a 0grados
Hola, tengo un vídeo del uso de botones... Para ese propósito yo usaría el flanco de subida y el flanco de bajada.
saludos!
@@cefuve como ese eso de flancos de subida y de bajada, no soy diestro en esto y solo quiero hacer esta especificación del servo para poder pasar la mayeria
@@joseescorche1414 ruclips.net/video/DG1g3IiFllQ/видео.htmlsi=OsLj-EA7qactSnQy
Existe algun programa para arduino que haga depuración, así tipo como lo hace el visual studio,?? para ver como se comportan las variables línea por línea
Yo por lo menos no conozco ninguno, simplemente hago Serial.print para ver lo que está pasando dentro del micro.
Hola , gracias por el aporte que hacés.
Si quiero activar una salida por 15 minutos Y luego apague mientras sigo leyendo temperatura o una entrada analógica cómo puedo armar ese temporizador?
Hola Ronaldo, puedes usar esta técnica, con millis, o la de mi otro video, usando delay.
Principalmente estableces una variable de conteo y un tiempo fijo, que por cada pasada, aumente en 1 el conteo. Así, pasado cierto conteo, sabrás cuanto tiempo ha pasado y podrás condicionarlo con un if.
Saludos!
Excelente video. Muchas gracias por explicar en profundidad.
Prodras darme una ayuda, para usar 10 botones y 10 led. Cada botón encenderá o apagará un led por separado (botón 1 corresponde a led ,1, botón 2 a led 2, etc). Además estos led deben prender y apagar de manera intermitente hasta que sean apagados. Si tenés algún vídeo que pueda orientarme te agradecería enormemente. Saludos y muchas gracias.
Hola Nicolas, el video anterior a este es la forma más simple: multitasking usando delay.
Y apoyarse con variables auxiliares para activar/desactivar párpados.
Algo como...
count = 0
blink1 = false
LOOP:
if (boton1 == 1){
blink1 = !blink1
}
delay(10)
count++
if (count > 10){
count = 0
if (blink1 == true)
digitalWrite(pin, !digitalRead(pin))
}
}
@@cefuve muchas gracias por responder. perfecto lo pondré en practica (no sabia que con blink hacia el parpadeo). Estoy viendo un video que explicas acerca de los pulsadores. son excelentes tus videos.
nuevamente muchas gracias, saludos desde argentina.
No hay de que Nicolas.
blink es el nombre de la variable solamente, el parpadeo lo hace todo el conjunto del código que te envié...
Hay un video de la sección #coding donde simulo la operación de una impresora, si no me equivoco ahí hice parpadear un led de forma similar.
Saludos!
@@cefuve hay unos videos circulando que usan varios botones con resistencias en serie a un solo puerto de entra, probaste si funcionaba?
@@nicolashaneck4764 si, ahora mismo estoy haciendo un proyecto donde uso una entrada analógica para leer 4 botones, sin problemas...
Te hago una consulta en este video, ya que no he encotrado uno en el que trates el tema, y si lo tienes, me interesaría acceder: tipo de datos struct, arrays de struct y punteros.
Otro tema que también me interesaría es guardar estados en eeprom, para recuperar el estado del programa ante cortes de energía eléctrica. Saludos y gracias!
No tengo muchos videos, y los que tengo son de nivel principiante, espero con el tiempo ir viendo temas más complejos. Saludos.
Hola Cesar, tengo una duda , cuando se realiza un reloj y abres el monitor serie siempre empieza a contar desde la hora que tengo puesta en las variables, ¿hay alguna manera de cuando abra el monitor serie vea el reloj en tiempo real, que no sea en un display o similar? Gracias.
Hola Manuel, se podría hacer eso, pero necesitarías un módulo extra RTC...
Lo otro sería usar la macros __TIME__, que toma la hora actual del sistema ¡al momento de compilar!
Prueba este código:
String tiempo = __TIME__;
int s = tiempo.substring(6).toInt();
int m = tiempo.substring(3, 5).toInt();
int h = tiempo.substring(0, 2).toInt();
Serial.println(tiempo);
Serial.println(h);
Serial.println(m);
Serial.println(s);
Saludos!
PROBLEMA hago exactamente lo mismo que explicas en el minuto 33:40 pero el count no me devuelve números, sino que me imprime count cada "tiempoactual+1000", uso la misma placa. agradecería un aporte.
excelente tus videos!!!!
encontré el error, estaba imprimiendo un char (escribí entre comillas). no estaba haciendo "exactamente lo mismo" jajaja
Hola Marcos, gracias por la honestidad jajaja... Eso suele pasar cuando no se hace "exactamente lo mismo".
Saludos!
se podria usar la funcion millis() y las interrupciones de arduino al mismo tiempo?
Hola Alex, no habría problemas ya que la función millis usa el timer no las interrupciones. Saludos!
Saludos hermano. Cuando pueda haga un video sobre las interrupciones
Ahí hay buen tema, bien profundo... saludos!
Te felicito por tu manera de explicar, eres muy didactico. Como haría Yo para colocarle a un secuencia de 5 led lo siguiente: Al primer Led 5 minutos prendido, al segundo Led 4 minutos, al tercer Led 3 minutos, al cuarto Led 2 minutos y al 5 Led 1 minuto? y listo... Que haga solo eso cada vez que Yo reinicie el Arduino.
Gracias Eddy, como le veo yo, se podría hacer con simples delay...
En el setup los estableces todos como salidas e inmediatamente después los enciendes todos, luego en el loop los vas apagando uno por uno:
delay(60000);
digitalWrite(led5, LOW);
delay(120000);
digitalWrite(led4, LOW);
delay(180000);
digitalWrite(led3, LOW);
delay(240000);
digitalWrite(led2, LOW);
delay(300000);
digitalWrite(led1, LOW);
Saludos!
@@cefuve Muchas gracias mi hermano, Yo pense que había una manera de colocar minutos en vez de segundos... Era por si les queria dar mucho más tiempo, por ejemplo 15 minutos a uno de ellos, eso es para Yo hacer un juego de luches en el en el jardín que tengo en el patio de mi casa, y que se enciandan cada cierto tiempo, y me cambie los colores de los reflectores que estoy colocando en mi jardín... jejeje, Lo voy a probar... Comence ayer a ver tus videos, y mi parecer creo que son los mas claros de muchos que he visto en la Red... Muy amable por responder.
Se podría simplificar haciendo la operación matemática dentro de los paréntesis:
delay(15 x 60 x 1000);
donde 60x1000 significa 1 minuto, y el 15 se va modificando dependiendo de los minutos que se requieran.
Importante mencionar, que todo tiene su límite cuando hablamos de número en microcontroladores, en este caso, para la función delay, se especifica que el tipo de variable es unsigned long.
www.arduino.cc/en/reference/delay
Esa variable almacena desde el 0 al 4294967295, por lo que podríamos hacer delay de aproximadamente 49 días...
Saludos!
@@cefuve Ahhhh okey...
Hola profe gracias por tus videos muy buenos, la explicación super me podrías orientar para realizar un semáforo con millis o Multitasking pero estoy atorado en como aplicarlo
Hola Rene, para que no te calientes la cabeza, dentro del millis realiza un contador y luego le pones condiciones a la cuenta.
Si el contador está entre 0 y 5 que se encienda la luz verde.
Si el contador está entre 6 y 7 que se encienda la luz amarilla.
Si el contador está entre 8 y 15 que se encienda la luz rojo.
Luego pones un if que reinicie el contador al pasar de 15.
Saludos!
@@cefuve Muchas gracias profe es mejor así esta menos complicado que los millis hay que seguir estudiando nuevamente gracias
Si es obligatorio que uses millis, sería algo como:
if(verde == 1){
if(millis() - tiempo_actual > 4000){
tiempo_actual = millis();
verde = 0;
amarillo = 1;
}
}
if(amarillo == 1){
if(millis() - tiempo_actual > 1000){
tiempo_actual = millis();
rojo = 1;
amarillo = 0;
}
}
A ver si se entiende, para que lo complete...
@@cefuve Profe muchas gracias por la información del código claro que lo voy a intentar te lo agradezco saludos.
amigo como será el código en arduino para leer pulsos en
flanco de subida o bajada usando digitalread()
Hola, justo en el último video "solución: funciones de mantenimiento impresora" muestro como reconocer entre flanco de subida y flanco de bajado...
Básicamente uso una variable auxiliar para guardar el estado anterior de la lectura y compararla con la lectura actual:
if ( lectura_actual != lectura_anterior ) {
if ( lectura_actual == 0 ) {
//flanco de bajada
}
if ( lectura_actual == 1 ) {
//flanco de subida
}
}
//Si es el estado de reposo es 1
Saludos!
Hola me parece el video muy bueno, pero me gustaría que cuando es una unidad de horas, segundos y minutos aparecería 01 y no 1 y ademas que podría aparecer el reloj como tal no imprimiendo la hora cada segundo y si se podría en una pantalla digital seria la pera. Muchas gracias eres un fenómeno, me tendré que ver el video mas de una vez para aprender un poco. Gracias otra vez
Hola Juan, para que aparezcan los ceros, sería así:
if(hour < 10) Serial.print("0");
Serial.print(hour);
Serial.print(":");
if(minute < 10) Serial.print("0");
Serial.print(minute);
Serial.print(":");
if(second < 10) Serial.print("0");
Serial.println(second);
Se podría adaptar perfectamente a cualquier pantalla, mas o menos, de la misma forma. Saludos!
profe tengo el código funcionando con los comparadores que uso primero compuerta lógica con AND encendido 10 segundos
Me podrías dar un poco de contexto, no me acuerdo de todo lo que explico en los videos, a veces divago jaja
Profe creo que la manera de solucionar el problema de los rangos era simplemente min ==/==/>= y max ==/==/
Hola Jhon, en el tiempo 1:21:21 lo tengo de esa forma... ah, te refieres a usar OR? con los slash /
algo así como: hour == 13 || minute == 15 || second >= 30
Gracias por comentar,
saludos!
Como ejecuto un for como multitarea
Hola, primero no debes usar un for, debes aprovechar el loop en conjunto con una variable contadora y un if para condicional el rango.
int x = 4;
void loop(){
if(digitalRead(pin) == LOW){ //boton
x = 0; //inicialización del for
}
if( x < 4 ){ //condición del for
x++; //iteración del for
//se ejecuta 3 veces después de presionar el botón
}
}
Hola cesar espero que te estés cuidando estuve trabajando en este proyecto el cual convertí en un cuenta horas para las máquinas y conseguí un módulo eeprom externo para probar !! Feliz hasta que me di cuenta que no usa la misma librería que la eeprom interna 🤔, ahora viene la pregunta :usaste estas eeprom ? Podrás orientarme para poder grabar y leer ?
Hola Anibal, como es eso de cuenta horas para las máquinas, algo como tiempo de operación de una máquina?
Que eeprom estás usando? Hay un montón de opciones, comunicación paralela, I2C, SPI, RS232, etc...
Saludos!
@@cefuve
Es un cuenta horas así cuando llega a un valor predeterminado imprima un mensaje “precisa servicio” en un auxiliar del contactor de marcha del motor principal hago accionar lo que simuló con el pulsador . Se calcula 600hs de vida del aceite y la idea que a las 1800 mande otro mensaje de cambio de filtro separador de aceite .Para eso es indispensable que la información se grabe cada minuto por si se interrumpe la energía , el módulo es At24c08 trabaja con I2c pero no usa la librería eeprom.
@@cefuve Módulo De Memoria At24c08 X2un I2c Interface Eeprom Emakers
@@cefuve
hola cesar acá en un vídeo explican en italiano la forma de grabar la memoria; y si la graba (lo trascribí y probé) lleva un montón de código y tiene un delay pequeño que creo que no va a interferir.
La idea seria, por ejemplo:
Empieza a funcionar la maquina, corre el tiempo y cada 1min graba en los primeros 4 espacios la hora .En los en el 5° y 6°espacio los min ;para que en el caso de corte de suministro o al finalizar el día se apague el equipo guarde la cuenta para poder seguir el día siguiente .
Luego grabaría el 7°,8°,9°.10°para la hora y así sucesivamente.
el tema es que no me quedo claro como cambiar las posiciones creo que como esta el código siempre graba en la posición 0 .
Quedo en espera cuando tengas un tiempo lo veas; HAY POCOS VÍDEOS QUE EXPLIQUEN EN DETALLE .
Desde ya gracias por la paciencia y la dedicación para explicar !!!
#include
#define disk1 0x50
int hora=24;
int minutos=54;
void setup() {
Serial.begin(9600);
Wire.begin();
unsigned int addr=1;
Serial.println("funciona la eeprom");
writeEEPROM(disk1, addr,minutos);
int n=readEEPROM(disk1,addr);
Serial.println(n);
}
void loop() {}
void writeEEPROM(int i2caddr,unsigned int maddr, byte data){
Wire.beginTransmission(i2caddr);
Wire.write((int)(maddr>>8));
Wire.write((int)(maddr&0xFF));
Wire.write(data);
Wire.endTransmission();
delay(5);
}
byte readEEPROM(int i2caddr,unsigned int maddr){
Wire.beginTransmission(i2caddr);
Wire.write((int)(maddr>>8));
Wire.write((int)(maddr&0xFF));
Wire.endTransmission();
Wire.requestFrom(i2caddr,1);
byte rdata=1;
if(Wire.available()){
rdata=Wire.read();
}
return rdata;
}
Hola Anibal, disculpa la demora. Aquí hay que tener muy en cuenta la forma de organización de la memoria y el tamaño de los tipos de variables.
La memoria guarda de a 8 bits por dirección, algo como:
dir = data
0 = 00000000
1 = 00000000
2 = 00000000
3 = 00000000
En el caso del reloj, trabajamos con números que se pueden almacenar perfectamente en 8 bits, así puedes guardar cada dato en cada dirección, ejemplo:
Guardar hora inicio 08:30:15
writeEEPROM(disk1, 0, horas);
writeEEPROM(disk1, 1, minutos);
writeEEPROM(disk1, 2, segundos);
Quedaría algo así:
dir = data
0 = 00001000 (8)
1 = 00011110 (30)
2 = 00001111 (15)
3 = 00000000
Después lees de la siguiente forma:
byte data1 = readEEPROM(disk1, 0);
byte data2 = readEEPROM(disk1, 1);
byte data3 = readEEPROM(disk1, 2);
Saludos!
Una pregunta, quizás sin mucho sentido: Si el tipo de variable "unigned long" tiene un valor máximo de 32 bits, si se tiene un proyecto funcionando de forma indefinida y se usa la función "millis", en algún momento esa variable se desbordará. ¿que pasa en ese momento? ¿vuelve a tener el valor =0? ¿Como afectaria en ese caso al proyecto?
Es una muy buena pregunta Fermin, respuesta rápida, vuelve a 0.
Respuesta larga, te pego la respuesta que di en otro de mis videos...
Hagamos el ejercicio de que llegamos al desborde.
1 s = 1.000 milis
1 minuto = 60.000 milis
1 hora = 3.600.000 milis
1 día = 86.400.000 milis
(unsigned long = 4.294.967.295)
Por ende, en 49 días tendrémos la variable en: 4.233.600.000
En 49 días y 17 horas estará en: 4.294.800.000
En 49 días, 17 horas y 2 minutos estará en: 4.294.920.000
En 49 días, 17 horas, 2 minutos y 47 segundos estará en: 4.294.967.000
Entonces, analicemos el código en el borde de la variable...
if(millis() >= tiempo_actual + 1000){
tiempo_actual = millis();
}
- En 49 días, 17 horas, 2 minutos y 47 segundos
if(millis() >= tiempo_actual + 1000){
tiempo_actual = 4.294.967.000;
}
- En 49 días, 17 horas, 2 minutos y 48 segundos
if(millis() >= 4.294.967.000 + 1000){ //la suma desborda a tiempo_actual
//quedando la condición (millis() >= 705)
//y como millis también se desborda,
//después entrará nuevamente al if
tiempo_actual = 705;
}
@@cefuve
Gracias Cesar, con la explicación de cómo quedaría el desborde ha quedado muy claro con el funcionamiento.
Es una forma de comprobar cuando se produce el desbordamiento en un proyecto de larga duración y que pueda darse esa situación.
tengo una idea con una banda vhf (118-136 mhz) para recibir señales PTT al Rpi, luego use Rpi para controlar un tablero de relés que controla algunas luces. tengo un codigo pero tengo la variable previousMillis y una variable llamada timeLastPush y no se bien ¿Dónde se actualizan? y ¿Dónde se usan? //constant value which will not change:
const int PTT = 6;
const int REL1 = 2;
const int REL2 = 3;
const int REL3 = 4;
const int REL4 = 5;
intervalo largo sin signo = 600000UL; // intervalo en el que apagar un relé
//valores que cambiarán:
int PTTState = 0;
int PTTPushCounter = 0;
int últimoestadoPTTS = 0;
unsigned largo anteriorMillis = 0; // almacenará la última vez que se actualizó un relé.
actualMillis largo sin signo = 0;
unsigned long timeLastPush = 0; //Milisek. desde la última vez que se presionó PTT ..
sin firmar long timeOutPTT = 10000; // Tiempo de espera en milisegundos
DFRobot_LCD lcd(16,2); // Tipo de pantalla LCD configurada 16 caracteres y 2 líneas.
void setup() {
// inicializando lcd
lcd.init();
// inicia el puerto serie para LCD
Serial.begin(9600);
Serial.println("PTT LISTO");
lcd.setCursor(0,0);
//Configuración de pines conectados por el esquema
pinMode(PTT,INPUT);
pinMode(REL1, SALIDA);
pinMode(REL2, SALIDA);
pinMode(REL3, SALIDA);
pinMode(REL4, SALIDA);
Serial.begin(9600);
Serial.println("PTT LISTO");
}
void loop() {
// leer el pin de entrada PTT:
PTTState = digitalRead(PTT);
// compara el PTTState con su estado anterior
if (PTTState != lastPTTState && lastPTTState == 0) { //Si cambió el estado del PTT AND lastPTTState = 0,
if ((millis() - timeLastPush) > timeOutPTT ) { //If timeout -límite para PTT alcanzado:
timeLastPush = millis(); //Establece el inicio del nuevo contador de tiempo ahora,
PTTPushCounter = 0; //Establece el contador PTT en 0.
}
// si el estado ha cambiado, incrementa el contador
if (PTTState == HIGH) {
// si el estado actual es HIGH, entonces el PTT pasó de desactivado a activado:
PTTPushCounter++;
Serial.println("PTT EMPUJADO");
Serial.print("NÚMERO DE PULSACIONES DE PTT: ");
Serial.println(PTTPushCounter);
}
}
// Retrasa un poco para evitar rebotes
delay(50);
// guarda el estado actual como el último estado, para la próxima vez que pase por el ciclo
lastPTTState = PTTState;
if (PTTPushCounter %4 == 3) {
lcd.clear();
lcd.setCursor(3,0);
lcd.print("RELÉ 1 ENCENDIDO!");
escritura digital (REL1, ALTA);
}
si (PTTPushCounter %6== 5) {
lcd.clear();
lcd.setCursor(3,0);
lcd.print("RELÉ 2 ENCENDIDO!");
escritura digital (REL2, ALTO);
}
if (PTTPushCounter %8== 7) {
lcd.clear();
lcd.setCursor(3,0);
lcd.print("RELÉ 3 ENCENDIDO!");
escritura digital (REL3, ALTA);
}
si (PTTPushCounter %10== 9) {
lcd.clear();
lcd.setCursor(3,0);
lcd.print("RELÉ 4 ENCENDIDO!");
escritura digital (REL4, ALTO);
}
actualMillis=millis();
if ((currentMillis - previousMillis) >= intervalo) {
// guarda la última vez que encendimos/apagamos el relé
lcd.clear();
lcd.setCursor(0,0);
lcd.print("¡TODOS LOS RELÉS APAGADOS!");
escritura digital (REL1, BAJO);
escritura digital (REL2, BAJO);
escritura digital (REL3, BAJO);
escritura digital (REL4, BAJO);
anteriorMillis = millis();
Serial.println(anteriorMillis);
}
}
Hola Agustin, según tu código, el timeLastPush se usa para timeout (se agotó el tiempo), que si después de un tiempo, no se recibe nueva info, se reseteo el contador.
if (PTTState != lastPTTState && lastPTTState == 0) {
if ((millis() - timeLastPush) > timeOutPTT ) {
timeLastPush = millis();
PTTPushCounter = 0;
}
Y la variable previousMillis es un "delay" que ejecuta instrucciones cada cierto tiempo (lo que manda la variable intervalo).
Es otra forma de hacer lo que explico en el video.
if ((currentMillis - previousMillis) >= intervalo) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("¡TODOS LOS RELÉS APAGADOS!");
escritura digital (REL1, BAJO);
escritura digital (REL2, BAJO);
escritura digital (REL3, BAJO);
escritura digital (REL4, BAJO);
anteriorMillis = millis();
Serial.println(anteriorMillis);
}
Saludos.
@@cefuve gracias profeee!
Excelente video. Creo que el problema que tienes con la lógica es este:
Tu creaste las condiciones de inicio y final bien pero trabajaste con el negado.
Prueba si no fue según entendí, que si el negado y el final eran falsos es que se te cumple. Sino creo que escribiste el negado del "o" y es la suma de fe cada negado. Gracias :)
Hola, tu hablas de esta parte 1:29:10 ? dejarías el minimo y maximo negados por separado?
@@cefuve pienso que sería una estrategia. Comentame que tal. Excelente video gracias
@@elturco7367 Eso quedaría como una NAND, que lo probé antes... Incluso más adelante en el video me apareció otro problema, por eso terminé usando otra estrategia totalmente distinta.
Mira, si se niegan individualmente, queda:
if( !minimo || !maximo )
Y si aplicamos el teorema de De Morgan, nos queda como una multiplicación negada:
if( !(minimo && maximo) )
Saludos.
hola profe eres seco, me sirvió bastante su video en un proyecto que estoy diseñando con arduino. Soy programador de PLC y necesitaba saber de la multitarea en arduino la verdad que cada minuto de su video vale la pena verlo, hay proyectos pequeños que no amerita el uso de un PLC, tomare un cursito de arduino, eso si le falta mas practica con las compuertas lógicas jajajaj saludos profe desde concepción.
Hola César, te dejo invitado a ver mi curso de Arduino en youtube, es básico pero da una base firme para seguir avanzando.
Se me corrio la lógica mientras explicaba?? A veces la cabeza me hace cortocircuito jajajajaja.
Saludos al gran Concepción!
@@cefuve gracias por la invitación vere los videos del curso saludos
Hola cesar porque cuando lo multiplicaste por 10000 daba ese error? Y si en 100000 funciono , y en el caso de los minutos sobra un cero ósea tendría que ser por 100 en vez de mil ? Me encariñe un poco en el error que tiraba cuando multiplicas la hora por 10000
Como viste en el video, quedé "plop", y para no quedarme pegado lo dejé con 100.000... Pero hay algo que no debo estar viendo, a ti te da el mismo error?
@@cefuve hoy vi la facción de video mañana lo practico y te cuento cómo resulto esta muy bueno pasarlo a número entero ya que se podría grabar en una eeprom externa por ejemplo en la fabricación de un horometro para alguna máquina ! Pero quede desconcertado con ese error mañana te cuento cómo me fue
Siii, en la desesperación se me vino esa idea (después de alguna horas jaja) y la verdad, tiene bastante potencial... En cuanto tenga tiempo probaré de nuevo el código, pero aislado, a ver que pasa. Y esperaré tu retroalimentación, Saludos!
loopX:
for (int i = 0; i < alarm; i++) {
digitalWrite(buzzerCtl, HIGH);
digitalWrite(ledBuiltIn, HIGH);
delay(500);
digitalWrite(buzzerCtl, LOW);
digitalWrite(ledBuiltIn, LOW);
delay(500);
}
delay(1000);
goto loopX;
} buenas amigo como haria para agreagar el tiempo de retardo con milli().
Hola Jorge, no es llegar y meter millis en un código, se debe plantear desde cero el problema, para generar el algoritmo necesario ¿Qué se supone que hace esa sección de código?
p.d: No te recomiendo usar goto en lenguajes de alto nivel...
@@cefuve es un codigo de un inversor de corriente es bastante largo
hay lcd sensor de temperatura ,sensor de bateria, feedback,timer es un spwm que ido modificando funciona pero quiero meter un sensor de corriente pero en el void loop se queda como parado en la lcd pero mido las salidas y parece funcionas pero con retraso .
esa parte hace que cuando se activa la alrma por alguno de los sensores enciende los led y activa el buzer sin fin hasta que lo reinicie y tambien apaga el spwm
Por lo que entiendo, quieres que la alarma y el led enciendan y apaguen indefinidamente.
La forma rápida de hacerlo con millis sería algo como:
if(millis() - tiempoactual > 500){
tiempoactual = millis();
digitalWrite(buzzerCtl, !digitalRead(buzzerCtl));
digitalWrite(ledBuiltIn, !digitalRead(ledBuiltIn));
}
Saludos!
Por favor necesito de tu ayuda :c ...Cómo podría hacer un ciclo for pero con millis? Sé que en teoría no se podría pero quiero tratar que al entrar a un if, el código se ejecute x número de veces y luego salga de este, continuando así con el código, soy muy novato en muchas cosas pero estoy tratando de implementar millis en mis códigos pero no sé cómo hacer que se ejecute una cierta cantidad de veces y luego deje hacerlo hasta que se le vuelva a ordenar :( , cualquier ayuda estaría más que agradecido, Muchas gracias por tus vídeos me han motivado bastante a continuar con Arduino!🔥✨
Hola, no entiendo muy bien lo que necesitas, porque no le encuentro sentido a hacer un for con millis... Si que se puede hacer un for con if, sería algo así:
x = 10;
en el loop:
if(x > 0){
//se repite hasta que x sea 0
x = x - 1;
}
Después para entrar de nuevo, solo debes asignar el número de repeticiones a la variable x.
Saludos!
@@cefuve Muchas gracias por tu ayuda!🔥✨
Con pwm en un potenciómetro que active varias cosas
Hola Arturo, a que te refieres?
@@cefuve un velocímetro puede ser
@@arturovilla5441 te refieres a un variador de velocidad para motor mediante pwm? y que se pueda modificar el valor de pwm con un potenciometro?
A no ser que quieras una frecuencia de pwm especial, no tiene sentido usar millis ya que hay una función especial para generar pwm (analogWrite).
Saludos.
@@cefuve si como un velocímetro con un sensor Hall
😵
🥴
Soy un novato, pero si te tengo cerca, te hubieras llevado un collejón
No es más fácil (pregunto) si le hubieras puesto == en las horas minutos y segundos
Que es lo que tú querías
@@jorgenavarro3473 Hola, en que minuto del video? saludos.
No me explique bien, tu teoría es que este encendido cuando las dos se cumplan 1:21 (te complicas) si pones una para encender (se mantiene encendido hasta que le digas lo contrario) y después la otra hora para apagar con == así cuando llegue a esa hora exacta hace el cambio, nada de ≤= ni ≥=
Una 1h con 21minutos
@@jorgenavarro3473 Aaah si, me compliqué entero, pero al final del video usé otra técnica que me dio los resultados esperados (01:42:06). De eso se trata el video, de prueba y error, saludos!
Enceñame
hola profe yo se que tiene que hacer cosas y que posible mente desconfié de mi al ser un extraño, pero quiero crear un grupo en DISCORD de Arduino español ya que no hay o no he encontrado aun, entonces quiero que me ayude con ese sueño. y si le interesa la idea me puede escribir ( memio Andrium#3318 ) ahí le dejo mi usuario si me quiere buscar
Hola, había escuchado hablar de discord, pero hasta ahora no me había decantado por probarlo, se ve bastante interesante, sobre todo la interfaz... Había pensado en algún momento, hacer un foro en mi página web, pero como bien dices, el tiempo es el que falta.
Por ahora no está en mis planes generar comunidad en dicha plataforma, pero me hice una cuenta por si haces un grupo y me quieres invitar!! cefuve_electronics#2440
Saludos!
@@cefuve hola compa, claro con mucho gusto estará las puertas abiertas, y si sabes de otras personas que sepan de arduino y me quieran ayudar con todo gusto los recibo con las manos abiertas y que tengas linda tarde