What's Your Network ? Geocache - GC9HE3Z

by feiticeir0 in Circuits > Microcontrollers

941 Views, 11 Favorites, 0 Comments

What's Your Network ? Geocache - GC9HE3Z

Qual e a tua rede ? Gadget cache - GC9HE3Z
Qual_e_a_tua_rede_lista-1.jpg
Qual_e_a_tua_rede_puzzle.jpg

This geocache is a tribute to WiFi, whose invisible signals that make our life easier.

This cache is pretty straightforward, but it should make some people scratch their heads.

Just it's name, it should be enough for people to assume that's something with WiFi.

As soon as you reach the cache, you should place a 9v battery and after 2s, the WiFi signal should start blinking. A new clue.

When you turn on your phone WiFi and see the available networks, this one should appear.

When connected, it should appear a message saying that you need to authenticate to be able to go online (or something similar) - just like when you're connected to a captive portal or hotspot.

When your browser opens the page, instead of a login/password or registration, a "congratulations" page (In Portuguese, but you can change it) appears, with the padlock code.

This was tested with iPhone 12 and older and Android phones.

Because I know that some browsers stay in a loop while trying to open the page, I've included in the cache a piece of paper explaining that, if the mobile phone can't open the page, what's the URL they should navigate to to see the page. But ONLY READ THE PAPER IF THEY HAVE PROBLEMS, or it will spoil the cache.

Supplies

IMG_20220426_225319.jpg
IMG_20220426_225312.jpg

To create this cache we need a Microcontroller with WiFi support.

  • Preferentially a ESP32 or similar.
  • LED Strip, with at least 14 LEDs (my case, yours could be another number - more on that later)
  • 9v battery holder

Why a ESP32 DEVKIT v1

Because this one has VIN PIN and supports 9v input . If you can turn down the voltage requirements, better.

You can use any ESP32 as long as it supports 9v from the VIN or 5V pin. I have ones with the yellow headers, or ESP32-WROOM-32, etc...

For the container some wood scraps enough to build it . See the pictures along the instructable.

Geocaching

"Join the world's largest treasure hunt."

I've been doing Geocaching for a long time now.

I just love discovering new places, the Nature and solving crazy puzzles. The essence of Geocaching is, by solving puzzles, reading clues or by just going straight to the place, to discover a geocache.

A geocache is something (most of the times, a Tupperware) that another geocacher hid (sometimes in plain sight) that coins a logbook, some times some swagg, and, on the rare occasions, a geocoin or a trackable.

The logbook, a piece of paper, is for you to sign, as a testimony that you've been there (you must also log your visit on the geocache page at Geocaching.com) .

The intencion of the Geocacher with that geocache is for you to have fun, solve a crazy puzzle, take your family to walk a rail on a sunny day or just for you to discover a wonderful place.

There are some crazy geocaches out there - some you must solve at night, others require a UV light, some water, for you to use a bycicle pump and others just for you to crack your head thinking of a solution... Or just to spend hours searching for a geocache and never to be found. There's even one Geocache on the International Space Station. Someday, it could be the moon or mars. Imagine when traveling amongst the stars is just like taking a bus to another town (a spaceship to another planet) - Geocaching would be crazy hard ! :)

But, there's another side to it: instead solving other one's caches, create your own, give them a theme, a twist and watch (read) the Geocachers reactions.

Since I was little, I love treasure hunts. I'm from the 80s, and movies like The Goonies just filled one's imagination. Who didn't want to find a pirate's treasure ? Or just like Indiana Jones. Not for the whip, but for the clues, the puzzles, the stories.

Electronics

esquema_bb.png
Screen-Shot-2021-10-30-at-16.11.24.png
Qual a tua rede ? Parte 1 - GC9HE3Z
IMG_20211026_181651.jpg

The LED strip is just to create the WiFi animation. It just gives flare to the cache. My WiFi signal has 3 strips, side by side - 6 LEDs the main strip and 4 each side.

The are connected in series and on the code the index starts from the end to the beginning . In the cache, they were placed upside down.

Why ?

