Arduino Mega based klimaat controller

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • toekie
  • Registratie: Juli 2009
  • Laatst online: 01-06 14:15
Hallo allemaal,

Ik wilde graag een project delen waarbij ik de nodig hulp zoek. Al in geen miljoen jaar iets gepost dus ik ben wat roestig excuses daarvoor, volgens mij is mij laatste fatsoenlijke alweer uit 2009 van mijn eerste gen i7 systeem. Enfin ik ben inmiddels bioloog en kweek reptielen waarbij ik al enige tijd geleden ben begonnen met het maken van een klimaat systeem wat mijn terraria goed laat draaien. Nu staat er online al heel wat projecten, maar die volgen vaak het natuurlijke verloop van bijv een dag/nacht cyclus of een fatsoenlijk temp/humi curve. Mijn eerste 2 prototypes doen dat helaas ook nog weinig maar daar zou ik bij versie 3 graag verandering in willen brengen. Helaas ben ik bioloog en geen programmeur en blijft code schrijven een lastig iets vandaar dit topic hopelijk kunnen de echte tweakers mij helpen!

Nu heb ik 3 regels genomen voor het gehele systeem:
-modulair (bijv stopcontacten zodat alle lampen, pompen etc altijd passen/werken)
-makkelijk in gebruik
-goedkoop (voor het prototype dan)

Versie 2.0 gebaseerd op een arduino nano heeft een half jaar test gedraaid met een handje vol keren ook daadwerkelijk in mijn terraria en was meer een proof of concept en zoals op de foto te zien laat de fabricage te wensen over zie ook net dat toen de lcd nog buggy was :X .
Afbeeldingslocatie: https://tweakers.net/i/jnRAgsiaMfQjAGSPRwPF2RiqEVM=/800x/filters:strip_icc()/f/image/ysFoHwCFzeEHoxPdhF3DoWDN.jpg?f=fotoalbum_large

Functies van versie 2.0:
-Dim functie LED strips voor ochtend/avond schemer
-timer dag/nacht voor lampen naar stopcontact via relais
-timer voor pompen ook via relais
-timers voor pomp/sproei duur
-humi en temp sensor

Heel basaal. De LEDs gingen via pwm op de arduino met een 12v transformatertje (230>12) en de relais gewoon via de arduino op de analoog poorten omdat die alleen aan/uit hoefden. Ik kan niet de 'nomale' lampen dimmen omdat deze niet gedimd mogen of kunnen worden zoals UVB lampen. Vandaar deze constructie. In de ochtend gaan eerst de LEDs aan die gaan dan van 0>>100 intensiteit (0>>255) eenmaal op max schakelen dan de 230 lampen aan. Zo hebben de dieren een minimaal verschil tussen licht ipv dat de lampen allemaal ineens aanspringen. Avond idem maar dan gespiegeld, lampen uit en leds van 100>>0. Bij de afbeeldingen een schematische weergave hiervan.
Afbeeldingslocatie: https://tweakers.net/i/-h-vWPMwJ2SBE949EP-96iRgNEk=/800x/f/image/Er0oTOdJ6tGaCJdYv7DdJ1GB.png?f=fotoalbum_large

Nu dan versie 3.0. Deze gaat werken op een arduino MEGA. Hierbij wil ik graag seizoenen toevoegen. Nu blijkt dit makkelijker dan gedacht en heb ik daar ook al een kant en klare code voor gevonden. Alleen krijg ik die niet werkende. De code werkt op de algoritmes van de maancyclus en heeft de lengte en breedtegraad nodig van je huidige positie en de huidige tijd die via een RTC gaat. Vervolgens krijg je dan 2 tijdstippen, 1 opkomst en 1 ondergang. Die iedere dag verandert en je dus een variable dag lengte krijgt en uiteindelijk seizoenen. Die code snap ik alleen niet omdat die uit een groter geheel komt en vol met andere functies zit. API is geen optie omdat ik geen wifi wil en ivm veiligheid voor dieren door wegvallen van connecties of storingen in het systeem hierdoor.
Verder heb ik bij de huidige versie alle timers via een string functie draaien en string functie zijn buggy bij arduino. Daarom heb ik de huidige versie ook niet meer draaien omdat die op den duur faalde en een reset nodig had. Hier zoek ik dus ook voor een alternatief. Nu heb ik mij laten vertellen dat een time struct beter werkt alleen ook daar blijft mijn kennis achter.
concept afbeelding als case wilde ik gaan voor een waterdichte lasdoos:
Afbeeldingslocatie: https://tweakers.net/i/M7joaEyB5vUMGa_uNrOaEvzvsf0=/800x/f/image/jugL0RTCgdgABX7KOgsmC6yy.png?f=fotoalbum_large

