We zijn er bijna.....

algemene C code
Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

We zijn er bijna.....

Berichtdoor Dries » 02 Feb 2017, 23:07

ik ben met de controller bezig met volgende functies: zon-op en zon-ondergang, thermostaat + doseerpomp voor sporenelementen. Alles werkt behalve de doseerpomp, de uitgang op pin 52 wordt aangestuurd maar blijft aangestuurd in de functie "doseerpomp" terwijl deze maar 15 seconden zou moeten aangestuurd worden welke in de interval wordt bepaald.

de Code:

#include <Wire.h>
#include "RTClib.h"
#include "ChannelManager.h"
#include "Nextion.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 22
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int MaxChannels = 1; // Max number of channels, change if more or less are required
const int MaxPoints = 10; // Max number of light intensity points, change if more or less are required
RTC_DS1307 RTC;
DateTime CurrentTime;
char buffer[10] = {0};
uint32_t number = 0;
int thermostaat = 37;
int pomp = 52;
int State = LOW;
unsigned long previousMillis = 0;
const long interval = 15000;
NexProgressBar j0 = NexProgressBar(0, 3, "j0");
NexText percentage = NexText(0, 4, "t1");
NexText temperature = NexText(0, 5, "t0");
NexText uur = NexText(0, 1, "t5");
NexText minuten = NexText(0, 2, "t7");
char buffer_hour[10] = {0};
char buffer_minute[10] = {0};




Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];

void InitializeChannels(int channels) {


// Channel 0:
int channelNo = 0; // Currently editing channel 0
int pin = 3; // Channel 0 uses pin 10
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); // Initialize channel and choose FadeMode
Channels[channelNo].AddPoint(6, 0, 0); // Add Point (can also use decimal values ranging from 0 to 1 if you prefer)
Channels[channelNo].AddPoint(10, 0, 255);
Channels[channelNo].AddPoint(10, 30, 190);
Channels[channelNo].AddPoint(21, 30, 190);
Channels[channelNo].AddPoint(22, 0, 255);
Channels[channelNo].AddPoint(23, 59, 0);


}


long lastUpdateTime = 0;


void UpdateLights(DateTime currentTime)
{
long now = Seconds(currentTime.hour(), currentTime.minute(), currentTime.second());
if(now != lastUpdateTime)
{
for(int channel = 0; channel < MaxChannels; channel++)
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now));
float intensityNow=Channels[channel].GetLightIntensityInt(now);
float maxIntensity=255;
float a=intensityNow/maxIntensity;
float currentPercent=a*100;
j0.setValue(currentPercent);
dtostrf(currentPercent, 3,1, buffer);
percentage.setText(buffer);
j0.setValue(currentPercent);
Serial.println(currentPercent);
}
}
lastUpdateTime = now;
}



long Seconds(int hours, int minutes, int seconds) {
return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}

// ----------------------- Setup -----------------------
void setup() {
sensors.begin();
Serial.begin(9600);
InitializeChannels(MaxChannels);
pinMode(thermostaat, OUTPUT);

pinMode(52, OUTPUT);
Wire.begin();
RTC.begin();
nexInit();
}


void loop() {

CurrentTime = RTC.now();


UpdateLights(CurrentTime);
tijd();
temperatuur();
doseerpomp();


}


void temperatuur (){
sensors.requestTemperatures();
float temperatuur = sensors.getTempCByIndex(0);


if (temperatuur < 25){
digitalWrite(thermostaat, HIGH);
}
else {
digitalWrite(thermostaat, LOW);
}
memset(buffer, 0,sizeof(buffer));
dtostrf(temperatuur, 3, 1, buffer);
temperature.setText(buffer);


Serial.println(sensors.getTempCByIndex(0));
}

void tijd () {
number = CurrentTime.hour();
memset(buffer, 0, sizeof(buffer));
itoa(number, buffer, 10);
uur.setText(buffer);

number = CurrentTime.minute();
memset(buffer, 0, sizeof(buffer));
itoa(number, buffer, 10);
minuten.setText(buffer);

}

