fancontroler aanpassen van 1 naar 8 sensers

algemene C code
Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor FPCUser » 30 Aug 2016, 22:09

Ach, nog even volhouden. ;)


Overigens dit schreef Jan Beurgs in zijn boek 'Objectgeoriënteerd programmeren' (2005)

"Net als het vandaag onzinnig is om software te ontwikkelen in assembler, is het in de toekomst waarschijnlijk overbodig en onproductief om programma's te schrijven in talen als C++ of Java"
Overigens een goed boek maar helaas niet te downloaden... :)

Advertisement

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor nicoverduin » 30 Aug 2016, 22:54

FPCUser schreef:Ach, nog even volhouden. ;)


Overigens dit schreef Jan Beurgs in zijn boek 'Objectgeoriënteerd programmeren' (2005)

"Net als het vandaag onzinnig is om software te ontwikkelen in assembler, is het in de toekomst waarschijnlijk overbodig en onproductief om programma's te schrijven in talen als C++ of Java"
Overigens een goed boek maar helaas niet te downloaden... :)
En daarom wordt er nog steeds software ontwikkeld in assembler en zie je een hele nieuwe markt ontstaan op IoT en wordt alles ontwikkeld gewoon in C++. Ik ben niet zo onder de indruk van die toekomst kijkers.... Ga liever naar een SciFi film. Die zijn veel betrouwbaarder :mrgreen:
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 28 Jul 2016, 14:37

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 07 Sep 2016, 16:42

moet zeggen die pdf is functioneler dan gedacht. gaat gewoon net iets dieper de stof in waardoor t makkelijker is om het te relateren naar een daadwerkelijk programma.

indertussen het programma van begin af opnieu aan t schrijven met netjes een main functie en aparte functies om aan te roepen.

moet zeggen vorderd beter dan gedacht. ga het hier nog niet posten omdat ik nu nog wat aan wil werken maar ben goed onderweg.
iig al geen compilatie foutjes.

ps: is de main functie altijd een int en nooit een void? ik kreeg een fout melding toen ik void probeerde, ifso waarom kan dat niet?

groetjes matthieu

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor nicoverduin » 07 Sep 2016, 18:00

De int bij main is historisch. Toen C werd ontwikkeld werd het onder Unix gebruikt. En dat was altijd de command line(lees msDos promt). Je kon dan uit het programma een return code geven. Nu nog wordt er veel gebruik gemaakt van een return code uit een programma (bijv als er iets fout is gegaan). Op een microcontroller heb je dat niet dus is het zinloos. Je blijft immers continu in de main() die continu de loop() aanroept.
Maar dat is geen vrijbrief om effe een andere main de te maken dan de standaard.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 28 Jul 2016, 14:37

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 07 Sep 2016, 20:37

oke.

nu ben ik dus echt vast aan het lopen op de code van het voortschrijdend gemiddelde.

ik krijg de volgende fout melding: 111:19: error: invalid conversion from ‘uint8_t* {aka unsigned char*}’ to ‘int’ [-fpermissive]

ik heb (heel) sterk de indruk dat eerder de * het probleem is, aangezien de foutmelding blijft ook al verander ik het naar twee int's of uint8_t's
nu snap ik denk het problem wel. een is een waarde en de andere een array.

echter hier vind ik het problem want ik probeer eerste de functie zelf werkend te krijgen voor ik het in de loop integreer. zoals ik zeg. probeer, dit vooral omdat ik nog niet goed door heb hoe dat te doen. Het voorbeeld van FPCUser over nested for loops is opzich heel duidelijk maar voor mij nog lastig te integreren in een "complexe" functie als de running average.

dus probeer het stap voor stap.

@nico:

ik ben ook niet helemaal (helemaal niet) mee met wat je post hieronder gequote. bedoel je dat ik het stuk geposte code moet gebruiken als "intro"

nicoverduin schreef:Dat is het mooie van al die (kennelijk volgens vele nutteloze) tutorials die mee worden geleverd bij de IDE. Daar wordt per voorbeeld een onderdeel specifiek wat dieper uitgewerkt. Alleen daar willen de meesten niet op wachten en gelijk soms vrij complexe programma's schrijven.
Een return in een loop kan wel degelijk nuttig zijn om heel snel uit de loop te springen. Een C/C++ programma heeft altijd een main. Daar start de werkelijke code. Bij de Arduino (main.cpp) staat daar het volgende in (dit is dus terug te vinden in de IDE installatie folder). Onderstaand stukje code is het werkelijke begin van een sketch (met een aantal initialisaties die er standaard nog voor worden gezet). NIET setup() en loop() dus.
---
zowel setup() als loop() worden aangeroepen. Dus als ik midden in de loop() een return uitvoer kom ik terug bovenin de loop. Netjes? Nee. Handig? kan. Voor verbetering vatbaar? absoluut.