Verder ben ik bezig met UI, hier gaat alles goed kost alleen veel tijd.

Verdere functionaliteit voor versie 3.0:
-Meer sensoren, denk aan uv (heb ik al werkende), ph, waterlevel, lichtintensiteit etc.
-meer pwm functies voor bijv ventilatoren, leds etc.
-alarm functies (lichtsensor voor iedere lamp als die dan onder een bepaalde waarde komt = lamp kapot en dan gaat er een led knipperen of een buzzer zoemen bijv.)
-UI met bediening (werk nu dus aan een touchscreen)
-fatsoenlijke behuizing
-'moederbord' (ik wil graag een basis pcb maken/ontwerpen waar ik alles op kan klikken zoals de MEGA zelf en de RTC etc)
-pc fans. leds aansluiten met 1 universele aansluiting (dacht laat ik daar van die +/- poorten voor pakken die altijd op speakers zitten die zwart/rode schroef of druk dingen, RGB leds werken niet voor dit project is onnodig voor dieren).

Nu gaat het project al een geruime tijd alle kanten op ,maar ben ik even gestopt met alles en heb ik de tijdstructuur even als prioriteit genomen. Alles staat of valt daar namelijk mee omdat alles van het systeem op dat moet werken. Werkt dat niet zal het systeem nooit zo natuurgetrouw worden als nodig.

Dan hier de code voor de maancyclus en links van wat ik gevonden heb (schijnt een rommeltje zijn heb me laten vertellen):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
//////////////////////////////////////////////////////////////////////////////
//
// Moon phases based on algorithm published by Fraser Farrell 
// http://www.delphigroups.info/2/03/20272.html
//
/////////////////////////////////////////////////////////////////////////////////
//
// Moonrise / moonset algorithm by Stephen R. Schmitt 
// http://mysite.verizon.net/res148h4j/javascript/script_moon_rise_set2.html
//
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// 
// Arduino code ported from Stilo 3.0 aquarium controller project
// http://code.google.com/p/stilo/
//
//////////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
//------------------------------------------------------------

time_t ScheduleTime(uint8_t ScheduleHour, uint8_t ScheduleMinute, uint8_t ScheduleSecond)
{
        return previousMidnight(now()) + (ScheduleHour* SECS_PER_HOUR) + (ScheduleMinute* SECS_PER_MIN) + ScheduleSecond;
}

struct moon_t
{
  boolean isRise;
  boolean isSet;
  boolean isUp;
  byte riseH;
  byte riseM;
  byte setH;
  byte setM;
  float riseAZ;
  float setAZ;
} Moon;

float mp[3][3];
float Sky[] = {0.0, 0.0, 0.0};
float RAn[] = {0.0, 0.0, 0.0};
float Dec[] = {0.0, 0.0, 0.0};
float VHz[] = {0.0, 0.0, 0.0};

const float DR = PI/180;
const float K1 = 15*DR*1.0027379;

//////////////////////// Moonrise and Moonset /////////////////////////////////////////
int cdn(time_t t) {
  return t/SECS_PER_DAY;
}

float lst(int lon, int jd, float z ) 
{
    float s = 24110.5 + 8640184.812999999*jd/36525 + 86636.6*z + 86400*lon;
    s = s/86400;
    s = s - floor(s);
    return s*360*DR;
}

