weatherclock — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by szaboj0924.

Components

Sketch code

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <time.h>
#include <varoskep.h>

String sunriseTime = "";
String sunsetTime = "";

#define MODE_SWITCH 23
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32

Adafruit_SSD1306 display(
  SCREEN_WIDTH,
  SCREEN_HEIGHT,
  &Wire,
  -1
);

// WiFi
const char* ssid = "test";
const char* password = "test";

// Tárkány
const float LATITUDE = 47.72;
const float LONGITUDE = 18.49;

enum WeatherType {
  SUNNY,
  CLOUDY,
  RAINY,
  SNOWY
};

WeatherType weather = SUNNY;

float temperature = 0;
int humidity = 0;

int frame = 0;

unsigned long lastWeatherUpdate = 0;
const unsigned long WEATHER_INTERVAL = 600000;

// -----------------------
// Nap
// -----------------------
void drawSun()
{
  int cx = 102;
  int cy = 16;

  display.drawCircle(cx, cy, 6, WHITE);

  if (frame % 2)
  {
    display.drawLine(cx, cy - 10, cx, cy - 14, WHITE);
    display.drawLine(cx, cy + 10, cx, cy + 14, WHITE);
    display.drawLine(cx - 10, cy, cx - 14, cy, WHITE);
    display.drawLine(cx + 10, cy, cx + 14, cy, WHITE);
  }
  else
  {
    display.drawLine(cx - 8, cy - 8, cx - 12, cy - 12, WHITE);
    display.drawLine(cx + 8, cy - 8, cx + 12, cy - 12, WHITE);
    display.drawLine(cx - 8, cy + 8, cx - 12, cy + 12, WHITE);
    display.drawLine(cx + 8, cy + 8, cx + 12, cy + 12, WHITE);
  }
}

// -----------------------
// Felhő
// -----------------------
void drawCloud()
{
  int x = 88 + (frame % 3);

  display.fillCircle(x, 14, 5, WHITE);
  display.fillCircle(x + 8, 11, 7, WHITE);
  display.fillCircle(x + 18, 14, 5, WHITE);

  display.fillRect(x, 14, 18, 7, WHITE);
}

// -----------------------
// Eső
// -----------------------
void drawRain()
{
  drawCloud();

  int y = frame % 6;

  display.drawLine(92, 22 + y, 92, 25 + y, WHITE);
  display.drawLine(102, 24 + y, 102, 27 + y, WHITE);
  display.drawLine(112, 22 + y, 112, 25 + y, WHITE);
}

// -----------------------
// Hó
// -----------------------
void drawSnow()
{
  drawCloud();

  int y = frame % 4;

  display.drawPixel(95, 24 + y, WHITE);
  display.drawPixel(104, 22 + y, WHITE);
  display.drawPixel(113, 24 + y, WHITE);
}

// -----------------------
// Open-Meteo kódok
// -----------------------
void convertWeatherCode(int code)
{
  if (code == 0)
  {
    weather = SUNNY;
  }
  else if (
      code == 1 ||
      code == 2 ||
      code == 3 ||
      code == 45 ||
      code == 48)
  {
    weather = CLOUDY;
  }
  else if (
      code == 51 ||
      code == 53 ||
      code == 55 ||
      code == 61 ||
      code == 63 ||
      code == 65 ||
      code == 80 ||
      code == 81 ||
      code == 82 ||
      code == 95)
  {
    weather = RAINY;
  }
  else if (
      code == 71 ||
      code == 73 ||
      code == 75 ||
      code == 77 ||
      code == 85 ||
      code == 86)
  {
    weather = SNOWY;
  }
}

// -----------------------
// Időjárás lekérés
// -----------------------
void getWea