ik post hieronder maar de gehele code zoals ik het nu heb.. sorry als t teveel wordt

ps: ik heb het mega board ondertussen moeten inbouwen in de versterker.. daarom heb ik het aantal sensors verminderd naar 2 (meer geld had ik even niet) en gebruik ik m'n nano boardje. tegen de tijd dat het werkende is is dat makkelijk om te vormen zodat het de nu 9 sensors aan kan zoals ik die nu wil implementeren. dit houdt wel in dat ik voor het display (tegen dat ik dat deel werkende krijg) de print van tempHigh moest laten varen dus die komt nu in het onderstaande ook niet voor.

cpp code
#include <stdio.h>
#include <FastLED.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // I2C Liquid Crystal

// pin definitions
const int tempSens1 = A6; // the output pin of LM35-1
const int tempSens2 = A7; // the output pin of LM35-2
const int fan = 11; // the pin where fan is

// global constants
const byte N_sensors = 2; // aantal sensors
const int tempMin = 30; // the temperature to start the fan
const int tempMax = 50; // the maximum temperature when fan is at 100%
const int UPDATE_LCD_SPEED = 500; // Update LCD every 500 ms

// defined values
#define RunAvgArr 10 // aantal metingen voor de running average.
#define NUM_LEDS 1 // P9813 module: string is one l
#define CLOCK_PIN 4 // Clock and data pins for LED data
#define DATA_PIN 5

// global variables
uint8_t AnalogPinArray[N_sensors]= {tempSens1, tempSens2};
uint8_t temp[N_sensors]; // array of temperatures per analog port
boolean BelowMin = false; // determines if any temperature is below tempMin
int tempHigh; // highest read temperature of all ports
int fanSpeed; // speed for the fan
int fanLCD; // percentage of fanspeed
int r; // intensiteit rode led
int g; // intensiteit groen led
int b; // intensiteit blauw led
// uint32_t timer; // timer used for scrolling LCD

CRGB leds[NUM_LEDS]; // Define LED object

// various program control variables
int cycleTime = 10;
int blinkTime = 1000;
byte mode = 1;
boolean RGBMode;
boolean on = false;

// setup
void setup() {

// setup output ports. Default is Input mode
pinMode(fan, OUTPUT);

// init output ports
analogWrite(fan, 0); // stop fan

// other initialization activities
delay(2000);
LEDS.addLeds<P9813, DATA_PIN, CLOCK_PIN>(leds, NUM_LEDS); // initialize LED control object
lcd.begin(16, 2); // initialize LCD
lcd.clear(); // clear screen
// timer = millis(); // start timer for LCD updates
}

// main function
int main () {

// execute loop
BelowMin = false; // assume all temperatures are above tempMin

// loop to read all analog inputs
for (uint8_t i = 0; i < N_sensors; i++) { // loop door de sens

// get the temperature into our temp array
/* to do: init ? temp array?, how to mix met avargar function*/
temp[i] = readTemp(i);

// call voortschrijdend gemiddelde function
runAverage_1 ();

// check if any temperature is below tempMin
if (temp[i] < tempMin) {
BelowMin = true; // if there is one
}

// get the highest temperature
if(i == 0) {
tempHigh = temp[i]; // this is the first temperature read so it is automatically the highest
} else {

// all other temperatures are compared to the current tempHigh
if (temp[i] > tempHigh) {

// got one
tempHigh = temp[i];
}
}
} // einde for loop
LCD_controller ();

return (0);
}

int runAverage_1() {

static int LastMeas [RunAvgArr]; // LastMeasurements
static byte index = 0;
static long sum = 0;
static int count = 0;

// keep sum updated to improve speed.
sum -= LastMeas[index];
LastMeas[index] = temp;
sum += LastMeas[index];
index++;
index = index % RunAvgArr;
if (count < RunAvgArr) count++;

return sum / count;
}


// fan and led controller functions
void controller_Function () {

// function

// if tempHigh is low
if (tempHigh < tempMin) {
fanSpeed = 0; // stop fan
leds[0].setRGB(255, 255, 255);
}

// if tempHigh is mid
if (tempHigh > tempMin && tempHigh < tempMax) {

// we are above temp min so determine the fan speed
fanSpeed = map(tempHigh, tempMin, tempMax, 122, 255); // the actual speed of fan
fanLCD = map(tempHigh, tempMin, tempMax, 0, 100); // speed of fan to display on LCD

// set color and intensity depending on temperature and equal to fanspeed
r = map(tempHigh, tempMin, tempMax, 122, 255); // change the color of the red led linearly to the fanspeed
g = 122; // cte
b = 377-r; // inverse tov rood
}

// if tempHigh is high
if (tempHigh > tempMax) { // if temp1 is higher than tempMax
fanSpeed = 255;
leds[0] = CRGB::Red;
FastLED.show();
delay(blinkTime);
leds[0] = CRGB::Black;
FastLED.show();
delay(blinkTime);
}
// update our fan speed
analogWrite(fan, fanSpeed); // spin the fan at the fanSpeed speed
}

// LCD update function
void LCD_controller () {
//local variables
int fanSpeed; // speed for the fan
char lcdMsg[17]; // use a temp char array for LCD displaying row

// function
/*to do: rename "sensor" */
sprintf(lcdMsg, "%2d,%2d,%2d,%2d:%2d%", temp[0]);
lcd.setCursor(0, 0);
lcd.print(lcdMsg);

sprintf(lcdMsg, "%2d,%2d,%2d,%2d:%3d%%", temp[1], fanLCD);
lcd.setCursor(0, 1);
lcd.print(lcdMsg);
}

void Cal_LEDS_int () {
// local variabele
/* needs to be called by reference to update glabally */
int x, y;
g /= x;
b /= y;
}

// sensro read function
int readTemp(uint8_t portIndex) { // get the temperature and convert it to celsius

/*
* @name readTemp
* @param portIndex index to AnalogPinArray referencing the correct analog port
* @returns Integer value with temperature in degrees Celcius (no decimals)
* This routine reads the indicated analog port and converts a read 16 bit number into
* a temperature in degrees Celcius.
*/

// read the requested analog port
uint16_t temp = analogRead(AnalogPinArray[portIndex]);

// convert and return its temperature in Celcius
return int((float)temp * 0.48828125);
}

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor nicoverduin » 07 Sep 2016, 21:00

Dat sloeg op 2 dingen
a) Velen (eigenlijk de meesten) steken geen tijd in goede voorbereiding van henzelf door gelijk complexe programma's trachten te bouwen en dan om de haverklap stuklopen terwijl er legio goede tutorials zijn o.a. in de IDE. Alleen slaan de meesten die over....
b) Dat stukje over die return sloeg hier op jouw opmerking "hoe kan een return zowiezo in een void loop"
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 28 Jul 2016, 14:37

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 07 Sep 2016, 21:48

oke.. dankje! maar wat bedoel je precies met IDE als dat zulke goede tutorials zijn wil ik daar graag eens in verdiepen maar heb geen idee wat je precies bedoeld..

maar ik heb me wel al veel verdiepd hoor! ts niet dat ik denk het direct in een te flansen.

daarom ben ik ook een tijd "afwezig" geweest omdat ik het zelf wilde oplossen. maar ondanks uitgebreid googlen vind ik geen voorbeeld dat enigzins gelijk over komt dan mijn probleem.

dus ik zou op dit moment echt heel blij zijn met een hint over hoe die foutmelding aan te pakken..


groetjes matthieu

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor nicoverduin » 07 Sep 2016, 23:19

IDE = integrated Development Environment.... En die staat vol met tutorials. Kijk eens bij voorbeelden.

Dan over jouw vraag:
[code2=cpp]
LastMeas[index] = temp;
[code2]

De foutboodschap is volledig terecht om het volgende (weer een reden om nog eens goed arrays te bestuderen}

in C (en dus ook hier) betekent dat als je bij een array (en dat is temp) geen index opgeeft je dan het adres van de allereerste entry van de array doorgeeft. Dus eigenlijk &temp[0] = dus het adres van temp. temp is gedefinieerd als een uint8_t array. uint8_t is een herdefinitie van char. En aangezien je het over een adres hebt is dit dus een pointer en staat er dus char *. En jij probeert nu een char * te proppen in een uint8_t binnen de array. Tja daar komt de compiler niet uit en heb je dus een fout melding
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 28 Jul 2016, 14:37

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 08 Sep 2016, 16:51

ja dat begreep ik. ik snapte dat eigenlijk al zelfs voor ik de foutmelding kreeg.

dat is wat ik probeerde te zeggen met : ik heb (heel) sterk de indruk dat eerder de * het probleem is, aangezien de foutmelding blijft ook al verander ik het naar twee int's of uint8_t's. nu snap ik denk het problem wel. een is een waarde en de andere een array.


oke. ik snap dat ik dat vast erg op zn leeks verwoord had maar dat is wel wat ik er mee bedoelde.
maar soms zie jewel t probleem maar neit de oplossing. ik van alles geprobeerd had behalve het goede.

zat eigenlijk in een vast in een "loop" van foutmelding dat wanneer ik 1 ding verander ik een andere foutmelding krijg en dus een ander probleem presenteer. dat is dan wat ik nu gedaan heb. het echte probleem is het volgende.

ik probeerde de functie te schrijven zonder de loop te integreren. iets wat zo niet echt lukt want idd wat je zegt temp is al een array.
echter als ik de [i] achter plaats krijg ik de foutmelding dat de i in die functie nog niet is gedeclareerd.

de complier accepteerd het als ik [index] er achter plaats... maar hoewel dat de compiler tevreden stelt is dat niet wat ik wil.

ik zou de metingen graag op de volgende manier willen laten plaats vinden.


ik heb een array met 10 posities: LastMeas[index] waarbij we beginnen met index = 0
dus LastMeas[0] is de eerste positive in de Array en het is die positie die ik probeer te vullen met een waarde. zijnde de temp[0] maar 0 als zijnde de i van de loop.

zoals gezegd wilde ik hier de hele loop waarin ik de functie aanroep er buiten laten dus gewoon voor 1 sensor een repetitive metingen doen en daar dus geen array voor opvullen. om het gewoon stap voor stap op te lossen. iets dat zo dus duidelijk niet lukt gezien temp hier al een array is..

i kan ik momenteel nog neit invullen gezien het nog neit gedeclareerd is. maat just declareren en hoe de loop goed in de functie te integreren is dus mijn grote probleem.

het idee is dus dat ik voor alle sensors apart een running average creeer. en de running average array en de temp array als volgt opvul

meting 1 - sensor 1 -> RunAvgArr sensor 1, in positie 0
meting 1 - sensor 2 -> RunAvgArr sensor 2, in positie 0.. enz bij de 9 sensor opstelling alle 9 sensors 1x gemeten zijn.

meting 2 - sensor 1 -> RunAvgArr sensor 1, in positie 1
meting 2 - sensor 2 -> RunAvgArr sensor 2, in positie 1.. enz

meting 9 - sensor 1 -> RunAvgArr sensor 1, in positie 9
meting 9 - sensor 2 -> RunAvgArr sensor 2, in positie 9.. enz

repeat tot loop doorlopen is tot de twee arrays (2D array?) volledig vol zijn zodat het running average deel hierna zijn functie gaat doen..

zodat ik de som van de tuning average kan gaan gebruiken om de TempHigh te bepalen en de afzonderlijke sommen per sensor te printen in het display.

ik hoop dat ik dit duidelijk heb geformuleerd deze keer.

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor nicoverduin » 08 Sep 2016, 19:03

Ik had in een ander topic al een alternatieve library gemaakt voor moving Average. Die kan jouw leven een stuk eenvoudiger maken.
Dit is het test programmatje met de Moving averages in een tabel
cpp code
#include "Arduino.h"
#include "MovingAverage.h"

float tableTest[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };

MovingAverage <float> val1(10); // create moving average 1
MovingAverage <float> val2(3); // create moving average 2
//
// create an array to simplify performance
//
MovingAverage <float> * test[2];

/**
* @name setup()
* initializes the program
*/
void setup()
{
Serial.begin(9600);
//
// assign addresses of moving averages to array
//
test[0] = &val1;
test[1] = &val2;
//
// loop through our numbers
//
for (uint8_t i = 0; i < 10; i++) {

Serial.print(F(" value = "));
Serial.print(tableTest[i]);
Serial.print(F(" moving AVG 1 = "));
Serial.println(test[0]->CalculateMovingAverage(tableTest[i]));
Serial.print(F(" value = "));
Serial.print(tableTest[i]);
Serial.print(F(" moving AVG 2 = "));
Serial.println(test[1]->CalculateMovingAverage(tableTest[i]));
}
}
/**
* @name loop()
* continues until powerdown or reset
*/
void loop()
{
}


of nog eenvoudiger

cpp code
#include "Arduino.h"
#include "MovingAverage.h"

float tableTest[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
//
// create an array to simplify performance
//
MovingAverage <float> test[] = {
MovingAverage <float> (10), // MA op tien getallen
MovingAverage <float> (3) // MA op 3 getallen
};

/**
* @name setup()
* initializes the program
*/
void setup()
{
Serial.begin(9600);
//
// loop through our numbers
//
for (uint8_t i = 0; i < 10; i++) {

Serial.print(F(" value = "));
Serial.print(tableTest[i]);
Serial.print(F(" moving AVG 1 = "));
Serial.println(test[0].CalculateMovingAverage(tableTest[i]));
Serial.print(F(" value = "));
Serial.print(tableTest[i]);
Serial.print(F(" moving AVG 2 = "));
Serial.println(test[1].CalculateMovingAverage(tableTest[i]));
}
}
/**
* @name loop()
* continues until powerdown or reset
*/
void loop()
{
}


De library is hier te downloaden https://github.com/nicoverduin/MovingAverage

Verder zou ik je aanraden om geen afkortingen in benamingen te gebruiken (Gemakzucht?). Beter de benaming volledig uitschrijven dan heb je zowaar kans dat een ander het ook kan bevatten.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten