Windmolen Code.

Arduino specifieke Software
Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Windmolen Code.

Berichtdoor Breeze360 » 19 Apr 2023, 18:13

Al bijna twee jaar ben ik bezig met het ontwerpen en bouwen van een verticale windturbine (VAWT). Omdat ik graag wil weten hoe iets werkt, ben ik nu op het punt beland dat ik metingen moet gaan verrichten om te bepalen hoe de molen presteert. De belangrijkste informatie die ik nodig heb, is de gemiddelde rotatiesnelheid van de molen en het aantal omwentelingen dat deze gemiddeld maakt. Daarnaast wil ik graag weten wat het effectieve verschil is tussen de windsnelheid gemeten door een anemometer met één hall effect sensor en het aantal omwentelingen dat wordt gemeten over een bepaalde tijdsduur.

Deze metingen geven een zo goed mogelijk beeld van de werkelijkheid door het meten van het effectieve verschil, dat wordt weergegeven in procenten. Het effectieve verschil is belangrijk omdat dit gedurende een aantal weken een waarde oplevert. Wanneer ik de stand van de wieken verander, bijvoorbeeld van 0 naar 5, 10 of 15 graden, moet er over dezelfde periode een meetbaar verschil zijn. Op deze manier kan ik de molen optimaal laten presteren en zo efficiënt mogelijk maken.

De gegevens die op het scherm moeten worden weergegeven, zijn:

Windsnelheid in m/s
Beschrijving van de windsnelheid
Gemiddelde windsnelheid van de afgelopen 10 minuten in m/s
Maximale windsnelheid van de afgelopen 10 minuten in m/s
Real-time RPM van de windmolen
Gemiddelde RPM van de afgelopen 10 minuten
Maximale RPM van de afgelopen 10 minuten
Verhouding tussen windsnelheid en RPM
Aantal keren dat de rem deze maand is geactiveerd
Huidige status van de windmolen (aan of uit)
Hieronder vindt u een voorbeeld van de weergave van deze gegevens met fictieve waarden:

Wind: 2,3 m/s = zwakke wind | gemiddeld: 32 km/u | maximaal: 55
RPM real-time: 254 | gemiddeld: 167 | maximaal: 287
Windsnelheid ten opzichte van RPM = 5%
Rem: 3 keer geactiveerd deze maand
Huidige status van de windmolen: rem

Mijn probleem is dat ik er op de een of andere manier niet in slaag om de code perfect te krijgen. Advies is heel erg welkom!


