fancontroler aanpassen van 1 naar 8 sensers

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 27 Aug 2016, 04:49

oke ik ben op dit moment het me iets wat lastiger aan t maken en kom er even niet uit.

anyway. zoals boven gepost zijn de metingen nogal van t springin het veld. dus zeker niet cte. nu ligt mijn interesse niet in het moment opname maarin de langzame variantie van de temperatuur.

ik heb daarvoor geprobeerd een geneste for loop te maken met het idee de acht sensoren af te lopen en voor elke sensor. ipv 1 meting te doen. 50 metingen dit te doen, deze te mddelen en op te slaan als zijnde de normale lezing in de for loop voor de 8 sensoren. maar het lukt me niet.. :( om de geneste for loop af te laten lopen.

ik heb een array voor de sensor aaangemaakt. al lijkt me dit niet eens nodig omdat ik er geen waardes in steek.

het stukje van de code hieronder, de rest is gelijk aan hierboven.

cpp code
// global variables
uint8_t AnalogPinArray[8]= {tempPin1, tempPin2, tempPin3, tempPin4, tempPin5, tempPin6, tempPin7, tempPin8 };
uint8_t temp[8]; // array of temperatures per analog port
uint8_t sensor[50]; // array of temp of spec sensor or calculations
uint8_t aVrg[8]; // gemiddelde van 50 metingen

void loop() {

//
// local variables
//
char lcdMsg[17]; // use a temp char array for LCD displaying row

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


for (uint8_t i = 0; i < 8; i++) {
temp[i] = 0; // sensor waarde op 0 stellen voorgaande de berekening

Serial.print("temp");
Serial.print(i);
Serial.print(" : ");
Serial.print(temp[i]);
Serial.print(" : ");

for (uint8_t j = 0; j < 50; j++) { // 50 metingen doen
sensor[j] += readTemp(j); // sommeer deze 50 metingen

Serial.print(sensor[j]);
Serial.print(",");

}
aVrg[i] = int((float)sensor[i] / i+1); // bereken gemiddeld over de 50 metingen van elke sensor.
}

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

} else {
if (aVrg[i] > tempHigh) { // all other temperatures are compared to the current tempHigh
tempHigh = aVrg[i];
}
}
}

Advertisement

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor nicoverduin » 27 Aug 2016, 10:39

Als je een langzame variantie wil hebben van de temperatuur zou ik gewoon een voortschrijdend gemiddelde nemen

zie andere topic: viewtopic.php?f=8&t=1969&p=14454#p14448
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 » 27 Aug 2016, 13:54

hmmdat klinkt idd goed.. eh. beter!. ik ga me daar vanavond in verdiepen.. dankje.

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor FPCUser » 29 Aug 2016, 11:39

Als ik je goed begrijp heb je 8 sensoren en wil je van elke sensor het gemiddelde hebben van 50 opeenvolgende metingen.

Men kan dt doen door eerst 50 metingen doen met sensor 1, daarna 50 metingen met sensor 2, enz.
Het 'probleem' is echter dat er een zekere tijd tussen 2 metingen moet zijn. Een DHT22 heeft b.v. mnimaal 2 sec. nodig tussen twee opeenvolgende metingen. Je bent dan ruim 1.5 min verder voordat de volgende sensor aan de beurt is.
Daarom lijkt mij het beter om eerst sensor 1 de eerste meting te laten doen, dan de eerste meting van sensor 2, sensor 3 enz. t/m sensor 8.
Vervolgens 2 sec. wachten, en daarna een tweede serie metingen te laten doen.
En dit 50 keer herhalen.

Dat betekend dat je in de binnense lus de 8 sensoren aftast en in de buitenste lus de 50 metingen.


Als test een klein c programma.

cpp code
#include <stdio.h>

int N_opnemers = 8;
int N_metingen = 50;

int main()
{
for (int i = 0; i < (N_metingen); i++) {
for(int j = 0; j < (N_opnemers); j++) {
printf(" Opnemer %d\t",j + 1);
printf("Waarde = %d\n", i + 1);
}
printf("\n");
}
}



Als alle metingen gedaan zijn kan het gemiddelde berekend worden.

Het mooiste zou zijn als je aparte functies maakt.
En dan bedoel ik voor invoer (gegevens v/d opnemers ophalen), signaalverwerking (gemiddelde bepalen) en uitvoer (gegevens naar display/seriële poort o.i.d.).

Hier een stukje code om duidelijk te maken wat ik bedoel.
Het is GEEN volledige schets!!

cpp code
/*
* codefragment geneste lussen
*
*/

#define INTERVAL 2000 // tijd tussen de metingen
#define N_opnemers 8 // aantal opnemers
#define N_metingen 50 // aantal metingen voor gemiddelde

float somSensor[8]; // som v/d metingen per sensor
float avgSensor[8]; // gemddelde waarde per sensor


void invoer() {
for(int i = 0; i < (N_opnemers); i++) {
somSensor[i] = 0;
}

for(int i = 0; i < (N_metingen); i++) {
for(int j = 0; j < (N_opnemers); j++) {
// lees de waarde van sensor nummer j
// somSensor[j] = somSensor[j] + ingelezen waarde
}
delay(INTERVAL);
}
}

void verwerking() {
for(int i = 0; i < (N_opnemers); i++) {
avgSensor[i] = somSensor[i] / N_metingen;
}
}

void setup() {
// geen code
}

void loop() {
invoer();
verwerking();
}

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 30 Aug 2016, 18:46

@FPC_user:

ja dat was idd het plan. en dank je voor je stukje code. gelukkig begrijp ik nog net genoegom te zien dat het geen gehele code is. maar wel duidelijk genoeg om het in mijn bestaande code te kunnen implementeren.
Echter ik denk dat nico verduin gelijk heeft en eenslepend gemiddelde beter is in deze situatie. creert een soort van trendlijn waar ik in geintresseerd ben. nu is jouw code heel duidelijk voor mij dus ik ga proberen vanavond het slepend gemiddelde in jouw code te impementeren en dan het geheel in de bestaande code. nu moet ik zeggen. ik begijp de code van het slepend gemiddelde niet helemaal. dus dat maakt t wat lastig. ik heb er zondag enmaandag veelvuldig naar gekeken.. maar kom er niet uit. misschien met behulp van jouw code.

dit is het loop deel dat ik nu heb. niet goed ik wet het maar begin me blind te staren.

zit vooral met het punt dat ik een aantal variabelen heb waarvan ik het nut niet zie (aVer) omdat het verder niet gebruikt wordt.
wat er precies aan het einde gereturned wordt (waarde in welke variabele) en hoe kan een return zowiezo in een void loop.
en hoe ik de for loop in het slepende gemiddelde moet doen (heb nuteveel i-tjes ik weet het. zucht.)

cpp code
// main loop
void loop() {

// local variables
//
char lcdMsg[17]; // use a temp char array for LCD displaying row

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

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

// Algemene functie voortschrijdend gemiddelde voor de 8 sensors
//
int(float Calc_Meeting(int temp[i], int buffer[], unsigned char &oudste[i], int &som[i]) {
if (oudste[i] >= N_Meeting) {
oudste = 0;
}
som[i] -= buffer[oudste[i]];
som[i] += meetwaarde[i];
buffer[oudste[i]] = temp[i];
oudste += 1;
return som[i] / N_Meeting;
}

// get the temperature into our temp array
//
temp[i] = readTemp(i);
Serial.print("temp ");
Serial.print(i);
Serial.print(" : ");
Serial.println(temp[i]);
Serial.println();

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

// get the highest temperature
//
if(i == 0) {

// this is the first temperature read so it is automatically the highest
//
tempHigh = temp[i];
Serial.print("tempHigh ");
Serial.print(" : ");
Serial.println(tempHigh);
Serial.println();
} else {

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

// got one
//
tempHigh = temp[i];
}
}
}

// check if any temperature was below min
//
if (tempHigh < TempMin) {
fanSpeed = 0; // stop fan
leds[0].setRGB(255, 255, 255);
}

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;
b = 377-r; // change the color of the blue led linverse to the red led
Serial.print("fanSpeed : ");
Serial.println(fanSpeed);
Serial.print("Red : ");
Serial.println(r);
Serial.print("Blue : ");
Serial.println(b);
Serial.print("Green : ");
Serial.println(g);
Serial.println();
}

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
Serial.print("fanSpeed : ");
Serial.println(fanSpeed);
}

// update the LCD
//
Serial.println("kijken of dit geprint word...........");
sprintf(lcdMsg, "%2d,%2d,%2d,%2d:%3d%r", sensor[0], sensor[1], sensor[2], sensor[3], fanSpeed);
lcd.setCursor(0, 0);
lcd.print(lcdMsg);

sprintf(lcdMsg, "%2d,%2d,%2d,%2d:%3d%%", sensor[4], sensor[5], sensor[6], sensor[7], fanLCD);
lcd.setCursor(0, 1);
lcd.print(lcdMsg);

// start the timer for the next time
//
// timer = millis();
//
}

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, 20:16

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.

cpp code
/*
main.cpp - Main loop for Arduino sketches
Copyright (c) 2005-2013 Arduino Team. All right reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library 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
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
init();

initVariant();

#if defined(USBCON)
USBDevice.attach();
#endif

setup();

for (;;) {
loop();
if (serialEventRun) serialEventRun();
}

return 0;
}

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor FPCUser » 30 Aug 2016, 20:36

Nico was weer sneller...


Tja, als je alles in de functie loop() blijft plakken krijg je problemen. :(

De functie voor de berekening voortschrijdend gemiddelde was oorspronkelijk, zoals de naam ook aangeeeft, een functie.
Dat is een losstaand stukje programma dat je aanroept met argumenten en een fuctiewaarde terug geeft.
In deze functie kan je variabelen hebben, dat zijn dan lokale varabelen zoals i en j, die niets te maken hebben met i en j in je loop() functie of de i en j in welk andere functie dan ook.
Ook bij de parameters van de functie zie je nog iets bijzonder, n.l. de &.

Daarom een tip: Leer eerst eens over de programmeertaal C, anders bljf je problemen houden (maken).
En deel je programma op in blokken (functies).
Oke, ik kan makkelijk praten, omdat m'n eerste programmeertaal Pascal was, en daar heb je procedures, en functies en procedures en ....

Hierbij een link naar een pdf waar e.a. kort en bondig wordt beschreven.
http://www.hef.ru.nl/~pfk/onderwijs/pm/docs/pmhand.pdf

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

Re: fancontroler aanpassen van 1 naar 8 sensers

Berichtdoor Spikey1973 » 30 Aug 2016, 21:10

ben het helemaalmetjullie eens.

maar er is een maar. eigenlijk twee maren in dit geval.
ik heb twee beginners cursussen doorlopen van begin tot eind. het nadeel hiervan is dat deze te simplistich zijn.
dat is als een taal leren maar geen woordjes gebruiken langer dan 4 letters. dan kan je best die taal helemaal doorlopen hebben en wat gramatica gezien hebben maar je zal nooit een normale zin kunnen zeggen. das hier ook mee.
die te simpele voorbeeldjes vervallen al heel snel in een serieus stuk taal. maar op een gegevn moment moet je de overstap maken.
ik heb dat nu geprobeerd omdat ik een doel heb voordit specifiek stuk code.

maar anyway. ik zal proberen tebeginnenmet decorrecte stuctuur in decode aan te brengen in je link door te nemen. maar tot nu toe zie ik daar alleen het zelfde probleem.

iig bedankt.

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, 21:24

FPCUser schreef:Nico was weer sneller...



En dat voor een oude lul :mrgreen: nog een dag :mrgreen: :mrgreen:
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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, 21:29

FPCUser schreef:Oke, ik kan makkelijk praten, omdat m'n eerste programmeertaal Pascal was, en daar heb je procedures, en functies en procedures en ....


Die had je al met Fortran, en Basic en assembly en autocoder en Cobol enz. Maar voor alle programmeurs geld en gold...... leren.. en doen.... leren... en doen... en hopen op veel fouten en bugs... daar leer je het meest van. Verder is er een enorme scala aan tutorials voor elke taal. Zelfs APL.... maar dat was een straf :geek: Zelfs boeken kunnen gedownload... En waar beginnen? bij het begin dus "for beginners"...
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 11 gasten