void doseerpomp () {

if (CurrentTime.hour() == 12 && CurrentTime.minute() == 00 && CurrentTime.second() == 00){
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;

if (State == LOW) {
State = HIGH;
} else {
State = LOW;
}// if the LED is off turn it on and vice-versa:


// set the LED with the ledState of the variable:
digitalWrite(pomp, State);
}




}
}

Advertisement

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: We zijn er bijna.....

Berichtdoor baco1978 » 02 Feb 2017, 23:52

zoals je het zelf hebt staan gebeurt het alleen maar als het op het moment dat je secondes op 00 staan


Code: Alles selecteren
void doseerpomp () {

if (CurrentTime.hour() == 12 && CurrentTime.minute() == 00 && CurrentTime.second() <= 15){// doorloop dit stuk de eerste 15 secondes..
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;

if (State == LOW) {
State = HIGH;
} else {
State = LOW;
}// if the LED is off turn it on and vice-versa:


// set the LED with the ledState of the variable:
digitalWrite(pomp, State);
}
Met vriendelijke groet Arjan

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: We zijn er bijna.....

Berichtdoor Dries » 03 Feb 2017, 09:42

Hoi Arjan, bedankt voor je reactie, je oplossing werkt niet bij mij, ik probeer te begrijpen wat die sketch "blink without delay" eigenljk doet. zoals ik het zie in dit programma gaat de Arduino eigenlijk terug tellen, of ben ik mis? Kort door de bocht komt het er eigenlijk op neer dat de Arduino elke dag een puls moet geven van 15 seconden zonder gebruik te maken van een delay functie om het gekende euvel van de delay te omzeilen.

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: We zijn er bijna.....

Berichtdoor Dries » 03 Feb 2017, 23:36

ik ben nu testen aan het doen en het vreemde is dat soms wel werkt en soms niet :?

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: We zijn er bijna.....

Berichtdoor baco1978 » 04 Feb 2017, 13:05

het is wel handig om dit stukje er tussen uit te halen

Code: Alles selecteren
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
Met vriendelijke groet Arjan

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: We zijn er bijna.....

Berichtdoor baco1978 » 04 Feb 2017, 13:11

Dries schreef:Hoi Arjan, bedankt voor je reactie, je oplossing werkt niet bij mij, ik probeer te begrijpen wat die sketch "blink without delay" eigenljk doet. zoals ik het zie in dit programma gaat de Arduino eigenlijk terug tellen, of ben ik mis? Kort door de bocht komt het er eigenlijk op neer dat de Arduino elke dag een puls moet geven van 15 seconden zonder gebruik te maken van een delay functie om het gekende euvel van de delay te omzeilen.


in dit stukje

if (CurrentTime.hour() == 12 && CurrentTime.minute() == 00 && CurrentTime.second() <= 15){// doorloop dit stuk de eerste 15 secondes..

geef je aan dat de tijd aan een aantal voorwaarden moet voldoen
dit stukje
CurrentTime.second() <= 15
daarmee wordt getest of second.. aan de waarde voldoet
met het < kleiner dan teken geven we aan dat alles kleiner dan de waarde 15 ook prima is, verder telt die niet af
Met vriendelijke groet Arjan

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

Re: We zijn er bijna.....

Berichtdoor shooter » 04 Feb 2017, 20:27

simpeler houden, je if die baco aanhaalt is prima, als deze waar is dan pomp aan, else pomp uit.
de led is een ander, dus beter is if state en pomp dan led aan
paul deelen
shooter@home.nl

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: We zijn er bijna.....

Berichtdoor Dries » 10 Feb 2017, 10:37

bedankt Paul & Arjan, het werkt, inderdaad simpeler houden, soms ga ik het veel te ver zoeken :mrgreen:

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten