Quelle heure est-il?Je transforme de vieux téléphones portables en horloges depuis plusieurs années.
Android 2.2.2 - Froyo. This one still going, its sibling has failed. And more recent phones have failed.Android 2.2.2 - Froyo. Celui-ci va toujours, son frère a échoué. Et les téléphones plus récents ont échoué.
Deux viennent d'échouer. C'est le dernier en cours d'exécution... bon matériel. Vraiment ancien système d'exploitation, mais obtient toujours l'heure hors du réseau et se met toujours à jour lorsque nous passons à l'heure d'été et retour.
Je dois donc les remplacer, et j'ai commencé à penser aux Arduinos et aux framboises et je suis tombé sur ESP32.
Quarter inch squares, this is about 25cm x 50cmCarrés d'un quart de pouce, c'est environ 25 cm x 50 cm
C'est de la part de expressif et j'ai eu celui-ci sur amazon, 3 pour 17 $. Jusqu'à présent, j'ai joué avec une LED clignotante et en utilisant le matériel WIFI intégré. Oui, WIFI et dent bleue, et beaucoup de broches d'E / S, 4M rom et 512K ram (je pense. Je n'ai pas exploré assez loin pour être sûr.) Dans le processus, j'ai exécuté l'exemple NTP (Network Time Protocol) et a commencé à se demander comment fonctionne NTP.
Au fond, NTP est vraiment simple. Un ordinateur qui veut connaître l'heure envoie un court message à un autre ordinateur qui héberge un serveur NTP, et cet ordinateur renvoie un court message qui inclut l'heure GMT. Fait.
(C'est beaucoup plus compliqué ; apparemment les serveurs NTP peuvent répondre à la question 1000 fois par deuxième ! Et les mécanismes de synchronisation des serveurs utilisent des statistiques. Et David L Mills a inventé les trucs du NTP vers 1980 .)
Internet utilise principalement TCP (Protocole de contrôle de transmission) , un protocole robuste basé sur IP. Tentatives TCP, etc., pour s'assurer que les données sont livrées, dans l'ordre et intactes. C'est un protocole lourd. Les serveurs NTP utilisent un protocole léger, UDP (également sur IP) qui ne garantit rien. Vos messages peuvent se perdre, ne jamais arriver, arriver dans le désordre. Mais la charge sur le serveur est minime ; le serveur n'a pas besoin de serrer la main supplémentaire pour s'assurer que vous obtenez une réponse. Le U dans UDP (User Datagram Protocol) signifie que l'utilisateur est responsable de la gestion des erreurs.
Cette JSL crée un socket pour utiliser le port 123 (le port NTP) et le protocole UDP pour envoyer un message à un pool de serveurs NTP et obtenir la réponse. Il fait des choses très simples statistiques maths qui suppose que le temps de trajet vers et depuis le serveur est égal afin que l'heure du serveur puisse être mieux synchronisée avec l'ordinateur local. Les résultats sont plutôt bons ! Voici un exemple légèrement meilleur que la moyenne qui a trouvé un serveur dans le pool à l'autre bout du monde :
pool.ntp.org(rn5.quickhost.hk)
TempsTotal = 0.143846988677979
Temps de vol = 0,143799781799316
Différence = 0:00:00.01689
En supposant que .hk soit vraiment à Hong Kong, c'est à 8 000 milles de la Caroline du Nord. 16 000 aller-retour. Le temps de vol est le temps total moins le temps de traitement à Hong Kong, qui était négligeable. Si j'ai bien fait mes calculs, c'est plus de 100 000 miles/seconde, une fraction significative de la vitesse de la lumière.
Le dernier chiffre, différence, est la différence entre l'horloge de mon CPU et l'horloge du serveur NTP. C'est moins de 1/50 seconde. Et j'obtiens des résultats de la plupart des serveurs en 1/10 de seconde, sauf si le temps de vol est important, auquel cas il est asymétrique et la technique de correction tombe en panne.
pool.ntp.org(LAX.CALTICK.NET)
TempsTotal = 0.101963043212891
Temps de vol = 0,101903915405273
Différence = 0:00:00.08646
pool.ntp.org(ns2.nuso.cloud)
TempsTotal = 0.103617668151855
Temps de vol = 0,103596687316895
Différence = 0:00:00.04034
pool.ntp.org(50-205-57-38-static.hfc.comcastbusiness.net)
TempsTotal = 0.0763883590698242
Temps de vol = 0,0763206481933594
Différence = 0:00:00.00965
piscine.ntp.org(13.86.101.172)
TempsTotal = 0.077089786529541
Temps de vol = 0,07708740234375
Différence = 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>

Utilisation de sockets UDP pour obtenir l'heure d'un serveur NTP.
Re : Quelle heure est-il ?Avant de commander la révision 2 du PCB, je construis les deux autres cartes de la première commande. Comme le premier, mais en parallèle, construisez un peu et testez. Et j'ai appris quelque chose auquel je ne m'attendais pas.
Les phases de construction ressemblent à ceci :
- Mettez tous les composants discrets, petits et peu coûteux sur la carte. Ils sont difficiles à faire plus tard.
- Ajoutez les pilotes LED, trois circuits intégrés à 16 broches.
- Ajoutez les composants de l'alimentation et vérifiez si les voyants d'alimentation s'allument.
- Ajoutez le CPU, assurez-vous qu'il acceptera un programme téléchargé.
- Ajoutez les chiffres de l'autre côté. Les chiffres cachent des choses, ils doivent donc être les derniers.
Some of these prototypes are not working correctly.Certains de ces prototypes ne fonctionnent pas correctement. Les chiffres (quatre d'entre eux) sont modestement chers et quelque peu délicats. J'en ai placé un un peu au hasard (heures-un poste) et j'ai fait un test rapide. Seuls certains segments ont fonctionné. Retour à l'établi, contrôle visuel, contrôle du compteur, enfin sortir la lunette. À ce stade, il y a une demi-douzaine de choses qui pourraient être fausses ; n'importe quoi, du CPU aux circuits intégrés du pilote en passant par les chiffres. Ce n'est pas la conception de base; J'ai deux prototypes fonctionnels (un sur une planche à pain, un sur le premier PCB.)
L'horloge est une conception multiplexée ; chaque puce de pilote a quatre sorties. L'un des conducteurs sélectionne un chiffre et les deux autres conducteurs sélectionnent sept segments et un point décimal. Une matrice 4X8 de 32 éléments, adressés par 12 bits. Jusqu'à huit éléments peuvent être allumés à la fois (un chiffre). Heureusement, je regarde un chiffre qui devrait avoir la plupart de ses segments et je vois tous les segments manquants qui appartiennent à une seule puce de pilote. En utilisant l'oscilloscope sur cette puce, je vois que les entrées demandent que les segments soient activés, mais les sorties sont... mortes.
Remplacer un IC est une douleur. J'en ai attrapé un nouveau dans le tube, je l'ai installé et... Bummer ! C'est mieux, mais un segment ne s'affiche toujours pas ! Ai-je mal diagnostiqué ? Quelque chose d'autre s'effondre ?
Attendez. Je construis deux cartes en parallèle. Regardons l'autre. Rien. Aucun segment. Après un peu d'étude... Hmm. Cette fois, le problème n'est pas le pilote des segments, c'est le pilote de l'autre axe de la matrice, celui qui sélectionne un chiffre. Est-ce que j'ai tout un tube de mauvais circuits intégrés ?
Il s'agissait d'un tube de CI inutilisé, acheté pour un autre projet environ 10 ans plus tôt. J'ai besoin de construire un testeur. Voici le testeur montrant quatre voyants verts pour une puce que j'ai récemment reçue d'un autre distributeur.
All 10 in the newer tube checked out good.Tous les 10 dans le nouveau tube ont bien vérifié.
Je pense actuellement qu'au moins 5/10 des puces de l'autre tube étaient mauvaises sur une ou plusieurs sorties :
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!Écrasez les épingles (pour éviter leur réutilisation) et roulez-les sur le dos pour qu'elles ressemblent à des insectes morts. Même 3/4 OK n'est pas suffisant quand les quatre sorties sont nécessaires !
Ce que j'ai appris concerne peut-être le test des puces avant l'installation, mais je ne pense pas que ce soit vraiment nécessaire. Mais ce que je vais faire, c'est utiliser l'oscilloscope pour faire un test, en inversant probablement les éléments 2 et 3 dans l'assemblage, afin que je puisse tester un peu mieux avant d'attacher un chiffre. Ensuite, pour placer le premier chiffre, choisissez-en un qui bloque l'alimentation, pas une puce de pilote. En ce moment, je dois supprimer un chiffre pour pouvoir supprimer un pilote IC.
Re : Quelle heure est-il ?Prototype construit et fonctionnel.
It's hard for me to call this the back; it was the front in KiCad.Il m'est difficile d'appeler cela le dos; c'était le devant dans KiCad.
The flash makes the white balance show the red digits as red.Le flash fait que la balance des blancs affiche les chiffres rouges en rouge.
With no flash, the white balance messes up the colors, but this is closer to what it really looks like otherwise.Sans flash, la balance des blancs gâche les couleurs, mais c'est plus proche de ce à quoi cela ressemble vraiment autrement.
Les régulateurs linéaires chauffent vraiment; le régulateur 5V délivre environ 1/4 ampère mais cela signifie que l'entrée 16V laisse tomber 11 volts * 1/4 ampère = presque 3 watts dans ce petit dissipateur de chaleur. Il est temps de regarder un régulateur à découpage de remplacement. Apparemment la même taille de paquet, mais 90% efficace.
Re : Quelle heure est-il ?Les circuits imprimés sont là ! Conçu avec KiCadName , fabriqué par OSHPark , 20 jours dont 11 jours de fabrication et 8 jours de livraison gratuite (économiser là où je peux !) Je ne devrais probablement pas les montrer tant que je ne sais pas qu'ils fonctionnent... des prototypes...
This is my first board that will have components front and back.C'est ma première carte qui aura des composants avant et arrière.
Les points rugueux sur les bords sont là où mes planches ont été détachées d'un panneau plus grand ; Je vais les nettoyer bientôt, ils sont pointus ! Les planches mesurent environ 3 x 9 pouces. J'utilise la technologie des trous traversants ; tous les bits de montage en surface seront sur des cartes pré-construites (GPS, BME et ESP32). Je suis allé avec les planches AfterDark même si le temps était un peu plus long. J'aime le look ! Un test d'ajustement préliminaire indique que les pièces pour lesquelles j'ai conçu des empreintes vont fonctionner. Yay!
Re : Quelle heure est-il ?mise à jour... la lumière bleue à l'extrême droite est l'esp32. Il est 16h05.
It's really hard to get the light right to take a picture of an LED display.Il est vraiment difficile d'obtenir la bonne lumière pour prendre une photo d'un écran LED.
Les chiffres de 2 1/4 pouces de haut nécessitent 8 volts, pas les 2 volts suggérés par l'ancienne fiche technique. Cela signifie que j'ai besoin de l'alimentation supplémentaire en haut à droite, fabriquée à partir de pièces de junk-box, et les 4 puces de pilote proviennent de la même boîte. Il y a aussi un GPS à 12 $ en bas à droite. L'heure peut être réglée depuis le GPS s'il peut voir certains satellites, ou depuis le wifi si le mot de passe n'a pas été changé.
Je ne sais pas encore où JMP s'intègre dans cela, mais j'ai un capteur de pression/température/humidité que je veux ajouter. Peut-être qu'il fera un enregistrement de données et exécutera un serveur Web. Ou peut-être ajouterai-je un petit affichage pour la météo. Une fois les détails réglés, je ferai un PCB. Ces fils ne fonctionneront pas sur le mur.