void loop() {
unsigned long currentMillis = millis(); // Huidige millis-tijd

// Bereken de gemiddelde windsnelheid en RPM
if (currentMillis - previousMillis >= interval) {
// Bereken de gemiddelde windsnelheid
windSpeed = calculateWindSpeed();
avgWindSpeed = (anemometerCount / 10.0) / (interval / 1000.0 / 3600.0);
maxWindSpeed = max(maxWindSpeed, windSpeed);
anemometerCount = 0; // Reset de anemometercount

// Bereken de gemiddelde RPM
rpm = calculateRpm();
avgRpm = hallEffectCount / (interval / 1000.0) * 60.0;
maxRpm = max(maxRpm, rpm);
hallEffectCount = 0; // Reset de Hall-effect count

// Bereken het percentage verschil tussen windsnelheid en RPM
percentageDifference = abs((windSpeed - rpm) / ((windSpeed + rpm) / 2.0)) * 100.0;

// Update de vorige millis-tijd
previousMillis = currentMillis;
}

// Stuur de windsnelheid, RPM en percentage verschil naar het LCD-scherm
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wind: ");
lcd.print(windSpeed);
lcd.print(" m/s");

lcd.setCursor(0, 1);
lcd.print("RPM: ");
lcd.print(rpm);

lcd.setCursor(10, 1);
lcd.print("Diff: ");
lcd.print(percentageDifference, 2);
lcd.print("%");

// Activeer de rem als het verschil tussen windsnelheid en RPM te groot is
if (percentageDifference >= 20.0 && brakeState == 0) {
digitalWrite(SERVO_PIN, HIGH); // Activeer de rem
brakeActiveTime = currentMillis; // Reset de tijd waarop de rem actief is
brakeState = 1; // Verander de remstaat naar "aan"
}

// Deactiveer de rem als deze al lang genoeg actief is
if (brakeState == 1 && currentMillis - brakeActiveTime >= 5000) {
digitalWrite(SERVO_PIN, LOW); // Deactiveer de rem
totalBrakeActiveTime += currentMillis - brakeActiveTime; // Voeg de actieve remtijd toe aan het totaal
brakeState = 0; // Verander de remstaat naar "uit"
}

// Update het LCD-scherm met de totale actieve remtijd als de rem uit staat
if (brakeState == 0) {
lcd.setCursor(0, 2);
lcd.print("Brake: ");
lcd.print(totalBrakeActiveTime / 1000);
lcd.print(" sec");
}

delay(100); // Wacht 100 milliseconden
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Windmolen Code.

Berichtdoor shooter » 20 Apr 2023, 13:16

te veel fouten dus die eerst even oplossen dan de code
Code: Alles selecteren

void setup() {
  // put your setup code here, to run once:
  // mist in jouw programma
  // doe eens Ctrl T van automatische opmaak
  /*en dan proberen te compileren en dan de staat er een fout in het rood (of meerdere en die moet je dus eerst maar eens oplossen
  want er staan dermate veel fouten in dat het onbegonnen werk is
  */
}


void loop() {
  unsigned long currentMillis = millis(); // Huidige millis-tijd

  // Bereken de gemiddelde windsnelheid en RPM
  if (currentMillis - previousMillis >= interval) // wat is de interval want de setup zie ik niet
  //previousMillis=currentMillis mist hier dus hij blijft in deze loop
  {
    // Bereken de gemiddelde windsnelheid
    windSpeed = calculateWindSpeed(); // je doet hier calculatewindspeed maar waar is de functie?
    avgWindSpeed = (anemometerCount / 10.0) / (interval / 1000.0 / 3600.0); //wat is /1000/3600 dat moet dus zijn 3600000 zijn en dus een long int
    //en wat is anemometercount en waar komt die vandaan
    maxWindSpeed = max(maxWindSpeed, windSpeed);
    anemometerCount = 0; // Reset de anemometercount

    // Bereken de gemiddelde RPM
    rpm = calculateRpm();
    avgRpm = hallEffectCount / (interval / 1000.0) * 60.0;
    maxRpm = max(maxRpm, rpm);
    hallEffectCount = 0; // Reset de Hall-effect count

    // Bereken het percentage verschil tussen windsnelheid en RPM
    percentageDifference = abs((windSpeed - rpm) / ((windSpeed + rpm) / 2.0)) * 100.0;

    // Update de vorige millis-tijd
    previousMillis = currentMillis;
  }

  // Stuur de windsnelheid, RPM en percentage verschil naar het LCD-scherm
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Wind: ");
  lcd.print(windSpeed);
  lcd.print(" m/s");

  lcd.setCursor(0, 1);
  lcd.print("RPM: ");
  lcd.print(rpm);

  lcd.setCursor(10, 1);
  lcd.print("Diff: ");
  lcd.print(percentageDifference, 2);
  lcd.print("%");

  // Activeer de rem als het verschil tussen windsnelheid en RPM te groot is
  if (percentageDifference >= 20.0 && brakeState == 0) {
    digitalWrite(SERVO_PIN, HIGH); // Activeer de rem
    brakeActiveTime = currentMillis; // Reset de tijd waarop de rem actief is
    brakeState = 1; // Verander de remstaat naar "aan"
  }

  // Deactiveer de rem als deze al lang genoeg actief is
  if (brakeState == 1 && currentMillis - brakeActiveTime >= 5000) {
    digitalWrite(SERVO_PIN, LOW); // Deactiveer de rem
    totalBrakeActiveTime += currentMillis - brakeActiveTime; // Voeg de actieve remtijd toe aan het totaal
    brakeState = 0; // Verander de remstaat naar "uit"
  }

  // Update het LCD-scherm met de totale actieve remtijd als de rem uit staat
  if (brakeState == 0) {
    lcd.setCursor(0, 2);
    lcd.print("Brake: ");
    lcd.print(totalBrakeActiveTime / 1000);
    lcd.print(" sec");
  }

  delay(100); // Wacht 100 milliseconden
}

en dan hier neerzetten en afwachten op commentaar
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Re: Windmolen Code.

Berichtdoor Breeze360 » 20 Apr 2023, 14:27

Vanmorgen er nog even mee bezig geweest, nu heb ik niet veel ervaring met code schrijven “danst blijkt ook maar weer eens dus!”

void loop() {
unsigned long currentMillis = millis(); // Huidige millis-tijd

// Bereken de gemiddelde windsnelheid en RPM
if (currentMillis - previousMillis >= interval) {
// Bereken de gemiddelde windsnelheid
windSpeed = calculateWindSpeed();
avgWindSpeed = (anemometerCount / 10.0) / (interval / 1000.0 / 3600.0);
maxWindSpeed = max(maxWindSpeed, windSpeed);
anemometerCount = 0; // Reset de anemometercount

// Bereken de gemiddelde RPM
rpm = calculateRpm();
avgRpm = hallEffectCount / (interval / 1000.0) * 60.0;
maxRpm = max(maxRpm, rpm);
hallEffectCount = 0; // Reset de Hall-effect count

// Bereken het percentage verschil tussen windsnelheid en RPM
percentageDifference = abs((windSpeed - rpm) / ((windSpeed + rpm) / 2.0)) * 100.0;

// Update de vorige millis-tijd
previousMillis = currentMillis;
}

// Stuur de windsnelheid, RPM en percentage verschil naar het LCD-scherm
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wind: ");
lcd.print(windSpeed);
lcd.print(" m/s");

lcd.setCursor(0, 1);
lcd.print("RPM: ");
lcd.print(rpm);

lcd.setCursor(10, 1);
lcd.print("Diff: ");
lcd.print(percentageDifference, 2);
lcd.print("%");

// Activeer de rem als het verschil tussen windsnelheid en RPM te groot is
if (percentageDifference >= 20.0 && brakeState == 0) {
digitalWrite(SERVO_PIN, HIGH); // Activeer de rem
brakeActiveTime = currentMillis; // Reset de tijd waarop de rem actief is
brakeState = 1; // Verander de remstaat naar "aan"
}

// Deactiveer de rem als deze al lang genoeg actief is
if (brakeState == 1 && currentMillis - brakeActiveTime >= 5000) {
digitalWrite(SERVO_PIN, LOW); // Deactiveer de rem
totalBrakeActiveTime += currentMillis - brakeActiveTime; // Voeg de actieve remtijd toe aan het totaal
brakeState = 0; // Verander de remstaat naar "uit"
}

// Update het LCD-scherm met de totale actieve remtijd als de rem uit staat
if (brakeState == 0) {
lcd.setCursor(0, 2);
lcd.print("Brake: ");
lcd.print(totalBrakeActiveTime / 1000);
lcd.print(" sec");
}

delay(100); // Wacht 100 milliseconden
}

Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Re: Windmolen Code.

Berichtdoor Breeze360 » 20 Apr 2023, 19:30

Ik had vanmorgen al even een reactie geplaatst, al zag ik later dat deze code al weer erg achterhaald was die ik “geprobeerd” tee verbeteren :-( tja had ook eerst koffie moeten drinken lol.
Hopelijk is dit nu beter:

#include <LiquidCrystal.h>
#include <Servo.h>

// Hardware-aansluitingen
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // RS, E, D4, D5, D6, D7
Servo remServo; // Servo motor voor remmen

const int anemometerPin = 2; // Anemometer aansluiting op digitale pin 2
const int rpmPin = 3; // Hall-effectsensor aansluiting op digitale pin 3

// Windmetingen
volatile unsigned long anemometerTeller = 0;
float windsnelheid = 0.0;
float gemiddeldeWindsnelheid = 0.0;
float maxWindsnelheid = 0.0;

// RPM-metingen
volatile unsigned long rpmTeller = 0;
float rpm = 0.0;
float gemiddeldeRpm = 0.0;
float maxRpm = 0.0;
unsigned long totaleDraaitijd = 0;
float effectiefVerschil = 0.0;

// Remfunctie
unsigned long remActiefTijd = 0;
bool remStatus = false;
unsigned long remStartTijd = 0;

// Menu-items
const int REAL_TIME_KLOK = 1;
const int WINDSNELHEID = 2;
const int RPM = 3;
const int REMSTATUS = 4;
int huidigMenu = REAL_TIME_KLOK;

void setup() {
// Start de seriële communicatie
Serial.begin(9600);

// Initialiseer de LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Hoofdmenu");

// Initialiseer de rem
remServo.attach(10);
remServo.write(0);

// Interrupts instellen
attachInterrupt(digitalPinToInterrupt(anemometerPin), anemometerTellerInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(rpmPin), rpmTellerInterrupt, FALLING);
}

void loop() {
switch (huidigMenu) {
case REAL_TIME_KLOK:
toonRealTimeKlok();
break;
case WINDSNELHEID:
toonWindSnelheid();
break;
case RPM:
toonRpm();
break;
case REMSTATUS:
toonRemStatus();
break;
}
}

// Interrupt voor anemometer
void anemometerTellerInterrupt() {
anemometerTeller++;
}

// Interrupt voor RPM-sensor
void rpmTellerInterrupt() {
rpmTeller++;
}

// Zet seconden om in string formaat
String tijdNaarString(unsigned long seconden) {
String tijdStr = "";

int uren = seconden / 3600;
int minuten = (seconden % 3600) / 60;
int secs = (seconden % 3600) % 60;

if (uren < 10) {
tijdStr += "0";
}
tijdStr += uren;
tijdStr += ":";

if (minuten < 10) {
tijdStr += "0";
}
tijdStr += minuten;

tijdStr += ":";

if (secs < 10) {
tijdStr += "0";
}
tijdStr += secs;

return tijdStr;
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Windmolen Code.

Berichtdoor shooter » 21 Apr 2023, 10:52

ja dat is een aardig begin, nu steeds een stukje van de code erbij zetten en regelmatig bewaren en proberen of de code ook compileert en of het werkt zoals je wilt. dus nu je lcd op tijd bedienen maar ook serial niet te snel zetten want dan raken de buffers vol.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Re: Windmolen Code.

Berichtdoor Breeze360 » 21 Apr 2023, 17:05

Inmiddels één Display LCD keypad shield (heeft 5 drukknoppen) terug gevonden in een oude doos.
Waar de volgende info op (zou moeten) komen te staan.
Hoofdmenu:
Druk op de pijltoetsen omhoog of omlaag om door de opties te bladeren. Druk op Enter om te selecteren.

1. Real-time klok
2. Wind snelheid
3. RPM
4. Rem status

Real-time klok:
12:34:56

Wind snelheid:

Huidige windsnelheid: 10,5 m/s
Gemiddelde windsnelheid: 8.7 m/s
Maximum windsnelheid: 15.2 m/s
Effectief verschil: 1.8 m/s

RPM:
Huidige: 1500
Gemiddelde: 1200
Maximum: 1800

Remstatus:
Actief: Ja
Rem Actief Totaal: 34 minuten
Rem: 5x deze maand
Laatste rem actie op: 21-04-2023 om 00:15:23

Tot nu toe ben ik zo ver met de code hier voor.
#include <LiquidCrystal.h>
#include <Servo.h>

// Hardware-aansluitingen
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // RS, E, D4, D5, D6, D7
Servo remServo; // Servo motor voor remmen

const int anemometerPin = 2; // Anemometer aansluiting op digitale pin 2
const int rpmPin = 3; // Hall-effectsensor aansluiting op digitale pin 3

// Windmetingen
volatile unsigned long anemometerTeller = 0;
float windsnelheid = 0.0;
float gemiddeldeWindsnelheid = 0.0;
float maxWindsnelheid = 0.0;

// RPM-metingen
volatile unsigned long rpmTeller = 0;
float rpm = 0.0;
float gemiddeldeRpm = 0.0;
float maxRpm = 0.0;
unsigned long totaleDraaitijd = 0;
float effectiefVerschil = 0.0;

// Remfunctie
unsigned long remActiefTijd = 0;
bool remStatus = false;
unsigned long remStartTijd = 0;

// Menu-items
const int REAL_TIME_KLOK = 1;
const int WINDSNELHEID = 2;
const int RPM = 3;
const int REMSTATUS = 4;
int huidigMenu = REAL_TIME_KLOK;

void setup() {
// Start de seriële communicatie
Serial.begin(9600);

// Initialiseer de LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Hoofdmenu");

// Initialiseer de rem
remServo.attach(10);
remServo.write(0);

// Interrupts instellen
attachInterrupt(digitalPinToInterrupt(anemometerPin), anemometerTellerInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(rpmPin), rpmTellerInterrupt, FALLING);
}

void loop() {
// Dit is nu leeg omdat we de berekeningen naar de interrupt-functies hebben verplaatst
}

// Interrupt voor anemometer
void anemometerTellerInterrupt() {
anemometerTeller++;

// Bereken de windsnelheid
unsigned long tijdTussenWindvlaag = millis() - remStartTijd;
if (tijdTussenWindvlaag > 500) {
windsnelheid = (float)anemometerTeller / (tijdTussenWindvlaag / 1000.0) * 2.4; // 2.4 is de omtrek van de anemometer in meter
gemiddeldeWindsnelheid = ((gemiddeldeWindsnelheid * (totaleDraaitijd / 1000.0)) + windsnelheid) / ((totaleDraaitijd / 1000.0) + (tijdTussenWindvlaag / 1000.0));
maxWindsnelheid = max(maxWindsnelheid, windsnelheid);
anemometerTeller = 0;
remStartTijd = millis();
}
}

// Interrupt voor RPM-sensor
void rpmTellerInterrupt() {
rpmTeller++;

// Bereken de RPM
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Windmolen Code.

Berichtdoor shooter » 22 Apr 2023, 09:56

de interupt moeten zo kort mogelijk zijn dus jouw oplossing metteller++ was goed, en als er dan gerekend moet worden kun je beter in de loop zetten net als display en serial.
heb je het al een beetje aan de gang zoals met je sensoren en je display zet een serial.print om de waarden te kunnen zien en fouten te vinden
je zult ook nog een windrichting erbij moeten zetten en een array met waarnemingen en ee RTC voor de tijd want zeker in het begin wordt er nog vaak gereset of een monitor gestart
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Re: Windmolen Code.

Berichtdoor Breeze360 » 22 Apr 2023, 17:54

Een windrichting is niet echter nodig, ik ben met een “verticale windmolen "VAWT" bezig. De afgelopen maanden heb ik wat video’s gemaakt op YouTube https://youtube.com/@breeze-36 Komende week zal even verder met de code verbeter en met de bouw van de molen, de wieken moeten gemaakt worden en onderdelen gelast worden. Nog werk zat om te doen.. pffff (met voor onderzoek er bij gerekend er al bijna twee jaar mee bezig)

Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Re: Windmolen Code.

Berichtdoor Breeze360 » 26 Apr 2023, 14:22

Hopelijk is deze code beter nu, tips zijn welkom of op welke manier de code wel goed zou werken!:

#include <Keypad.h>
#include <LiquidCrystal.h>

// Define keypad shield pins
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Define LCD pins
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

// Define menus and values
String menu[] = {
"Real time klok",
"Windsnelheid",
"RPM",
"Remstatus"
};

String klok[] = {
"20-05-2023",
"15:45:32"
};

// Define pins for anemometer and hall effect sensor
const int AnemometerPin = 2;
const int HallEffectSensorPin = 3;

// Constants for wind speed calculation
const float AnemometerFactor = 2.4; // m/s per pulse
const unsigned long CalibrationInterval = 60000; // Calibration interval in milliseconds
const unsigned long SampleInterval = 5000; // Sample interval in milliseconds
const int SampleCount = 12; // Number of samples for averaging
const int GustSampleCount = 4; // Number of samples for gust measurement
const float GustFactor = 1.5; // Factor to amplify gust measurement

// Variables for wind speed calculation
volatile unsigned long PulseCount;
float WindSpeed;
float GustSpeed;
unsigned long LastSampleTime;
float WindSpeedSamples[SampleCount];
float GustSpeedSamples[GustSampleCount];

// Variables for RPM calculation
volatile unsigned long RPMCount;
unsigned long LastRPMTime;
float RPM;

// Constants for wind speed classification
const int WindSpeedClassCount = 13;
const char* WindSpeedClassNames[WindSpeedClassCount] = {
"0 - Windstil",
"1 - Zeer zwakke wind",
"2 - Zwakke wind",
"3 - Zeer matige wind",
"4 - Matige wind",
"5 - Vrij krachtige wind",
"6 - Krachtige wind",
"7 - Harde wind",
"8 - Stormachtige wind",
"9 - Storm",
"10 - Zware storm",
"11 - Zeer zware storm",
"12 - Orkaan"
};
const float WindSpeedClassLimits[WindSpeedClassCount] = {
0.2,
1.5,
3.3,
5.4,
7.9,
10.7,
13.8,
17.1,
20.7,
24.4,
28.4,
32.6 // Added limit for wind speed class 13
};

void setup() {
// Initialize LCD
lcd.begin(16, 2);

// Configure anemometer pin
pinMode(AnemometerPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(AnemometerPin), AnemometerISR, FALLING);

// Configure hall effect sensor pin
pinMode(HallEffectSensorPin, INPUT_PULLUP);
}

void loop() {
// Calculate wind speed
unsigned long TimeDelta = millis() - LastSampleTime;
if (TimeDelta >= SampleInterval) {
float WindSpeedSum = PulseCount * AnemometerFactor;
WindSpeed = WindSpeedSum / ((float)SampleCount * ((float)TimeDelta / 1000.0));
WindSpeed = WindSpeed * 3.6; // Convert to km/h
LastSampleTime = millis(); // Update last sample time
PulseCount = 0; // Reset pulse count
}

// Calculate gust speed
if (PulseCount > 0) {
float GustSpeedSum = 0;
for (int i = 0; i < GustSampleCount; i++) {
GustSpeedSamples[i] = PulseCount * AnemometerFactor;
GustSpeedSum += GustSpeedSamples[i];
delay(10);
}
GustSpeed = (GustSpeedSum / (float)GustSampleCount) * GustFactor;
} else {
GustSpeed = 0;
}

// Calculate RPM
unsigned long RPMDelta = millis() - LastRPMTime;
if (RPMDelta >= 60000) {
RPM = ((float)RPMCount / 2.0) * 60.0;
RPMCount = 0;
LastRPMTime = millis();
}

// Display wind speed and RPM on LCD
lcd.setCursor(0, 1);
lcd.print("Wind: ");
lcd.print(WindSpeed, 1);
lcd.print(" km/h");
lcd.setCursor(10, 1);
lcd.print("RPM: ");
lcd.print(RPM, 0);

// Determine wind speed class
int WindSpeedClass = 0;
while (WindSpeedClass < WindSpeedClassCount && WindSpeed > WindSpeedClassLimits[WindSpeedClass]) {
WindSpeedClass++;
}

// Display wind speed class on LCD
lcd.setCursor(0, 0);
lcd.print(WindSpeedClassNames[WindSpeedClass]);

// Wait for a moment before repeating loop
delay(100);
}

Berichten: 9
Geregistreerd: 19 Apr 2023, 16:55

Re: Windmolen Code.

Berichtdoor Breeze360 » 02 Mei 2023, 20:00

Inmiddels de code eigenlijk geheel veranderd, simpelweg om dat ik een berg code vergeten was!

#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>

// Define MAC and IP addresses for Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Define pins for anemometer and hall effect sensor
const int AnemometerPin = 2;
const int HallEffectSensorPin = 3;

// Constants for wind speed calculation
const float AnemometerFactor = 2.4; // m/s per pulse
const unsigned long CalibrationInterval = 60000; // Calibration interval in milliseconds
const unsigned long SampleInterval = 5000; // Sample interval in milliseconds
const int SampleCount = 12; // Number of samples for averaging
const int GustSampleCount = 4; // Number of samples for gust measurement
const float GustFactor = 1.5; // Factor to amplify gust measurement

// Variables for wind speed calculation
volatile unsigned long PulseCount;
float WindSpeed;
float GustSpeed;
unsigned long LastSampleTime;
float WindSpeedSamples[SampleCount];
float GustSpeedSamples[GustSampleCount];

// Variables for RPM calculation
volatile unsigned long RPMCount;
unsigned long LastRPMTime;
float RPM;

// Constants for wind speed classification
const int WindSpeedClassCount = 13;
const char* WindSpeedClassNames[WindSpeedClassCount] = {
"0 - Windstil",
"1 - Zeer zwakke wind",
"2 - Zwakke wind",
"3 - Zeer matige wind",
"4 - Matige wind",
"5 - Vrij krachtige wind",
"6 - Krachtige wind",
"7 - Harde wind",
"8 - Stormachtige wind",
"9 - Storm",
"10 - Zware storm",
"11 - Zeer zware storm",
"12 - Orkaan"
};
const float WindSpeedClassLimits[WindSpeedClassCount] = {
0.2,
1.5,
3.3,
5.4,
7.9,
10.7,
13.8,
17.1,
20.7,
24.4,
28.4,
32.6, // Added limit for wind speed class 13
};

// Initialize Ethernet server
EthernetServer server(80);

void setup() {
// Initialize LCD
lcd.begin(16, 2);

// Configure anemometer pin
pinMode(AnemometerPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(AnemometerPin), AnemometerISR, FALLING);

// Configure hall effect sensor pin
pinMode(HallEffectSensorPin, INPUT_PULLUP);

// Start Ethernet connection
Ethernet.begin(mac, ip);

// Start Ethernet server
server.begin();
}

void loop() {
// Handle client requests
EthernetClient client = server.available();
if (client) {
handleClientRequest(client);
}

// Calculate wind speed
unsigned long TimeDelta = millis() - LastSampleTime;
if (TimeDelta >= SampleInterval) {
float WindSpeedSum = PulseCount * AnemometerFactor;
WindSpeed = WindSpeedSum / ((float)SampleCount * ((float)TimeDelta / 1000.0));
WindSpeed = WindSpeed * 3.6; // Convert to km/h
LastSampleTime = millis(); // Update last sample time
PulseCount = 0; // Reset pulse count
}

// Calculate gust speed
if (PulseCount > 0) {
float GustSpeedSum = 0;
for (int i = 0; i < GustSampleCount; i++) {
GustSpeedSamples[i] = PulseCount * AnemometerFactor;
GustSpeedSum += GustSpeedSamples[i];
delay(10);
}
GustSpeed = (GustSpeedSum / (float)GustSampleCount) * GustFactor;
} else {
GustSpeed = 0;
}
// Calculate RPM
unsigned long RPMDelta = millis() - LastRPMTime;
if (RPMDelta >= 60000) {
RPM = ((float)RPMCount / 2.0) * 60.0;
RPMCount = 0;
LastRPMTime = millis();
}
// Display wind speed and RPM on LCD
lcd.setCursor(0, 1);
lcd.print("Wind: ");
lcd.print(WindSpeed, 1);
lcd.print(" km/h");
lcd.setCursor(10, 1);
lcd.print("RPM: ");
lcd.print(RPM, 0);
// Determine wind speed class
int WindSpeedClass = 0;
while (WindSpeedClass < WindSpeedClassCount && WindSpeed > WindSpeedClassLimits[WindSpeedClass]) {
WindSpeedClass++;
}
// Display wind speed class on LCD
lcd.setCursor(0, 0);
lcd.print(WindSpeedClassNames[WindSpeedClass]);

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: erteyebo, Stevedum en 23 gasten