¿Qué hora es?He estado reutilizando teléfonos celulares viejos como relojes durante varios años.
Android 2.2.2 - Froyo. This one still going, its sibling has failed. And more recent phones have failed.Android 2.2.2 - Froyo. Este sigue en marcha, su hermano ha fallado. Y los teléfonos más recientes han fallado.
Dos acaban de fallar. Ese es el último en ejecución... buen hardware. Sistema operativo realmente antiguo, pero aún obtiene la hora fuera de la red y aún se actualiza cuando cambiamos al horario de verano y viceversa.
Así que necesito reemplazarlos, y comencé a pensar en Arduinos y Raspberries y tropecé con ESP32.
Quarter inch squares, this is about 25cm x 50cmCuadrados de un cuarto de pulgada, esto es aproximadamente 25 cm x 50 cm
Esto es de expreso y compré este en amazon, 3 por $17. Hasta ahora he jugado con el parpadeo de un LED y usando el hardware WIFI incorporado. Sí, WIFI, bluetooth y muchos pines de E/S, 4M de rom y 512K de ram (creo que no he explorado lo suficiente como para estar seguro). En el proceso, ejecuté el ejemplo de NTP (Protocolo de tiempo de red). y comencé a preguntarme cómo funciona NTP.
En el fondo, NTP es realmente simple. Una computadora que quiere saber la hora envía un mensaje corto a otra computadora que aloja un servidor NTP, y esa computadora envía un mensaje corto que incluye la hora GMT. Hecho.
(Es mucho más complicado; aparentemente los servidores NTP pueden responder la pregunta 1000 veces al día). segundo ! Y los mecanismos de sincronización de los servidores utilizan estadísticas. Y David L Mills inventó las cosas NTP alrededor de 1980 .)
Internet utiliza principalmente TCP (Protocolo de Control de Transmisión) , un protocolo robusto construido sobre IP. TCP reintenta, etc., para asegurarse de que los datos se entreguen, en orden e intactos. Es un protocolo pesado. Los servidores NTP utilizan un protocolo ligero, UDP (también sobre IP) que no garantiza nada. Sus mensajes pueden perderse, no llegar nunca, llegar desordenados. Pero la carga en el servidor es mínima; el servidor no necesita hacer ningún apretón de manos adicional para asegurarse de obtener una respuesta. La U en UDP (Protocolo de datagramas de usuario) significa que el usuario es responsable de manejar los errores.
Este JSL crea un socket para usar el puerto 123 (el puerto NTP) y el protocolo UDP para enviar un mensaje a un grupo de servidores NTP y obtener la respuesta. Hace algo realmente simple Estadísticas matemática que asume que el tiempo de viaje hacia y desde el servidor es igual, por lo que el tiempo del servidor se puede sincronizar mejor con la computadora local. ¡Los resultados son bastante buenos! Aquí hay un ejemplo ligeramente mejor que el promedio que encontró un servidor en el grupo al otro lado del mundo:
pool.ntp.org(rn5.quickhost.hk)
TiempoTotal = 0.143846988677979
TiempoVuelo = 0.143799781799316
Diferencia = 0:00:00.01689
Asumiendo que .hk está realmente en Hong Kong, eso es 8,000 millas de Carolina del Norte. 16.000 ida y vuelta. El tiempo de vuelo es el tiempo total menos el tiempo de procesamiento en Hong Kong, que fue insignificante. Si hice bien mis cálculos, eso es más de 100,000 millas por segundo, una fracción significativa de la velocidad de la luz.
El último número, diferencia, es la diferencia entre el reloj de mi CPU y el reloj del servidor NTP. Eso es menos de 1/50 de segundo. Y obtengo resultados de la mayoría de los servidores en 1/10 de segundo, a menos que el tiempo de vuelo sea largo, en cuyo caso es asimétrico y la técnica de corrección falla.
pool.ntp.org(LAX.CALTICK.NET)
TiempoTotal = 0.101963043212891
TiempoVuelo = 0.101903915405273
Diferencia = 0:00:00.08646
pool.ntp.org(ns2.nuso.cloud)
TiempoTotal = 0.103617668151855
TiempoVuelo = 0.103596687316895
Diferencia = 0:00:00.04034
pool.ntp.org(50-205-57-38-static.hfc.comcastbusiness.net)
TiempoTotal = 0.0763883590698242
TiempoVuelo = 0.0763206481933594
Diferencia = 0:00:00.00965
pool.ntp.org(13.86.101.172)
TiempoTotal = 0.077089786529541
TiempoVuelo = 0.07708740234375
Diferencia = 0:00:00.00663
// this snippet demonstrates a UDP (User Datagram Protocol) exchange with an NTP
// (Network Time Protocol) server using a JSL socket. NTP sends enough information
// from an NTP server to correct for some network delays and make a really good guess
// at the local time, possibly within 1/100 second, usually within 1/10 second (depending
// on how similar send and receive times are.) Using the OS time setting to sync your
// clock first (which uses NTP as well) will make the deltas near zero. Otherwise the
// deltas should be similar across several runs. Your computer clock will drift between
// the syncs (once a day?) that your computer automatically performs with an NTP server.
//
// idea from https://lettier.github.io/posts/2016-04-26-lets-make-a-ntp-client-in-c.html
timezone = -4; // (tz for my computer) Eastern Daylight Time is GMT-4.
// build the transmit packet to send to the NTP server
xPacket = Hex To Blob( "1b" || Repeat( "00", 47 ) );
// make the socket object
sock = Socket( DGRAM ); // not a normal STREAM socket, this is an unreliable UDP socket.
// choose a server (or server pool)
addr = "pool.ntp.org"; // a pool of servers. Don't ask too often, they have a heavy load.
// if nothing goes wrong, the bind and ioctl are optional, but
// if we never get a response (for various reasons) we'd rather not hang forever...
rc = sock << bind( addr, "123" ); // bind, maybe not required, but needed for NBIO...
If( rc[2] != "ok",
sock << close;
Throw( "bad bind" );
);
rc = sock << Ioctl( FIONBIO, 1 ); // NBIO: non blocking i/o. the unreliable UDP may never answer.
If( rc[2] != "ok",
sock << close;
Throw( "bad ioctl" );
);
// send our request to the server. <<SENDTO is="" for="" unreliable="" udp="" packets.=""></SENDTO>

