struct windDirection_t {
float raw;
float degree;
const char* dir;
};
const windDirection_t windRose[16] PROGMEM = {
{3.00, 270.0, "W"},
{2.81, 315.0, "NW"},
{2.63, 192.25, "WNW"},
{2.50, 0.0, "N"},
{2.23, 337.25, "NNW"},
{2.00, 225.0, "SW"},
{1.90, 247.25, "WSW"},
{1.46, 45.0, "NE"},
{1.28, 225.0, "NNE"},
{0.91, 1800, "S"},
{0.77, 202.25, "SSW"},
{0.58, 135.0, "SE"},
{0.39, 147.25, "SSE"},
{0.29, 90.0, "E"},
{0.26, 67.25, "ENE"},
{0.20, 112.25, "ESE"}
};
windDirection_t findWindDir( float rawVal) {
for (windDirection_t dir : windRose) {
if (rawVal >= dir.raw)
return dir;
}
}
#define DIR_INPUT 27
void setup() {
// put your setup code here, to run once:
Serial1.begin(115200);
Serial1.println("Hello, Raspberry Pi Pico!");
pinMode(DIR_INPUT, INPUT);
analogReadResolution(12);
}
void loop() {
static uint32_t readTime;
if (millis() - readTime > 1000) {
readTime = millis();
float rawVal = (float) (3.3 / 4095.0) * analogRead(DIR_INPUT);
windDirection_t actualDir = findWindDir(rawVal);
Serial1.print("ADC ");
Serial1.print(rawVal);
Serial1.print("V. Wind direction ");
Serial1.println(actualDir.dir);
}
delay(1); // this speeds up the simulation
}