void moon(float jd)
{
  float d, f, g, h, m, n, s, u, v, w;
  
  h = 0.606434 + 0.03660110129*jd;
  m = 0.374897 + 0.03629164709*jd;
  f = 0.259091 + 0.0367481952 *jd;
  d = 0.827362 + 0.03386319198*jd;
  n = 0.347343 - 0.00014709391*jd;
  g = 0.993126 + 0.0027377785 *jd;
  
  h = h - floor(h);
  m = m - floor(m);
  f = f - floor(f);
  d = d - floor(d);
  n = n - floor(n);
  g = g - floor(g);

  h = h*2*PI;
  m = m*2*PI;
  f = f*2*PI;
  d = d*2*PI;
  n = n*2*PI;
  g = g*2*PI;

  v = 0.39558 * sin(f + n);
  v = v + 0.082 * sin(f);
  v = v + 0.03257 * sin(m - f - n);
  v = v + 0.01092 * sin(m + f + n);
  v = v + 0.00666 * sin(m - f);
  v = v - 0.00644 * sin(m + f - 2*d + n);
  v = v - 0.00331 * sin(f - 2*d + n);
  v = v - 0.00304 * sin(f - 2*d);
  v = v - 0.0024 * sin(m - f - 2*d - n);
  v = v + 0.00226 * sin(m + f);
  v = v - 0.00108 * sin(m + f - 2*d);
  v = v - 0.00079 * sin(f - n);
  v = v + 0.00078 * sin(f + 2*d + n);

  u = 1 - 0.10828 * cos(m);
  u = u - 0.0188 * cos(m - 2*d);
  u = u - 0.01479 * cos(2*d);
  u = u + 0.00181 * cos(2*m - 2*d);
  u = u - 0.00147 * cos(2*m);
  u = u - 0.00105 * cos(2*d - g);
  u = u - 0.00075 * cos(m - 2*d + g);

  w = 0.10478 * sin(m);
  w = w - 0.04105 * sin(2*f + 2*n);
  w = w - 0.0213 * sin(m - 2*d);
  w = w - 0.01779 * sin(2*f + n);
  w = w + 0.01774 * sin(n);
  w = w + 0.00987 * sin(2*d);
  w = w - 0.00338 * sin(m - 2*f - 2*n);
  w = w - 0.00309 * sin(g);
  w = w - 0.0019 * sin(2*f);
  w = w - 0.00144 * sin(m + n);
  w = w - 0.00144 * sin(m - 2*f - n);
  w = w - 0.00113 * sin(m + 2*f + 2*n);
  w = w - 0.00094 * sin(m - 2*d + g);
  w = w - 0.00092 * sin(2*m - 2*d);

    s = w/sqrt(u - v*v);                  // compute moon's right ascension ...  
    Sky[0] = h + atan(s/sqrt(1 - s*s));
    
    s = v/sqrt(u);                        // declination ...
    Sky[1] = atan(s/sqrt(1 - s*s));

    Sky[2] = 60.40974 * sqrt( u );          // and parallax
}

float interpolate(float f0, float f1, float f2, float p)
{
    float a = f1 - f0;
    float b = f2 - f1 - a;
    float f = f0 + p*(2*a + b*(2*p - 1));
    return f;
}

int sgn(float x )
{
    int rv;

    if (x > 0.0)      rv =  1;
    else if (x < 0.0) rv = -1;
    else              rv =  0;
    return rv;
}

float test_moon(int k, float t0, int lat, float plx )
{
    float ha[] = {0.0, 0.0, 0.0};
    float a, b, c, d, e, s, z;
    int hr, min; 
    float time;
    float az, hz, nz, dz;

    if (RAn[2] < RAn[0])
        RAn[2] = RAn[2] + 2*PI;

    ha[0] = t0 - RAn[0] + k*K1;
    ha[2] = t0 - RAn[2] + k*K1 + K1;

    ha[1]  = (ha[2] + ha[0])/2;                // hour angle at half hour
    Dec[1] = (Dec[2] + Dec[0])/2;              // declination at half hour

    s = sin(DR*lat);
    c = cos(DR*lat);

    // refraction + sun semidiameter at horizon + parallax correction
    z = cos(DR*(90.567 - 41.685/plx));

    if (k <= 0)                                // first call of function
       VHz[0] = s*sin(Dec[0]) + c*cos(Dec[0])*cos(ha[0]) - z;

    VHz[2] = s*sin(Dec[2]) + c*cos(Dec[2])*cos(ha[2]) - z;

    if (sgn(VHz[0]) == sgn(VHz[2]))
        return VHz[2];                         // no event this hour

    VHz[1] = s*sin(Dec[1]) + c*cos(Dec[1])*cos(ha[1]) - z;

    a = 2*VHz[2] - 4*VHz[1] + 2*VHz[0];
    b = 4*VHz[1] - 3*VHz[0] - VHz[2];
    d = b*b - 4*a*VHz[0];

    if (d < 0)
        return VHz[2];                         // no event this hour

    d = sqrt(d);
    e = (-b + d)/(2*a);

    if (( e > 1 )||( e < 0 ))
        e = (-b - d)/(2*a);

    time = k + e + 1/120;                      // time of an event + round up
    hr = floor(time);
    min = floor((time - hr)*60);

    hz = ha[0] + e*(ha[2] - ha[0]);            // azimuth of the moon at the event
    nz = -cos(Dec[1])*sin(hz);
    dz = c*sin(Dec[1]) - s*cos(Dec[1])*cos(hz);
    az = atan2(nz, dz)/DR;
    if (az < 0) az = az + 360;

    if ((VHz[0] < 0)&&(VHz[2] > 0))
      {
        Moon.riseH = hr;
        Moon.riseM = min;
        Moon.riseAZ = az;
        Moon.isRise = true;
      }

    if ((VHz[0] > 0)&&(VHz[2] < 0))
      {
        Moon.setH = hr;
        Moon.setM = min;
        Moon.setAZ = az;
        Moon.isSet = true;
      }
      
    return VHz[2];
}

