{"id":23907642,"url":"https://github.com/jbdesbas/pyphone","last_synced_at":"2026-05-16T09:32:35.213Z","repository":{"id":201161786,"uuid":"707100611","full_name":"jbdesbas/pyphone","owner":"jbdesbas","description":"ESP8266 + téléphone à cadran","archived":false,"fork":false,"pushed_at":"2026-05-15T16:14:56.000Z","size":439,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-15T17:18:21.939Z","etag":null,"topics":["dfplayer-mini","diy","esphome","fun","micropython","micropython-esp8266","phone","toy"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jbdesbas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-19T08:17:47.000Z","updated_at":"2026-05-14T13:04:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"98feecf4-c1da-4cec-be18-6dad2f4597e5","html_url":"https://github.com/jbdesbas/pyphone","commit_stats":null,"previous_names":["jbdesbas/pyphone"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jbdesbas/pyphone","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbdesbas%2Fpyphone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbdesbas%2Fpyphone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbdesbas%2Fpyphone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbdesbas%2Fpyphone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jbdesbas","download_url":"https://codeload.github.com/jbdesbas/pyphone/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbdesbas%2Fpyphone/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33096873,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dfplayer-mini","diy","esphome","fun","micropython","micropython-esp8266","phone","toy"],"created_at":"2025-01-05T03:13:37.715Z","updated_at":"2026-05-16T09:32:35.190Z","avatar_url":"https://github.com/jbdesbas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pyPhone\n\nProjet de détournement d'un ancien téléphone ☎ à cadran.\nDe la musique (ou autre fichier mp3) est diffusée dans le combiné lorsqu'il est décroché.\nLe cadran permet de choisir la piste à lire.\n\n![Un téléphone à cadran et une carte de développement](pyphone.jpg)\n\n## Pré-requis\n\n### Hardware\n\n\n- ESP8266-12F (Nodemcu) flashée avec [MicroPython](https://micropython.org)\n- [DFPlayer mini](https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299) + carte Micro SD\n\n\n### Software\n\n- [esptools](https://github.com/espressif/esptool) pour flasher la carte (`esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ESP8266_GENERIC-20231005-v1.21.0.bin`)\n- [ampy](https://github.com/scientifichackers/ampy) pour uploader le code (`ampy --port /dev/ttyUSB0 put pyphone/main.py`)\n- [picocom](https://github.com/npat-efault/picocom) pour accéder au REPL via le port série ( `picocom /dev/ttyUSB0 -b 115200`)\n\n\n## Montage\n\nNodeMCU **D1** : Combiné (0V si décroché, PULLUP si raccroché)\n\nNodeMCU **D2** : **BUSY** DFPlayer (Low si lecture en cours)\n\nNodeMCU **D4** : **RX** DFPlayer (Transmission de commande lecture/stop)\n\nNodeMCU **D5** : Cadran fil bleu (cf. infra) - Indique si on touche le cadran\n\nNodeMCU **D6** : Cadran fil rouge (cf. infra) - Renvoi les impulsions quand le cadran est relaché\n\nDFPlayer **SPK_2** : Haut-parleur du combiné, fil bleu clair (ajouter une resistance de 4,7k pour atténuer le volume (parasites possibles si resistance trop faible)). Tester également avec **DAC_L**.\n\nNe pas oublier la **masse** pour le nodeMCU, DFPlayer, Haut-parleur (fil rouge (!)) et cadran (fils bleu-blanc et rouge-blanc).\n\n## Carde SD\n\nArborescence : \n\nLes répertoires 001 à 010 correspondent au numéro choisi sur le cadran (`010` pour le zéro).\nLe répartoire `099` est lu en boucle lorsque le combiné est décroché (tonalité d'attente).\n\nSeul le canal gauche est envoyé au combiné.\n\n```\n.\n├── 001/\n│   ├── 001_title.mp3\n│   ├── 002_title.mp3\n│   └── 003_title.mp3\n├── 002/\n│   ├── 001_title.mp3\n│   ├── 002_title.mp3\n│   └── 003_title.mp3\n├── ...\n├── 010/\n│   ├── 001_title.mp3\n│   ├── 002_title.mp3\n│   └── 003_title.mp3\n├── 098/\n│   └── 001_nouveau_message.mp3\n└── 099/\n    └── 001_waiting_tone.mp3\n```\n\n\n## Cadran\n\n![A screenshot of logic analyzer](rotary_logic_screenshot.png)\n\nLa lecture du signal des fils rouge et bleu du cadran permet de récuperer la valeur (1-10) choisie\npar l'utilisateur.\n\nLe signal bleu (_channel 0_) est `TRUE` en temps normal, il passe à `FALSE` dès que l'utilisateur\nactionne le cadran.\n\nLe signal rouge (_channel 1_) est `FALSE`. Il emet _n_ impulsion `TRUE` lorsque le cadran est relaché.\nLa durée d'une impulsion est d'environ 75ms, mais elle est dépendante de la vitesse \nà laquelle le cadran tourne après avoir été relaché. Si l'utilisateur freine le cadran, \nla durée des impulsions peut être fortement rallongée (_cf._ capture). Le temps entre 2 impulsions est\nplus stable (~30ms).\n\n## Remericements\n\nLes contributeurs de [micropython-dfplayer](https://github.com/redoxcode/micropython-dfplayer)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbdesbas%2Fpyphone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjbdesbas%2Fpyphone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbdesbas%2Fpyphone/lists"}