Loop probleem

algemene C code
Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Loop probleem

Berichtdoor benvo » 22 Dec 2016, 21:55

@Shooter. Dit was de gedachte zo ongeveer al heb jij het, veel beter, uitgewerkt want ik kwam er niet uit en liet het idee varen. Dat heeft weer te maken met mijn niet aanwezige ervaring aangaande Arduino programmering. Soms denk je iets te vinden maar omdat nog niet exact duidelijk is wat er gebeurt na een bepaalde handeling kom je er niet uit. Ik zal nog heel veel moeten oefenen met bijvoorbeeld het ontleden van bestaande programma's. Dat is nl. de manier waarop ik poog om mijn kennis aan te vullen. En dat gaat, gelukkig, wel steeds beter!

Dank je wel voor je reactie, ik ben er blij mee!


Groet,
Ben.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Loop probleem

Berichtdoor Koepel » 22 Dec 2016, 22:06

Wanneer een led lineair wordt aangestuurd, bijvoorbeeld met PWM, dan komt dat niet overeen met wat wij als mens ervaren.

Bijvoorbeeld van 80% naar 100% lijkt voor onze ogen maar een klein verschil, terwijl van 1% naar 2% al een flink verschil lijkt. Dat kun je opvangen door bijvoorbeeld een exponentiële curve te maken.

In het programmeren maakt dat niet uit. Als je bijvoorbeeld de halve helderheid wilt, dan geef je nog steeds 50% op. Maar die exponentiële curve die dan gebruikt wordt, die zorgt er voor dat de led eigenlijk maar een procent of 30 krijgt.

Dit had ik dus al geschreven bij de "curve B" van mijn tekeningen.

Wat shooter beschrijft is dus hetzelfde als mijn "curve A", met lineaire interpolatie, dus dat is weer hetzelfde als de MultiMap en hetzelfde als de link naar de LightController van Dries.
Als ik shooter goed begrijp, dan kun je een array maken met 24 elementen voor ieder uur ? Dat maakt het inderdaad gemakkelijker te begrijpen. Dan is de x-as geen vrije variabele meer, maar die telt gewoon de uren af.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Loop probleem

Berichtdoor nicoverduin » 22 Dec 2016, 23:59

2 jaar terug hadden we het hier al eens over een mooier geleidelijk effect van fading van leds. viewtopic.php?f=8&t=1018&hilit=Fading+led
Er staat een formule die het goed doet in practische oplossingen. Die zou je in excel kunnen gooien en dan in een tabel kunnen stoppen zoals koepel al aan gaf.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Loop probleem

Berichtdoor Dries » 23 Dec 2016, 11:14

Dag Ben, ik ben ook nieuw in het arduino wereldje, ik heb een achtergrond met met Graduaat diploma Electronica maar microcontrollers heeft mij altijd sterk geboeid maar helaas zat dit niet in het lespakket dus ben ik er zelf maar mee aan de slag gegaan.
Op dit moment van schrijven blijft het bij mij tot het opzoeken van voorbeelden van anderen om dan een gelijkaardige toepassing te maken voor mij zelf. de bedoeling is om mijn aquarium te gaan automatiseren met een mooi TFT display, waar Nico mij tot nu super mee heeft geholpen :-). Een thermostaat heb ik nu ook al klaargekregen en zou ik eingelijk het programma in die link willen combineren met een thermostaat functie, maar dat wordt een ander verhaal, in ieder geval je zit op de juiste plaats en bij de juiste mensen om je te helpen.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Loop probleem

Berichtdoor benvo » 23 Dec 2016, 16:55

Hallo Dries,

Zou ik mogen weten hoe jij het programma van "benjaf" hebt ingevuld? Bij mij stopt het programma al bij, Channel Channels[MaxChannels]; Voor een goed begrip zou ik jou sketch willen bekijken om te zien hoe e.e.a. ingevuld moet worden in het programma waar jij me attent op maakte.


Bij voorbaat dank!

Groet,
Ben.

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

Re: Loop probleem

Berichtdoor Dries » 23 Dec 2016, 19:26

Hoi Ben,

dit programma draait nu op mijn aquarium :

#include <Wire.h>
#include "RTClib.h"
#include "ChannelManager.h"

// ----------------------- Constants -----------------------

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;

// ----------------------- Lights -----------------------