void riseset(int lat, int lon, boolean next_day=0)    ///////////////// main function ////////////////////
{  
  float jd;
  
  Moon.riseH = 0;
  Moon.riseM = 0;
  Moon.setH = 0;
  Moon.setM = 0;
  Moon.riseAZ = 0.0;
  Moon.setAZ = 0.0;
  
  if (next_day) 
    jd = cdn(now()) +1;
  else 
    jd = cdn(now());
  
  for (int i=0; i<3; i++) {
    for (int j=0; j<3; j++) {
     mp[i][j] = 0.0;
    }
  }
  
  int x = lon;
  int zone = -x/15;
  
  lon = lon/360;
  float tz = zone/24;
  float t0 = lst(lon, jd, tz);
  jd = jd + tz;
  
  for (int k=0; k<3; k++)
   {
    moon(jd);
    mp[k][0] = Sky[0];
    mp[k][1] = Sky[1];
    mp[k][2] = Sky[2];
    jd = jd +0.5;
   }
  
  if (mp[1][0] <= mp[0][0])
     mp[1][0] = mp[1][0] + 2*PI;

  if (mp[2][0] <= mp[1][0])
     mp[2][0] = mp[2][0] + 2*PI;
  
  RAn[0] = mp[0][0];
  Dec[0] = mp[0][1];

  Moon.isRise = false;                          // initialize
  Moon.isSet  = false;

  for (int k=0; k<24; k++)
   {
    float ph = (k + 1)/24;
     
    RAn[2] = interpolate(mp[0][0], mp[1][0], mp[2][0], ph);
    Dec[2] = interpolate(mp[0][1], mp[1][1], mp[2][1], ph);
    
    VHz[2] = test_moon(k, t0, lat, mp[1][2]);
    
    RAn[0] = RAn[2];                       // advance to next hour
    Dec[0] = Dec[2];
    VHz[0] = VHz[2];
   }
}


void moon_init(int latitude,int longitude)
{
//  const int latitude = -21;                  //important bit, negative if south
//  const int longitude = -73;                 //not so important bit, negative if west

  boolean moonUp = 0;             //true if moon is up
  time_t tnow=now();
  time_t rise_time, set_time;

  riseset(latitude, longitude,2);

  if (Moon.isRise) {
    rise_time=ScheduleTime(Moon.riseH, Moon.riseM, 0);
  } else {
    rise_time=ScheduleTime(0, 0, 0);
  }

  if (Moon.isSet) {
    set_time=ScheduleTime(Moon.setH, Moon.setM, 0);
  } else {
    set_time=ScheduleTime(23, 59, 59);
  }

  moonUp = 0;
  if (rise_time < set_time) {
    if ((tnow >=rise_time) && (tnow < set_time)) {
     moonUp = 1;
    }
  } else if ((tnow >= rise_time) || (tnow < set_time)) {
    moonUp = 1;
  }

  if (moonUp) {
      if ( (!Moon.isSet) || ((rise_time > set_time)&&(tnow>=rise_time)) ) {      //calculate for next day
        riseset(latitude, longitude, 1);
      }
      set_time=ScheduleTime(Moon.setH, Moon.setM, 59)+SECS_PER_DAY;
  }
  Moon.isUp=moonUp;
}