Uso de sockets UDP para obtener la hora de un servidor NTP.
Re: ¿Qué hora es?Antes de pedir la revisión 2 de la PCB, estoy construyendo las otras dos placas desde el primer pedido. Como el primero, pero en paralelo, construye un poco y prueba. Y aprendí algo que no esperaba.
Las fases de construcción se ven así:
- Coloque todos los componentes económicos, pequeños y de bajo perfil en la placa. Son difíciles de hacer más tarde.
- Agregue los controladores LED, tres circuitos integrados de 16 pines.
- Agregue los componentes de la fuente de alimentación y vea si los LED indicadores de alimentación se encienden.
- Agregue la CPU, asegúrese de que acepte un programa descargado.
- Agrega los dígitos en el otro lado. Los dígitos ocultan cosas, por lo que deben ser los últimos.
Some of these prototypes are not working correctly.Algunos de estos prototipos no funcionan correctamente. Los dígitos (cuatro de ellos) son modestamente caros y algo delicados. Coloqué uno al azar (horas-una posición) e hice una prueba rápida. Solo algunos de los segmentos funcionaron. De vuelta al banco de trabajo, verificación visual, verificación del medidor, finalmente saque el alcance. En este punto hay media docena de cosas que podrían estar mal; cualquier cosa, desde la CPU hasta los circuitos integrados del controlador y los dígitos. No es el diseño básico; Tengo dos prototipos de trabajo (uno en una placa de pruebas, uno en el primer PCB).
El reloj es un diseño multiplexado; cada chip controlador tiene cuatro salidas. Uno de los controladores selecciona un dígito y los otros dos controladores seleccionan siete segmentos y un punto decimal. Una matriz 4X8 de 32 elementos, direccionada por 12 bits. Pueden estar encendidos hasta ocho elementos a la vez (un dígito). Afortunadamente, estoy mirando un dígito que debería tener la mayoría de sus segmentos activados y veo todos los segmentos faltantes que pertenecen a un chip de controlador. Usando el alcance en ese chip, veo que las entradas solicitan que los segmentos estén encendidos, pero las salidas están... muertas.
Reemplazar un IC es un dolor. Cogí uno nuevo del tubo, lo instalé y... ¡Qué fastidio! ¡Es mejor, pero todavía no se muestra un segmento! ¿Me equivoqué de diagnóstico? ¿Algo más que se desmorona?
Esperar. Estoy construyendo dos tarjetas en paralelo. Miremos el otro. Nada. Sin segmentos. Después de un poco de estudio... Hmm. Esta vez el problema no es el controlador de los segmentos, es el controlador de otro eje en la matriz, el que selecciona un dígito. ¿Tengo un tubo completo de circuitos integrados defectuosos?
Este era un tubo de circuitos integrados sin usar, comprado para otro proyecto unos 10 años antes. Necesito construir un probador. Aquí está el probador que muestra cuatro luces verdes para un chip que obtuve recientemente de un distribuidor diferente.
All 10 in the newer tube checked out good.Los 10 en el tubo más nuevo salieron bien.
Actualmente creo que al menos 5/10 de los chips en el otro tubo estaban dañados en una o más salidas:
Crush the pins in (to prevent re-use) and roll them on their backs so they look like dead bugs. Even 3/4 OK is not good enough when all four outputs are needed!Aplasta los alfileres (para evitar que se vuelvan a usar) y gíralos sobre la espalda para que parezcan insectos muertos. ¡Incluso 3/4 OK no es suficiente cuando se necesitan las cuatro salidas!
Lo que aprendí podría ser acerca de probar los chips antes de instalarlos, pero no creo que sea realmente necesario. Pero lo que haré es usar el alcance para hacer una prueba, probablemente invirtiendo los elementos 2 y 3 en el ensamblaje, para poder probar un poco mejor antes de adjuntar un dígito. Luego, para colocar el primer dígito, elija uno que bloquee la fuente de alimentación, no un chip controlador. En este momento, tengo que eliminar un dígito para poder eliminar un controlador IC.
Re: ¿Qué hora es?Prototipo construido y funcionando.
It's hard for me to call this the back; it was the front in KiCad.Es difícil para mí llamar a esto la parte de atrás; era el frente en KiCad.
The flash makes the white balance show the red digits as red.El flash hace que el balance de blancos muestre los dígitos rojos como rojos.
With no flash, the white balance messes up the colors, but this is closer to what it really looks like otherwise.Sin flash, el balance de blancos desordena los colores, pero esto es más parecido a lo que realmente parece de otra manera.
Los reguladores lineales se calientan mucho; el regulador de 5V entrega aproximadamente 1/4 amperio, pero eso significa que la entrada de 16V cae 11 voltios * 1/4 amperio = casi 3 vatios en ese pequeño disipador de calor. Es hora de buscar un regulador de modo de conmutación de reemplazo directo. Aparentemente el mismo tamaño de paquete, pero 90% eficiente.
Re: ¿Qué hora es?¡Las placas de circuito están de moda! Diseñado con KiCad , fabricado por OSHparque , 20 días, incluidos 11 días de fabricación y 8 días de envío gratis (¡ahorro donde pueda!) Probablemente no debería mostrar estos hasta que sepa que funcionan... prototipos...
This is my first board that will have components front and back.Esta es mi primera placa que tendrá componentes en la parte delantera y trasera.
Los puntos ásperos alrededor de los bordes son donde se rompieron mis tablas de un panel más grande; ¡Los limpiaré pronto, son puntiagudos! Las tablas son de aproximadamente 3x9 pulgadas. Estoy usando tecnología de orificio pasante; todos los bits de montaje en superficie estarán en tarjetas prefabricadas (GPS, BME y ESP32). Fui con las placas AfterDark aunque el tiempo fue un poco más largo. ¡Me está gustando el look! Una prueba de ajuste preliminar dice que las partes para las que diseñé las huellas van a funcionar. ¡Hurra!
Re: ¿Qué hora es?actualización... la luz azul en el extremo derecho es el esp32. Son las 16:05.
It's really hard to get the light right to take a picture of an LED display.Es realmente difícil obtener la luz adecuada para tomar una foto de una pantalla LED.
Los dígitos de 2 1/4 pulgadas de alto requieren 8 voltios, no los 2 voltios que sugería la hoja de datos anterior. Eso significa que necesito la fuente de alimentación adicional en la parte superior derecha, hecha con piezas de chatarra, y los 4 chips del controlador provienen de la misma caja. También hay un GPS de $12 en la parte inferior derecha. La hora se puede configurar desde el GPS si puede ver algunos satélites, o desde el wifi si no se ha cambiado la contraseña.
Todavía no estoy seguro de dónde encaja JMP en esto, pero tengo un sensor de presión/temperatura/humedad que quiero agregar. Tal vez registre algunos datos y ejecute un servidor web. O tal vez agregaré una pequeña pantalla para el clima. Una vez que se resuelvan los detalles, haré un PCB. Esos cables no funcionarán en la pared.