// Schedule Point format: (Hour, Minute, Intensity)
// Difference in intensity between points is faded/increased gradually
// Example:
// Channels[0].AddPoint(8, 0, 0);
// Channels[0].AddPoint(8, 30, 255);
// Channels[0].AddPoint(11, 0, 255);
// ...
//
// Explanation:
// 00:00 - 08:00 -> Light OFF
// 08:00 - 08:30 -> Increment light towards Fully ON
// 08:30 - 11:00 -> Light Fully ON
//
// Min intensity value: 0 (OFF)
// Max intensity value: 255 (Fully ON)
//
// If only 1 point is added, channel always maintains value of that point
//
// There is the option of which fade mode to use.
// Basically there are 2 modes: Linear and Exponential
// - Linear is what you would expect - 50% on = 50% duty cycle.
// - Exponential is an estimation of how our eyes react to brightness. The 'real' formula is actually inverse logarithmic,
// but for our use exponential is close enough (feel free to add more fade modes if you disagree) - and much faster to compute!
//
// RGB SHIELD VELLEMAN: PIN 3: ROOD PIN 5:GROEN PIN 6: BLAUW

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

void InitializeChannels(int channels) {


// Channel 0:
int channelNo = 0; // Currently editing channel 0
int pin = 3; // PWM pin 3 wordt hier gebruikt op de UNO
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));
}
}
lastUpdateTime = now;
}



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

// ----------------------- Setup -----------------------
void setup() {

InitializeChannels(MaxChannels);


Wire.begin();
RTC.begin();

}


void loop() {

CurrentTime = RTC.now();


UpdateLights(CurrentTime);
}

Hier is kanaal 0 ingesteld met PWM pin 3 op de UNO, let op hier dat je een PWM pin kiest. Dan ga je de tijden instellen wanneer je X % licht sterkte wilt hebben, 0 is 0 % en 255 is 100% omdat je een 8 bits PWM register gebruikt op de UNO (voor zover ik het begrijp, de specialisten hier kunnen je dit perfect uitleggen). wil je bv 50% lichtsterkte dan vul je achter de tijd 127 in enz.
wil je meerdere kanalen gaan gebruiken dan wordt int channelNo = 0; int channelNo = 1 met bv PWM pin 5 enz. Maar dan moet je const int MaxChannels = 2 gaan aanpassen naar de max aantal gebruikte kanalen.
werkt hier perfect met lineare stappen.
aan de rest van het programma moet je niet aankomen.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Loop probleem

Berichtdoor benvo » 23 Dec 2016, 21:10

Fijn dat je wilde reageren, Dries! Dit helpt.

Op een andere, Engelstalige, Arduino site zag ik dat je in feb 2015 al een aantal vragen stelde aan de forumleden. Daar sprak je ook over de libraries. Ik vraag me nl. af hoe je Channel.ccp en ChannelManager.h in je syteem hebt gezet. Je kan ze niet als een "normale" library vinden maar zie ze, deze twee bestanden, natuurlijk wel in de zip file. Hoe en waar moet ik deze bestanden in/toevoegen?


Groet,
Ben.

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

Re: Loop probleem

Berichtdoor Dries » 23 Dec 2016, 21:36

Ben,
deze twee bestanden plaats je gewoon bij de rest in de libraries map, waar ook de RTC bibliotheek staat enzo, je maakt een nieuwe map aan bv "ChannelManager" en plaats de twee bestanden hierin en klaar :-)

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Loop probleem

Berichtdoor benvo » 24 Dec 2016, 13:43

Dank je wel, Dries.

Groet,
Ben.



Iedereen fijne feestdagen gewenst!

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Loop probleem

Berichtdoor benvo » 24 Dec 2016, 17:36

Met dank aan al die mensen die mij hebben geholpen de laatste tijd; ik heb nu een werkend programma. Nou heb je mensen die zijn nooit tevreden, ik wil niet echt zo overkomen, maar toch nog een laatste vraag; hoe krijg ik de lichtsterkte waarden op mijn lcd scherm? Als ik bijvoorbeeld de waarde 25.5 invoer zou ik graag willen zien dat er 10% aanduiding op mijn scherm staat. De formule daarvoor is niet moeilijk, stel dat y=25.5 dan wordt het (y*100)/255. Probleem is, onder welke variabele vind ik de lichtsterkte in dit programma? Hier zou ik het toch ergens in moeten vinden: analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); Maar dat krijg ik niet werkend...