links:
MSDN: Get sunrise and sunset time based on latitude and longitude

https://stackoverflow.com...sunrise-sunset-times-in-c

Geen idee of de code in deze links werken voor arduino!

Bij voorbaat dank voor de eventuele hulp en sorry voor het lange verhaal!

Acties:
  • +1 Henk 'm!

  • Piepersnijder
  • Registratie: December 2009
  • Niet online
Ik gebruik https://github.com/dmkishi/Dusk2Dawn.
Hiermee kan je eenvoudig de zon-op en zon-ondertijd bepalen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t
#include <Dusk2Dawn.h>

void setup()  {
  Serial.begin(115200);
  while (!Serial) ; // wait until Arduino Serial Monitor opens
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");      
}

void loop()
{
  if (timeStatus() == timeSet) {
    digitalClockDisplay();
  } else {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    delay(4000);
  }
  delay(1000);
}


String ZonOpZonOnder() {
 Dusk2Dawn Utrecht(52.093131, 4.120770, 0);
 String DayTime;
  int SunRise  = Utrecht.sunrise(year(), month(), day(), true);
  int SunSet   = Utrecht.sunset(year(), month(), day(), true);

  char time1[] = "00:00";
  Dusk2Dawn::min2str(time1, SunRise);
  
  char time2[] = "00:00";
  Dusk2Dawn::min2str(time2, SunSet);
  DayTime = " " + String(time1) + "-" + String(time2);
  return DayTime;

}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.print(" ");
  Serial.print(ZonOpZonOnder());
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

[ Voor 86% gewijzigd door Piepersnijder op 16-03-2020 23:22 ]


Acties:
  • 0 Henk 'm!

  • toekie
  • Registratie: Juli 2009
  • Laatst online: 01-06 14:15
Piepersnijder schreef op maandag 16 maart 2020 @ 07:52:
Ik gebruik https://github.com/dmkishi/Dusk2Dawn.
Hiermee kan je eenvoudig de zon-op en zon-ondertijd bepalen.
Dankje ga er meteen naar kijken!

Acties:
  • +1 Henk 'm!

  • Gizz
  • Registratie: Maart 2001
  • Nu online

Gizz

Dunder-Mifflin, Inc.

Je zou ook je project extern aan kunnen sturen, in plaats van met code op je Arduino. Pak een pakket als Domoticz of HA, dan zit daar al van alles in qua zon op/onder en logging van zaken (bijvoorbeeld mooie grafiekjes van de temperatuur en vochtigheid in je terrarium). Of pak een visuele programmeeromgeving als Node-RED.

Wat je nu doet kan ook, zeker als je het leuk vindt om in allerlei scripts te duiken en daarvan te leren. Gaat het je vooral om de functionaliteit en is het niet je wens om door lappen code te spitten, dan zijn er veel eenvoudigere oplossingen mogelijk. Vaak ook nog met meer functionaliteit.

Qua hardware kun je ook een ESP8266 of ESP32 (handiger in dit geval, want veel meer pinnen) pakken. Die halen gewoon hun tijd via internet binnen en laat je via wifi met de rest van je software en loggingpakketten praten.

Canon EOS 5Dm3 + 5D + 7D + 300D + 1000FN + EF 17-40 4L + EF 35 1.4L + EF 50 1.8 + EF 80-200 2.8L + 550EX


Acties:
  • 0 Henk 'm!

  • toekie
  • Registratie: Juli 2009
  • Laatst online: 01-06 14:15
Gizz schreef op woensdag 18 maart 2020 @ 00:10:
Je zou ook je project extern aan kunnen sturen, in plaats van met code op je Arduino. Pak een pakket als Domoticz of HA, dan zit daar al van alles in qua zon op/onder en logging van zaken (bijvoorbeeld mooie grafiekjes van de temperatuur en vochtigheid in je terrarium). Of pak een visuele programmeeromgeving als Node-RED.

Wat je nu doet kan ook, zeker als je het leuk vindt om in allerlei scripts te duiken en daarvan te leren. Gaat het je vooral om de functionaliteit en is het niet je wens om door lappen code te spitten, dan zijn er veel eenvoudigere oplossingen mogelijk. Vaak ook nog met meer functionaliteit.