Since they are connected in series, and start from the LED 6 (the last one in the middle row), it will light just the first 2 LEDs (it's the only strip with 6 LEDs), and after that, both the outside strips with start to light up.

See the video for an idea.

To avoid light bleeding, I've placed some separators between the rows.

I've attached the 3D files of the WiFi "waves" . Also, here's a link to the Tinkercad design.

The ESP32 is just below the LEDs.

Downloads

Container

wifi3.jpg
wifi1.jpg

For the container just find some wood and build a rectangle box. I've "split" the container in 2. The top part has the LED animation and behind the ESP32 with all the wiring.

A middle section for the battery connector, the piece of paper for "emergencies only", the padlock and the door lock.

The bottom half is for the logbook, that's kept away by the padlock.

Code

Imagens_pa-gina.jpg

For this cache, we're going to use part of the code that exists on the DNSServer example from the Arduino IDE for the ESP32.

This examples are part of ExpressIF libraries for the ESP32 and can be viewed on Github.

I'm also using the FastLED library for the LEDs.

How does a Captive Portal works ? (not so technical)

Its principle is very simple - you connect to a network and a portal (a webpage) appears for you to authenticate or just agree with some terms and conditions. After that, you're welcome to navigate on the Internet.

From the client device Operating System point of view, the detection of the existence of a Captive Portal is based on a simple verification.

The S.O. connects to the network and tries to go online to a specific URL and verifies that it returns a known result (for the S.O.).

  • If no Captive Portal exists, the result is the expected and it knows (the S.O.) that it has Internet access
  • If the URL returns an unexpected result, then the S.O. knows a Captive Portal is present and it needs to proceed for authentication

There are already RFCs for access points to identify themself as Captive Portals and things run more smootly than now: many times the S.O. doesn't know there's a Captive Portal and it does not open a webpage for authentication.

In our case, as soon as you connect to the network, the ESP32 detects a client and shows our webpage.

It has some more technical details, like the HTTP headers, that indicate the request was successful and the response to the client will be in text/html.

I'm also using FreeRTOS functions to create a thread. That thread will take care of the LEDs animation.

Images

What sort of HTML page was if there isn't any images ?

It's possible to use the ESP32 SPIFF storage to keep the images and use them in the code. But, it's waaaaayyyyy simpler to convert the images to base64 (several websites do just that) and use the base64 code in the image URL HTML tag.

I did just that. It's a lengthy text, but it's much simple. I've attached them here together, but they are separated. They have no specific width or height - just what's better .

Here's an example of one of the images:

<img src="data:image/png;base64,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OTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDoyYzBkYjk5Yy1iNjdmLTQ1YWYtYWYzZC05NjVmM2U2OWQzYmIiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjAwMzAyMDMtNDhjNy00N2YyLThmNGEtYjcyNjJmYzg2ZDgzIgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MDZlOTBjMmMtOGY1OC00MzRlLTg0MzctZWMxNjhmNDU5ODE5IgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTWFjIE9TIgogICBHSU1QOlRpbWVTdGFtcD0iMTYzNDQyMjgwODU4NjQ4NSIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjI0IgogICB0aWZmOk9yaWVudGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAgMi4xMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmY5ZTg5ZjNjLWU3ZmEtNDRlNi05MjZlLTE0MGNiNThjM2YxMyIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDIxLTEwLTE2VDIzOjIwOjA4KzAxOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pja934sAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQflChAWFAioKu8KAAARoUlEQVR42u2ce3RU1b3HP3ufMzOZvF/khUkI72AQVETEilBFiyhKVIqiValLe3vb6wtBaXvro16taJHaqm2VqizRy0Kt1vejKtxVW+sDVJBHCCCv8Ah5TF4zc87e94+hYGBmMhNmJsHMby3WIjk755y9v/v3/T3PFroZzbElfpGJs6tBo1/5/jLg0mNsblMlSelVcgQgFuAXYItu3lEc+BfVlgeVxCI4IJ+ulvzwOifz5jvYtifylfVr+MdnkieXmTz/qsGOPSIiYNbWSq75oZPabSKJBmAe/otRVQpPKzz7gqSlw8HCX/twm+Fv0uqFu+93sOAhiTwAcWYavLDM4sxTbUJZqXqPYM5cEymhf5FOohFMQ1wGzJ1jIwU88bTgiSUmdhcUtfxlkwcWHQIDoLkVZl1lsqs++M7vsOH+hSZvvSe4/HKF2xnbidlafTsAARgzyuaaKwM79qZbDV541USJ0FT1zDMSEeR6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">

I know it's a lot of text, but that's one of the images encoded in base64. In the img href, insted of the path to the image, we place this code. The browser will happily decode it and show the image.

Unfortunatly, to change this code to your local language, you need to understand a bit of HTML to know what to change without messing the code. Every HTML tag has an openning and closing. <title> opens the title tag and </title> closes it.


  • page title : change what's between <title> and </title> - Line 36
  • title: change between <h1> and </h1> - line 39
  • title2: change between <h2> and </h2> - line 42
  • Lock code: <h3> and </h3> - line 43


WiFi animation

The WiFi animation is done in the function wifiSignal, in lines 82 to 94. This function is called from another thread and goes on forever - for (;;) it's a infinite loop.

/*
 * Mostra os LEDs que acendem o sinal wifi
 */
void wifiSignal( void * pvParameters) {
  //Serial.println ("inside leds");
  for (;;) {
    for (int i = NUM_LEDS; i >= 0; i--) {
      leds[i] = CRGB::Blue;
      FastLED.show();
      delay(70);
      leds[i] = CRGB::Black;
      delay(70);
    }
  }
  vTaskDelete(NULL);
}


Change WiFi network name

You can, of course, change your WiFi network name.

What the code does is create wireless network, making the ESP32 like a WiFi router.

The following lines create the network, set it's name and IP addresses. This is done in the setup() function.

WiFi.mode(WIFI_AP);
WiFi.softAP("Qual é a tua rede?");
WiFi.softAPConfig(enderecoIP, enderecoIP, mascara);

The variables enderecoIP and mascara are set in the top of the code. They define the IP address of the ESP32 and it's mask .

IPAddress enderecoIP(192,168,2,1);
IPAddress mascara(255,255,255,0);


Again, this is based on the DNNServer example for Arduino from ExpressIF.

The redirect magic happens in the following line:

 dnsServer.start(DNS_PORT, "*", IPAddress(192,168,2,1));


All requests from the clients (your mobile phone connected to the network) are redirected to the ESP32 .

In the loop() function, the client requests are processed.

If a client is connected, the page is sent to them.

Conclusion

This was a fun cache to create. I already had this idea in my mind and I knew that a ESP32 could do this.

This cache is already published and you can view the page here or search by it's CG code - GC9HE3Z