Eerst maar even de Sketch:



cpp code
Code: Alles selecteren
/*
 * Name:   LightController.ino
 * Author:   User "benjaf" at plantedtank.net forums
 * URL:      https://github.com/benjaf/LightController
 * This example is set up for 2 channels with a maximum of 10 points.
 * Anything that may require editing is labeled with �CHANGE�
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
 */

// ----------------------- RTC Library -----------------------
// Use Wire and RTClib (https://github.com/adafruit/RTClib):
// Please note that there are a significant differences between the original JeeLabs RTCLib and the Adafruit fork!
#include <Wire.h>
#include "RTClib.h"
#include "ChannelManager.h"
#include<LCD.h>
#include<LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); //0x3F is hetI2C bus adres voor een ongemodificeerd Backpak
 

// ----------------------- Constants -----------------------
// �CHANGE�
const int MaxChannels = 3;   // Max number of channels, change if more or less are required
const int MaxPoints = 25;    // Max number of light intensity points, change if more or less are required

// RTC
RTC_DS3231 rtc;

// Time
DateTime CurrentTime;

// ----------------------- Variables -----------------------


// ----------------------- Lights -----------------------

// Schedule Point format: (Hour, Minute, Intensity)
// Difference in intensity between points is faded/increased gradually
// Example:
//    Channels[0].AddPoint(8, 0, 0);
//   Channels[0].AddPoint(8, 30, 255);
//   Channels[0].AddPoint(11, 0, 255);
//  ...
//
// Explanation:
//  00:00 - 08:00 -> Light OFF
//  08:00 - 08:30 -> Increment light towards Fully ON
//  08:30 - 11:00 -> Light Fully ON
//
// Min intensity value: 0 (OFF)
// Max intensity value: 255 (Fully ON)
//
// If only 1 point is added, channel always maintains value of that point
//
// There is the option of which fade mode to use.
// Basically there are 2 modes: Linear and Exponential
// - Linear is what you would expect - 50% on = 50% duty cycle.
// - Exponential is an estimation of how our eyes react to brightness. The 'real' formula is actually inverse logarithmic,
//     but for our use exponential is close enough (feel free to add more fade modes if you disagree) - and much faster to compute!

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

// Add more timing definitions here if more channels are added:
// �CHANGE�
void InitializeChannels(int channels) {
   // Channel 0: (Example)
   // This is an example of a typical lighting schedule (Lights on 08:30 - 19:00 w. 30 minutes of sunrise / sunset added)
   // using linear fading on pin 10.
   
   //int channelNo = 0;
   //int pin = 10;
   //Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
   //Channels[channelNo].AddPoint(8, 0, 0);
   //Channels[channelNo].AddPoint(8, 30, 255);
   //Channels[channelNo].AddPoint(19, 0, 255);
   //Channels[channelNo].AddPoint(19, 30, 0);
     
   // Channel 0:
   int channelNo = 0;   // Currently editing channel 0
   int pin = 9;      // Channel 0 uses pin 9, wit-rode balk
   Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);   // Initialize channel and choose FadeMode
   Channels[channelNo].AddPoint(8, 0, 0);   // Add Point (can also use decimal values ranging from 0 to 1 if you prefer)
   Channels[channelNo].AddPoint(8, 30, 25.5);
   Channels[channelNo].AddPoint(9, 0, 76.5);
   Channels[channelNo].AddPoint(9 , 30, 255);
   Channels[channelNo].AddPoint(18, 0, 76.5);
  Channels[channelNo].AddPoint(19, 0, 25.50);
  Channels[channelNo].AddPoint(21, 0, 0);
 
 
 
 
   