Qua hardware kun je ook een ESP8266 of ESP32 (handiger in dit geval, want veel meer pinnen) pakken. Die halen gewoon hun tijd via internet binnen en laat je via wifi met de rest van je software en loggingpakketten praten.
Dankje voor de reactie! Ja het is beide, ik wil het graag leren alleen heb ik niet de middelen om ff wat cursussen te volgen kwam erachter dat die stiekem toch best duur zijn. Dus het blijft vooral veel fora en google werk en mijn vader die zit in de IT en helpt soms als hij tijd heeft.

Ja Node-RED heb ik naar zitten kijken maar dat is mij nog te hoog gegrepen en heb me laten vertellen dat je dan beter voor een rasbpi kunt gaan en dat heb ik (nog) niet nodig voor het systeem. Wil eerst alles werkende hebben zodat ik er 1 terrarium op kan draaien zoals ik graag wil en daarna wil verder kijken voor loggen van data (wat inderdaad prachtig is en ik graag zou willen gaat mijn biologen hart sneller van kloppen!) en bijv een app maar dat heb ik voor alsnog als toekomst want ik denk niet dat ik dat zelf kan namenlijk. Maar op het moment voelt dat nog heel ver weg. Hier nog een vergelijkbaar leuk project gevonden met pi en node-red, strak afgewerkt ook:

https://www.dendroboard.c...controlled-terrarium.html

Maar dat is niet modulair en is ingebouwd via DIN, dat wil ik niet ik wil het graag in een handzaam doosje zodat ik het altijd makkelijk kan verplaatsen en ergens anders kan aansluiten.

Esp heb ik hier eentje liggen die sterker is dan een Mega daar wil ik ook nog naar kijken of dat iets is. Maar op het moment vind ik de Mega fijner werken omdat arduino meer kits heeft en heb ik nu o.a. zo'n lcd shield erop zitten voor mijn touchscreen. Bij deze moet ik dan eerst alle pins uitvogelen op de esp terwijl de arduinos van die plug-and-play achtige kits hebben. Heb op het moment deze liggen op aanraden van een vriend omdat die, in theorie, ook een touchscreen zou kunnen draaien omdat die wel genoeg pinnen heeft. Maar dat heb ik nog niet getest.

https://nl.aliexpress.com...042311.0.0.27424c4daViC7J

En API of dergelijken wil ik niet. Mede omdat ik het niet zo vertrouw mocht er iets van een connection error zijn en de tijd in de soep loopt of iets anders met alle gevolgen van dien. Nu is arduino ook niet zo stabiel maar dan upgrade naar een betere. Maar draadloos = draadloos en dat blijft een risico imho. Maar ook omdat ik dit ook wil gaan implementeren in mijn incubator die in de kelder staat waar geen draadloze verbinding is dus doe ik het graag via een formule zodat het dan altijd functioneert met of zonder wifi en dan hoeft het maar een keer. En stiekem vind ik het ergens ook wel leuk als het wat moeite kost des te beter voelt het als het dan echt werkt.

Dankjewel voor het meedenken Node-red is idd een mooie, hoop dat nog te kunnen implementeren ooit! Waardevolle tips!

Acties:
  • 0 Henk 'm!

  • toekie
  • Registratie: Juli 2009
  • Laatst online: 01-06 14:15
Met dank aan @Piepersnijder is de code zo goed als klaar en er wordt al flink wat getest en kan ik me eindelijk richten op mijn terrein, de hardware. Ben zeer onder de indruk van de software, nogmaals zeer bedankt voor de hulp @Piepersnijder zonder u was ik hier nog maanden zo niet jaren mee aan het worstelen geweest en dan nog had er niet zo uitgezien als het nu doet! Ik ben ook zeer dankbaar voor de tijd en moeite die erin gestoken is en een leek als mij te helpen en ondersteunen!

De onderdelen druppelen de laatste weken binnen en bijna alles is er nu. Ik wil eerst nog goed alle hardware met de software testen voordat ik aan de bouw begin. Helaas mis ik nog de MOSFETs voor de pwm sturing van de LEDs en fans ik verwacht dat die deze week binnenkomen Buiten dat werkt alles en is het al aardig getest. Altijd grappig om te zien dat de software 100% loopt maar als je dan alles aansluit je gekke dingen vind. Zo deden sommige relais het omgekeerde van wat er moest gebeuren. Dit omdat die arduino shield leds werken via Active=low, dus relais uit = poort dicht = gesloten circuit = uitgang hoog = lamp aan. Simpele fix maar makkelijk over het hoofd te zien. Daarom altijd testen zeker gezien dit voor organismen bedoelt is!

Het systeem bevat nu:
-tijdstructuur op basis van de stand vd zon via de dusk2dawn lib. Iedere dag geeft die 2 tijden zonop/zononder voor jou woonplaats (mits je je coordinaten invult). Hierop gaan in de ochtend bij het bereiken van de betreffende zonop tijd de LEDs aan. Die zullen van intensiteit van 0>>255 gaan in 30 minuten om zo schemer te simuleren. Aangekomen bij 255 zullen de warmte en UV lampen aan gaan via relais. Deze zijn niet te dimmen (warmte kan wel, aar is niet aan te raden) dus is dit de meest elegante oplossing.
-Beide lampen kunnen dus automatisch schakelen via deze zon simulatie, maar hebben ook timer setting waarmee je ze gewoon op vaste tijden kunt instellen. Dit voor het geval zich er iets mocht voordoen in geval van nood etc.
-uitgebreide sproei functies waarbij de sproeipomp ingesteld kan worden op een tijstip x met sproeiduratie x (in seconden). Dit 3 maal zodat je meerdere malen onafhankelijk kunt sproeien op een dag mocht dat nodig zijn. Ook heeft deze een losse 'test' functie waarbij de sproeier voor 10 seconden aangaat. Dit om te testen maar hiermee kun je ook handmatig bij sproeien mocht dat nodig zijn.
-Ik maak ook gebruik van een 'fogger' in de nacht voor mijn dieren. Dit is een ultrasoon membraan dat mist maakt als je het in water plaatst, zeer goed en natuurlijk voor kameleons en ze zo te hydrateren. Deze moet enkele uren draaien om fatsoenlijk mist te creeren dus deze timer zijn hetzelfde als de lamp timers. Deze worden geschakeld van tijdstip A t/m tijdstip B. Ook deze x3 omdat het lastig is om luchtvochtigheid constant te houden dus geleidelijk enkele uren wel, niet, wel, niet is het beste om dat op niveau te houden snachts.
-PWM functies voor de LEDs en fans zijn dmv sliders waarmee de intensiteit/snelhied kan worden aangepast. Dit omdat ik dan de max intensiteit van de LEDs kan aanpassen en deze kan afstellen op de intensiteit van de andere lampen om zo uniform mogelijk lichtopbrengst te creeren. Voor de fans zodat oa de temp zo gehandhaafd kan worden.
-Veel algemene functies met betrekking het verwerken van variabelen. Dit was een probleem bij mijn oude versie waar ik de sketch steeds opnieuw moest uploaden met aanpaste waardes (ja zo'n geklooi deed ik). Nu is er een pagina waar je de o.a. tijd en coordinaten met de hand kunt invoeren met een pop-up numberpad (wist niet eens dat zoiets on met arduino). Dit maakt het systeem 1000x gebruiksvriendelijker en dat was iets waar ik geen oplossing voor omdat ik dit simpelweg niet kon.
-alarm functies. Er zit nu een max/min teller in voor de temp. Mits die waardes worden overschreden gaat er een buzzertje piepen. Ook worden de boxes waar de waardes op afgebeeld worden rood van kleur als deze max/min gehaald worden. Zo kan ik dus snel zien en horen als iets mis is.

Verder heeft het nu een mooi werkend touchscreen en enkele command functies foor de seriele monitor zodat je vanuit daar ook kunt testen en aanpassingen kunt doen.

Hier een kleine impressie van de test setup.
De achtergrond is de lasdoos waar het geheel uiteindelijk in komt zoals in mijn concept tekening.
Afbeeldingslocatie: https://tweakers.net/i/fOFwqkvLkJSOOiIcZVwQAOQOIqI=/800x/filters:strip_icc():strip_exif()/f/image/Ui0dnt12t2RHiovtUViQnHVi.jpg?f=fotoalbum_large

Zoals altijd sta ik open voor alle vragen en suggesties.

Edit: Er stond iets in wat niet klopte.
Pagina: 1