{"id":26138016,"url":"https://github.com/zenitheesc/zoio","last_synced_at":"2026-03-07T05:33:19.730Z","repository":{"id":184745128,"uuid":"672399475","full_name":"zenitheesc/Zoio","owner":"zenitheesc","description":"FSK Image Transmission using an ESP32 CAM board.","archived":false,"fork":false,"pushed_at":"2023-07-30T21:30:13.000Z","size":2344,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-02T20:43:30.630Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zenitheesc.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,"zenodo":null}},"created_at":"2023-07-30T00:23:46.000Z","updated_at":"2025-03-25T16:08:52.000Z","dependencies_parsed_at":"2025-07-02T20:45:25.781Z","dependency_job_id":null,"html_url":"https://github.com/zenitheesc/Zoio","commit_stats":null,"previous_names":["zenitheesc/zoio"],"tags_count":0,"template":false,"template_full_name":"zenitheesc/new-zenith-template","purl":"pkg:github/zenitheesc/Zoio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenitheesc%2FZoio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenitheesc%2FZoio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenitheesc%2FZoio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenitheesc%2FZoio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zenitheesc","download_url":"https://codeload.github.com/zenitheesc/Zoio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zenitheesc%2FZoio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30208731,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T05:23:27.321Z","status":"ssl_error","status_checked_at":"2026-03-07T05:00:17.256Z","response_time":53,"last_error":"SSL_read: 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":[],"created_at":"2025-03-11T01:44:34.605Z","updated_at":"2026-03-07T05:33:19.704Z","avatar_url":"https://github.com/zenitheesc.png","language":"C++","readme":"\u003ch1 align=\"center\" style=\"color:white; background-color:black\"\u003e[Zoio]\u003c/h1\u003e\n\u003ch4 align=\"center\"\u003e[Image transmission using FSK and SX1276 module.]\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"http://zenith.eesc.usp.br/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Zenith-Embarcados-black?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://eesc.usp.br/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Linked%20to-EESC--USP-black?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/blob/main/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/issues\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/commits/main\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/commit-activity/m/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/graphs/contributors\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/contributors/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/commits/main\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/issues\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues-raw/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/${{ env.REPOSITORY_FULL_NAME }}/pulls\"\u003e\n    \u003cimg src = \"https://img.shields.io/github/issues-pr-raw/${{ env.REPOSITORY_FULL_NAME }}?style=for-the-badge\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cimg title=\"The Zoio Board\" alt=\"Alt text\" src=\"/images/Board.jpg\"\u003e\n\n## What am I looking at?\n\nThat is exactly the purpose of this project, to show us what our stratospheric sensors see during flight.\nJokes aside, this project was born to experiment with and learn about real-time image transmission processes.\n\nZoio is a funny name for \"eye\" in portuguese, so that is how we named the project.\n\nIt uses an ESP32 CAM board as a base, connected to a handmade breakout board that contains an SX1276 radio and an indicator LED. Everything was powered using an 18650 Li-ion battery with a 5V power converter from AliExpress. Pretty simple yet good enough.\n\n## Environment and tools\n\nAll done with the Arduino IDE v2.0.\n\nThe code for the radio and FSK functions was also made by us because, at the time, no FSK-able libraries existed. It can be found here: [SX127X-FSK-LoRa](https://github.com/JulioCalandrin/SX127X-FSK-LoRa). The only changes made were altering the pin write and SPI functions to the Arduino ones.\n\n\n## The transmitter:\n\nThe transmitter code is pretty straight-forward and a little caotic because it was made in a hurry, as was everything else in this project. It begins by taking a picture with the standard Arduino ESP32 CAM functions. It returns a vector that contains the byte stream that, when saved with the .jpg extension, becomes an image.\n\nAll we did was send all of those bytes in 255-byte packets, without any encoding, using FSK. The first packet acts as a header, containing how many packets are going to be transmitted. The following packets contain the actual byte stream that forms the photo. Yes, this is a bad idea, since lost packets break the jpg, but transmitting the entire raw file would be impractical.\n\n## The receiver\n\nOn the receiver side of things, a TTGO board was used for simplicity, simply receiving the packets, extracting the byte stream, and dumping it into the serial port once all packets were received in order to be processed by another piece of software that collects, saves, and displays the photos. It's repository can be found here: [Zenith Picture Receiver](https://github.com/zenitheesc/Zenith-Picture-Receiver/tree/main). If at least half of the total packets were successfully received, the receiver dumps the data anyway, in case the jpg is partially usable.\n\n## Benchmark\n\nThe transmission and reception of a 400x296-pixel image takes about two seconds at 38.4 kbps. The SX1276 FSK can go faster, but since we're dealing with 255 byte packets, which is greater than the 63 byte FIFO size of the module (for FSK packets), we have to use pooling to fill and defill the FIFO in real time, hence, a bottleneck occurs because of the SPI and system speed. I did not have the time to investigate where the bottleneck actually lies, but a lot of optimization can be done to increase the transfer speed.\n\n\n## Problems\n\nIn the lab, it works pretty well and is pretty stable. Transmitting and receiving many images, with a few damaged images here and there. When you start increasing the distance from the transmitter, images get choppier and more damaged.\n\nWhen we put the board and battery into the styrofoam balls used to launch things with the baloon (necessary to protect against the -70 degree Celsius air in the stratosphere), it started overheating when on the ground, because the ESP32 peaks at 200 mA when taking a picture and 100 mA when transmitting. When this happened, the ESP32 would reset and require a manual reset to start working again. Attemps were made to put it into a low-power mode with very little success, and it seems the high power consumption is a known problem with the ESP32 CAM boards.\n\nWe actually tried testing it on a sonde flight, but in the hurry of tracking it, we forgot to actually use the receiving software, so our images were lost since we did not implement any SD Card functionality. And that takes us to another problem: the SD card. The SX1276 radio is using SPI, which interferes with the SD card pins, so unfortunately I could not get both things to work at the same time using the Arduino libraries.\n\n\n## Some good pictures we took while testing :)\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"Us and new students at the USP Opportunity Fair\" alt=\"Alt text\" src=\"/images/good/2023-03-16_11h13m40s.jpg\"\u003e\n\u003cbr\u003e\nUs and new students at the USP Opportunity Fair\n\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"Marcus and the Zenth logo\" alt=\"Alt text\" src=\"/images/good/2023-03-16_11h35m45s.jpg\"\u003e\n\u003cbr\u003e\nMarcus and the Zenth logo\n\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"The University of São Paulo decade Archs\" alt=\"Alt text\" src=\"/images/good/2023-03-16_11h57m34s.jpg\"\u003e\n\u003cbr\u003e\nThe University of São Paulo decade Archs\n\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"Stairs\" alt=\"Alt text\" src=\"/images/good/2023-03-16_11h57m49s.jpg\"\u003e\n\u003cbr\u003e\nStairs\n\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"The E1 admnistration building\" alt=\"Alt text\" src=\"/images/good/2023-03-16_11h57m20s.jpg\"\u003e\n\u003cbr\u003e\nThe E1 admnistration building\n\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"The E1 garden and trees - crooked\" alt=\"Alt text\" src=\"/images/good/2023-03-16_12h01m21s.jpg\"\u003e\n\u003cbr\u003e\nThe E1 garden and trees - crooked\n\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"Me\" alt=\"Alt text\" src=\"/images/good/2023-03-16_11h41m19s.jpg\"\u003e\n\u003cbr\u003e\nMe\n\u003cbr\u003e\n\u003c/p\u003e\n\n\n## Some damaged pictures we took while testing :(\n\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"\" alt=\"Alt text\" src=\"/images/broken/2023-03-16_12h00m12s.jpg\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"\" alt=\"Alt text\" src=\"/images/broken/2023-03-16_12h00m17s.jpg\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg title=\"\" alt=\"Alt text\" src=\"/images/broken/2023-03-16_12h02m37s.jpg\"\u003e\n\u003c/p\u003e\n\n\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"http://zenith.eesc.usp.br\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Check%20out-Zenith's Oficial Website-black?style=for-the-badge\" /\u003e\n    \u003c/a\u003e \n    \u003ca href=\"https://www.facebook.com/zenitheesc\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Like%20us%20on-facebook-blue?style=for-the-badge\"/\u003e\n    \u003c/a\u003e \n    \u003ca href=\"https://www.instagram.com/zenith_eesc/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Follow%20us%20on-Instagram-red?style=for-the-badge\"/\u003e\n    \u003c/a\u003e\n\n\u003c/p\u003e\n\u003cp align = \"center\"\u003e\n\u003ca href=\"zenith.eesc@gmail.com\"\u003ezenith.eesc@gmail.com\u003c/a\u003e\n\u003c/p\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzenitheesc%2Fzoio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzenitheesc%2Fzoio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzenitheesc%2Fzoio/lists"}