// Channel 1:
  channelNo = 1;  // Currently editing channel 1
  pin = 10;   // Channel 1 uses pin 10, wit-blauwe balk
  Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
  Channels[channelNo].AddPoint(8, 0, 0);
  Channels[channelNo].AddPoint(9, 30, 25.5);
  Channels[channelNo].AddPoint(10, 0, 127.5);
  Channels[channelNo].AddPoint(10, 30, 255);
  Channels[channelNo].AddPoint(19, 30, 127.5);
  Channels[channelNo].AddPoint(21, 30, 76.5);
  Channels[channelNo].AddPoint(23, 0, 0);
 
 

  // Channel 2:
  channelNo = 2;  // Currently editing channel 2
  pin = 11;   // Channel 2 uses pin 11, witte balk
  Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
  Channels[channelNo].AddPoint(8, 0, 0);
  Channels[channelNo].AddPoint(10, 00, 127.5);
  Channels[channelNo].AddPoint(10, 30, 255);
  Channels[channelNo].AddPoint(17, 30, 127.5);
  Channels[channelNo].AddPoint(18, 00, 0);
 
 
 
}

// ----------------------- Functions -----------------------
long lastUpdateTime = 0;

// Update light intensity values
 void UpdateLights(DateTime CurrentTime)
{
   long now = Seconds(CurrentTime.hour(), CurrentTime.minute(), CurrentTime.second());   // Convert current time to seconds since midnight
   if(now != lastUpdateTime)     // Perform update only if there is a perceivable change in time (no point wasting clock cycles otherwise)
   {
      for(int channel = 0; channel < MaxChannels; channel++)          // For each Channel
      {
         analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now));   // Get updated light intensity and write value to pin (update is performed when reading value)
      }
   }
   lastUpdateTime = now;
}


// Convert HH:mm:ss -> Seconds since midnight
long Seconds(int hours, int minutes, int seconds) {
   return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}

// ----------------------- Setup -----------------------
void setup() {
  //Activeer LCD module
 
  lcd.begin (20,4);   //voor een 20x4 LCD module
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);     //achtergrondverlichting LCD aan.

  Serial.begin(9600);

  delay(1000); // wacht to de Serial monitor geopend wordt.

  if (! rtc.begin()) {
    Serial.println("Kan de RTC niet vinden");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC zonder stroom geweest, nu op tijd zetten!");
    // De volgende regel zet de RTC op de datum en tijd toen de sketch was gecompileerd.
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // Deze regel zet de RTC op een bepaalde datum en tijd, bijvoorbeeld:
    // Januari 21e, 2014 op 3 uur na de middag zou je zo in moeten voeren:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
{
  //De % tekens en de (led-)balknamen worden op de LCD scherm gezet.
 
  lcd.setCursor(3,1);
  lcd.print("%");
  lcd.setCursor(3,2);
  lcd.print("%");
  lcd.setCursor(3,3);
  lcd.print("%");
  lcd.setCursor (5,1);
  lcd.print("Wit-rode balk"); 
  lcd.setCursor(5,2);
  lcd.print("Wit-blauwe balk");
  lcd.setCursor(5,3);
  lcd.print("Witte balk");
}

 
   // Initialize channel schedules
   InitializeChannels(MaxChannels);
   
   // Clock
   Wire.begin();
   rtc.begin();
   //RTC.adjust(DateTime(__DATE__, __TIME__));  // Set RTC time to sketch compilation time, only use for 1 (ONE) run. Will reset time at each device reset!
}

// ----------------------- Loop -----------------------
void loop() {
   // Get current time
   
  DateTime now=rtc.now();



   
    //Print dagdatum, maand en jaar.
    lcd.home();                                                                            //zet de cursor op de eerste kolom, op de eerste rij.
    if (now.day() <10)
    {
     lcd.print("0");                                                                       //zet een nul voor een enkel cijfer
    }
   
    lcd.print(now.day());
    lcd.print('-');
    if (now.month()<10)
    {
      lcd.print("0");                                                                     //zet een nul voor een enkel cijfer
    }
    lcd.print(now.month());
    lcd.print('-');
    lcd.print(now.year());
    lcd.print("  ");
   
    //Print de tijd in uren, minuten en seconden
    if (now.hour()<10)
    {
      lcd.print("0");                                                                   //zet een nul voor een enkel cijfer
    }
    lcd.print(now.hour());
    lcd.print(':');
    if (now.minute()<10)
    {
      lcd.print("0");                                                                  //zet een nul voor een enkel cijfer
    }
    lcd.print(now.minute());
    lcd.print(':');
    if (now.second()<10)
    {
      lcd.print("0");                                                                //zet een nul voor een enkel cijfer
    }
    lcd.print(now.second());


// Update lights
   UpdateLights(rtc. now());


}



Fijne feestdagen allemaal,

Groet,
Ben.

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten