We do what we must because we can.
Behuizing is voor mij ook niet nodig.
[ Voor 14% gewijzigd door alexandersamson op 24-12-2013 09:46 ]
Elektronicaprojecten van mij: http://www.gm7.nl
All electric components run on smoke. If you let the smoke out, they won't work anymore.
O jah?mcDavid schreef op dinsdag 24 december 2013 @ 00:27:
Omdat Micro-USB het enige kabeltje is wat je nooit hoeft te zoeken omdat het altijd al klaar ligt.
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Verwijderd
- 50,-
- alles
maar een 'basis' print met wat componenten om te starten is ook prima zodat je later kan uitbreiden ?
[ Voor 31% gewijzigd door Verwijderd op 24-12-2013 11:08 ]
Bij 10 duikt te de prijs richting de 13 euro.
Uiteraard komen daar nog verzendkosten bij
All electric components run on smoke. If you let the smoke out, they won't work anymore.
All electric components run on smoke. If you let the smoke out, they won't work anymore.
Nu werken beide stukken software goed op zichzelf:
- domotica: luisteren naar de seriele poort op commando's en eveneens de bus (2 digitale pinnen) in de gaten houden via een interrupt.
- openenergymonitor: continu de waardes van 4 analoge sensoren uitlezen: 3x ct en 1xac/ac adapter en hiermee het acturele stroomverbruik op de 3 fases berekenen (gebruikt millis())
Als ik ze echter cobineer zorgt een activatie van de interrupt dat de arduino vastloopt...
De code van de interrupt is : aangezet via attachInterrupt(0, NB_get_bus, RISING); in de setup()
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
| void NB_get_bus() //starts when puls is going high { detachInterrupt(0); //uitzetten zodat we geen interferentie krijgen unsigned long puls; unsigned long knop = 0; knop=0; do { puls = pulseIn(NB_Bus_in, LOW,3600); // wait until pin gets low, then time the low pulse }while (!((puls>2310)&&(puls<3850))&&!(puls==0)) ; // loop until start pulse is passed, deze is tussen 300*10 en 320*10 lang do { puls = pulseIn(NB_Bus_in, LOW,3600); // loop om de eerste reeks te vermijden en de 2e reeks in te lezen - fouten in de eerste? }while (!((puls>3000))&&!(puls==0)) ; puls = pulseIn(NB_Bus_in, LOW,3600); puls = pulseIn(NB_Bus_in, LOW,3600); puls = pulseIn(NB_Bus_in, LOW,3600); for (int NB_i=1;NB_i<=24;NB_i++) // er zijn 24 bits uit te lezen { puls = pulseIn(NB_Bus_in, LOW,3600); knop=knop << 1; if (puls<=1000&&puls!=0){knop|=0b1;} } for (int NB_i=1;NB_i<=50;NB_i++) // hiermee lezen we de 3e reeks in, en eventuele achterkomende dingen, we doen dit zodat deze niet de interrupt triggeren { puls = pulseIn(NB_Bus_in, LOW,3600); } if(knop != 0) busJ=knop; //dit is een algemene variabele en kunnen we altijd uitlezen Serial.print("N:"); Serial.println(busJ,HEX); //om te testen - uitzetten in definitieve versie attachInterrupt(0, NB_get_bus, RISING); } |
Heeft er iemand een idee hoe dit zou komen? Enige alternatief die ik zie is het geheel opsplitsen over 2 meduino's. Is het in dat geval een goed idee om die gewoon 1 op 1 door te verbinden voor 5V / gnd / een aantal analoge poorten (deze worden toch niet gebruikt op de andere)
Verwijderd
delay(xx) en millis(xx) kunnen problemen geven wanneer je weer uit je interrupt komt.
die waarden zou je dan eerst even op moeten slaan en terugzetten bij verlaten ISR
[ Voor 7% gewijzigd door Verwijderd op 24-12-2013 16:17 ]
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
| void calcVI3Ph(int cycles, int timeout) { int SupplyVoltage = readVcc(); int crossCount = 0; // Used to measure number of times threshold is crossed. int numberOfSamples = 0; // This is now incremented int numberOfPowerSamples = 0; // Needed because 1 cycle of voltages needs to be stored before use boolean lastVCross, checkVCross; // Used to measure number of times threshold is crossed. double storedV[PHASE3]; // Array to store >120 degrees of voltage samples //------------------------------------------------------------------------------------------------------------------------- // 1) Waits for the waveform to be close to 'zero' (500 adc) part in sin curve. //------------------------------------------------------------------------------------------------------------------------- boolean st=false; // an indicator to exit the while loop unsigned long start = millis(); // millis()-start makes sure it doesnt get stuck in the loop if there is an error. while(st==false) // Wait for first zero crossing... { startV = analogRead(inPinV); // using the voltage waveform if ((startV < 550) && (startV > 440)) st=true; // check it's within range if ((millis()-start)>timeout) st = true; } //------------------------------------------------------------------------------------------------------------------------- // 2) Main measurment loop //------------------------------------------------------------------------------------------------------------------------- start = millis(); while ((crossCount < cycles * 2) && ((millis()-start)<timeout)) { lastSampleV=sampleV; // Used for digital high pass filter - offset removal lastSampleI1=sampleI1; lastSampleI2=sampleI2; lastSampleI3=sampleI3; lastFilteredV = filteredV; lastFilteredI1 = filteredI1; lastFilteredI2 = filteredI2; lastFilteredI3 = filteredI3; //----------------------------------------------------------------------------- // A) Read in raw voltage and current samples //----------------------------------------------------------------------------- sampleV = analogRead(inPinV); // Read in raw voltage signal sampleI1 = analogRead(inPinI1); // Read in raw current signal sampleI2 = analogRead(inPinI2); // Read in raw current signal sampleI3 = analogRead(inPinI3); // Read in raw current signal //----------------------------------------------------------------------------- // B) Apply digital high pass filters to remove 2.5V DC offset (to centre wave on 0). //----------------------------------------------------------------------------- filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV); filteredI1 = 0.996*(lastFilteredI1+sampleI1-lastSampleI1); filteredI2 = 0.996*(lastFilteredI2+sampleI2-lastSampleI2); filteredI3 = 0.996*(lastFilteredI3+sampleI3-lastSampleI3); storedV[numberOfSamples%PHASE3] = filteredV; // store this voltage sample in circular buffer if (crossCount > 2) // one complete cycle has been stored, so can use delayed { // voltage samples to calculate instantaneous powers //----------------------------------------------------------------------------- // C) Root-mean-square method voltage //----------------------------------------------------------------------------- sqV= filteredV * filteredV; //1) square voltage values sumV += sqV; //2) sum //----------------------------------------------------------------------------- // D) Root-mean-square method current //----------------------------------------------------------------------------- sqI1 = filteredI1 * filteredI1; //1) square current values sumI1 += sqI1; //2) sum sqI2 = filteredI2 * filteredI2; sumI2 += sqI2; sqI3 = filteredI3 * filteredI3; sumI3 += sqI3; //----------------------------------------------------------------------------- // E) Phase calibration - for Phase 1: shifts V1 to correct transformer errors // for phases 2 & 3 delays V1 by 120 degrees & 240 degrees respectively // and shifts for fine adjustment and to correct transformer errors. //----------------------------------------------------------------------------- phaseShiftedV1 = lastFilteredV + Phasecal1 * (filteredV - lastFilteredV); phaseShiftedV2 = storedV[(numberOfSamples-PHASE2-1)%PHASE3] + Phasecal2 * (storedV[(numberOfSamples-PHASE2)%PHASE3] - storedV[(numberOfSamples-PHASE2-1)%PHASE3]); phaseShiftedV3 = storedV[(numberOfSamples+1)%PHASE3] + Phasecal3 * (storedV[(numberOfSamples+2)%PHASE3] - storedV[(numberOfSamples+1)%PHASE3]); //----------------------------------------------------------------------------- // F) Instantaneous power calc //----------------------------------------------------------------------------- instP1 = phaseShiftedV1 * filteredI1; //Instantaneous Power sumP1 +=instP1; //Sum instP2 = phaseShiftedV2 * filteredI2; sumP2 +=instP2; instP3 = phaseShiftedV3 * filteredI3; sumP3 +=instP3; numberOfPowerSamples++; //Count number of times looped for Power averages. } //----------------------------------------------------------------------------- // G) Find the number of times the voltage has crossed the initial voltage // - every 2 crosses we will have sampled 1 wavelength // - so this method allows us to sample an integer number of half wavelengths which increases accuracy //----------------------------------------------------------------------------- lastVCross = checkVCross; if (sampleV > startV) checkVCross = true; else checkVCross = false; if (numberOfSamples==1) lastVCross = checkVCross; if (lastVCross != checkVCross) crossCount++; numberOfSamples++; //Count number of times looped. } //------------------------------------------------------------------------------------------------------------------------- // 3) Post loop calculations //------------------------------------------------------------------------------------------------------------------------- //Calculation of the root of the mean of the voltage and current squared (rms) //Calibration coefficients applied. double V_Ratio = Vcal *((SupplyVoltage/1000.0) / 1023.0); Vrms = V_Ratio * sqrt(sumV / numberOfPowerSamples); double I_Ratio1 = Ical1 *((SupplyVoltage/1000.0) / 1023.0); Irms1 = I_Ratio1 * sqrt(sumI1 / numberOfPowerSamples); double I_Ratio2 = Ical2 *((SupplyVoltage/1000.0) / 1023.0); Irms2 = I_Ratio2 * sqrt(sumI2 / numberOfPowerSamples); double I_Ratio3 = Ical3 *((SupplyVoltage/1000.0) / 1023.0); Irms3 = I_Ratio3 * sqrt(sumI3 / numberOfPowerSamples); //Calculation power values realPower1 = V_Ratio * I_Ratio1 * sumP1 / numberOfPowerSamples; apparentPower1 = Vrms * Irms1; powerFactor1 = realPower1 / apparentPower1; realPower2 = V_Ratio * I_Ratio2 * sumP2 / numberOfPowerSamples; apparentPower2 = Vrms * Irms2; powerFactor2 = realPower2 / apparentPower2; realPower3 = V_Ratio * I_Ratio3 * sumP3 / numberOfPowerSamples; apparentPower3 = Vrms * Irms3; powerFactor3 = realPower3 / apparentPower3; //Reset accumulators sumV = 0; sumI1 = 0; sumI2 = 0; sumI3 = 0; sumP1 = 0; sumP2 = 0; sumP3 = 0; //-------------------------------------------------------------------------------------- #ifdef DEBUGGING // Include these statements for development/debugging only Serial.print("Total Samples: "); Serial.print(numberOfSamples); Serial.print(" Power Samples: "); Serial.print(numberOfPowerSamples); Serial.print(" Time: "); Serial.print(millis() - start); Serial.print(" Crossings: "); Serial.println(crossCount); for (int j=0; j<PHASE3; j++) { Serial.print(storedV[j]); Serial.print(" "); Serial.println(); } #endif } |
Verwijderd
op het moment dat je in je interrupt routine komt staat de millis teller in de 'openenergymonitor stil
Maar makkelijkere vraag: Hoever komt hij? Doet hij de laatste prints in de interrupt? In het geval van nee, als je ze wat eerder erin zet, tot hoever komt hij?
Verwijderd
tja, ik laat de uitvoering aan jou over, persoonlijk wil een zo uitgebreid mogelijke multi programmer, tot en met net adapter en kabeltjes toeSnowDude schreef op dinsdag 24 december 2013 @ 13:23:
Nee dat is zonder de isp kabels dan komt er nog iets van 4 euro bij
een ander zo uitgekleed en goedkoop mogelijk, laat maar weten als je zover ben en hoe of wat kwa betalen
Verwijderd

deze oude klok krijgt digitaal arduino binnenwerk
daarvoor moet ik nog wel een keurige cirkel plexiglas/rookglas zien te maken, iemand tips
* gevonden
[ Voor 13% gewijzigd door Verwijderd op 31-12-2013 11:23 ]

Hier ben ik nu mee bezig. Alleen heb een probleem met de I2C naar die teensy2++ toe. Als ik de traces volg lijkt alles te kloppen, hij vertraagt ook de bus, maar er komt geen data over... rara wat is er loos (to be continued...)
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
dat kan je ff nagaan met deze 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
| #include <Wire.h> // -------------------------------------- // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0...127 to 1...119, // according to the i2c scanner by Nick Gammon // http://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) //Serial.println(address); { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); //Serial.println(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } |
via de terminal kan je dan zien of er wel een I2C device gezien wordt en op welk adres
(heb 5 chips op dat bord namelijk, waaronder 1 master)
EDIT-Al uitgevogeld.
Ik krijg het volgende:
Scanning...
I2C device found at address 0x04 !
I2C device found at address 0x05 !
I2C device found at address 0x06 !
I2C device found at address 0x07 !
done
Hij ziet dus al mijn chips
[ Voor 53% gewijzigd door alexandersamson op 24-12-2013 19:24 ]
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
ik denk het wel.. gewoon even uploaden en starten, dan je serial monitor (9600) aanzetten
[ Voor 3% gewijzigd door Verwijderd op 24-12-2013 19:24 ]
Verwijderd
clk ok
oeps.. kerstborrel.. je weet tog

[ Voor 34% gewijzigd door Verwijderd op 24-12-2013 19:27 ]
Die hebben SCK en SDA.
Zijn niet omgedraaid
Verklaar die laatste post eens nader?
[ Voor 22% gewijzigd door alexandersamson op 24-12-2013 19:27 ]
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
ik weet dus niet wat er bij jou 'aanhangt
Elektronicaprojecten van mij: http://www.gm7.nl
Had je niet kunnen weten, maar je hebt mij indirect toch wel enorm geholpen door je 'klokmodule' haha
Elektronicaprojecten van mij: http://www.gm7.nl
Elektronicaprojecten van mij: http://www.gm7.nl
Elektronicaprojecten van mij: http://www.gm7.nl

Wat kan je hoop tekst kwijt op zo TFT, gebruik veel 2x16 (char.) en 64x128(pixel), 240x320(pixel) is toch wel weer wereld van verschil, tekst word wel erg klein.

Komt omdat er nog de 24c chipje opzit, eeprom heeft eigen adres.Verwijderd schreef op dinsdag 24 december 2013 @ 19:28:
heb hier een klokmodule.. die geeft 2 I2C adressen terug.. je kan de ram op dat bordje apart via I2c benaderen.
ik weet dus niet wat er bij jou 'aanhangt
@alexandersamson
Heb heb je iets van logic analyzer of scoop? Handigste is gewoon eerst i2c bus bekijken wat eruit komt en of er überhaupt iets uitkomt.
[ Voor 19% gewijzigd door mad_max234 op 24-12-2013 23:37 ]
Verwijderd
dan moet er nog wel een klein zonnepaneeltje en ladertje bij komen
[ Voor 28% gewijzigd door Verwijderd op 24-12-2013 23:41 ]
Kun je zo'n ding een beetje aansturen met een microcontroller? Alleen voor tekst neem ik aan...mad_max234 schreef op dinsdag 24 december 2013 @ 23:18:
Wat kan je hoop tekst kwijt op zo TFT, gebruik veel 2x16 (char.) en 64x128(pixel), 240x320(pixel) is toch wel weer wereld van verschil, tekst word wel erg klein.
[afbeelding]
Heb zelf een 240x400 schermpje besteld voor aan de RPi, ben benieuwd of ik daar een beetje bewegend beeld op kan krijgen.
Komt eentje in de bievenbus met reedrelay en magneetje zodat ik weet wanneer de postboden is geweest.
Heb in zomer altijd veel planten in de tuin, ga daar vochtigheid van aarde meten en temperatuur van de potten. En uiteaard buitentemperatuur, luchtvochtigheid, luchtdruk, wellicht maak ik ook nog regenmeter en windmeter, of koop ze kant en klaar.
Bewegende beelden kunnen ook, alleen niet zo hoog framerate. En hoe hoger de resolutie des te lastiger word het. Foto's weergeven vanaf een SD kaart gaat ook prima. Het is vol grafische TFT, je kan er dus ook alles mee wat va grafisch lcd mag verwachten.mcDavid schreef op dinsdag 24 december 2013 @ 23:44:
[...]
Kun je zo'n ding een beetje aansturen met een microcontroller? Alleen voor tekst neem ik aan...
Heb zelf een 240x400 schermpje besteld voor aan de RPi, ben benieuwd of ik daar een beetje bewegend beeld op kan krijgen.
Zie bijv youtube voor voorbeelden, heb er even twee willekeurige gepakt, er zijn nog meer filmpjes.
YouTube: Arduino and 2.2'' Serial TFT ILI 9341
YouTube: Arduino TFT xmem graphics library full demo
[ Voor 51% gewijzigd door mad_max234 op 24-12-2013 23:53 ]
Laad je op met lipo lader, voor single cell is simpele usb lader voldoende.
http://www.ebay.com/itm/N...ain_0&hash=item5d36edbb16
Probleem is al opgelost, lag aan een fout dat ik een RTC was vergeten aan te sluiten die de 'heartbeat' is van de datastroom berekening. Omdat die mistte, leek de I2C gewoon te werken en kreeg ik zelfs adressen door enzo, maar een stuk functionaliteit mistte. Is nu opgelost. Ik heb inderdaad een logic analyzer, maar ben daar nog nieuw mee, heb dat ding pas een paar dagen, dus nog wat te leren haha
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
wow.. dat usb lipo laderprintje is een koopje !
jij weet altijd de goedkoopste plekjes.. waar haal je die lipo zelf .. want die worden meestal niet verzonden uit china.
en ik wil evt. wel wat printjes meebestellen.. maar ik ben te kippig om smd te solderen
[ Voor 20% gewijzigd door Verwijderd op 25-12-2013 12:19 ]
Logic analyzer is bijna onmisbare tool als je in de weer gaat met i2c, spi, usart, ir. Kan wel zonder maar dan loop je vaak onnodig lang te zoeken, even naar bus kijken en je weet zo welke data eruit komt. Was mooie opperunitie geweest om analyzer voor eerst te testen.
@borroz
Lipo verzenden ze gewoon vanuit china, heb nu drie keer aantal gekocht en zijn tot nu toe altijd aangekomen, koop ze meestal per 2, sloop ze namelijk nog wel eens, mag ze niet onder 2.5v laten zakken en mag ze niet aluminiumfolie mag je niet beschadigen, want dan drogen ze uit.
18650 cellen zijn wat robuuster en bevatten heel wat meer power, die gebruik ik ook geregeld, zijn ook lithium en te laden met usb lader.
Je kan zo een usb lader ook aan zonnecel hangen, lader werkt tussen 4 en 8v volt, dat is bruikbaar range voor zonnecel.
Heb deze 240mAh lipo van deze ebay store, eddiestore2008. (edit: mail hem maar eerst even of ze ze nog hebben staat namelijk: 50 available / 122 sold. Al zegt dat niet altijd wat, vaak is dat foutje en gaat het gewoon om product wat ze oneindig beschikbaar hebben en vast in hun aanbod zit)
http://www.ebay.com/itm/2...ories&hash=item53ff0a3e1d
Edit/
Wil je ook van die nrf24 nodes(arduino printje, niet de nrf24 transceiver) printjes hebben? Was eigenlijk voor mezelf bedoeld maar kan er wel paar missen. Ik wil wel voor je de atmeg328 erop zetten. Maar zal nog wel even paar weken duren, ben eerst nog wat aan testen, dan moet ik het printje ontwerpen, dan alles klaar maken om naar fabriek te zenden, dan twee a drie weken wachten voordat ze aankomen.
[ Voor 24% gewijzigd door mad_max234 op 25-12-2013 13:51 ]
Ik hou deze link even in de gaten, zal straks staat 50 available / 123 sold of 49 available / 123 sold dan weten we het zeker.

Vandaag bezig geweest met een DS1307 volgens deze website :
http://tronixstuff.com/20...th-arduino-chapter-seven/
Dat ging allemaal prima alleen ik krijg met een usb-scoopje geen sqw in beeld.
Ik heb deze module :

Ik gebruik de rechterkant, links heb ik geen pinheader zitten.
De rechterkant heeft VCC, GND, SCL, SDA en DS.
Waar is DS voor ?
Ik zie dat helemaal niet op de datasheet ?
http://tronixstuff.com/wp...0/05/maxim-ds1307-rtc.pdf
Ik meet daar met de scoop een constante 5V
Dat bij mij de SQW niet werkt komt misschien omdat de website een andere schakeling gebruikt als mijn module :

Of beter gezegd, aan de kant van de module die ik gebruik om aan te sluiten zit helemaal geen SQW.
Nu is mijn vraag, als ik nu op de rechterkant een pinheadertje soldeer kan ik die kant dan precies hetzelfde gebruiken als de linkerkant ?
Ik heb maar één module anders zou ik het gerust zelf even uit proberen maar nu ben ik liever wat voorzichtiger.
Bijgeleverde documentatie bij die module geeft slechts de datasheet van de ds1307 en geen uitleg over waarom er aan 2 kanten aansluitingen zitten of wat die doen.
Alvast bedankt.
edit: Net de datasheet bekeken, de pin-beschrijvingen komen niet eens helemaal overeen
edit2: Zit er een tempsensor op dat ding? Zie dan http://www.hobbyist.co.nz/?q=real_time_clock , ctrl+f'en naar Arduino Tiny RTC I2C Real Time Clock Pinout.
[ Voor 46% gewijzigd door Raven op 25-12-2013 15:20 ]
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Dus, als ik je goed begrijp is het dus niet zo dat ik P2 gewoon hetzelfde kan gebruiken als P1 ?Raven schreef op woensdag 25 december 2013 @ 15:10:
Die P2 is zo te zien voor het doorlussen van de I2C bus, zodat je op P2 een ander I2C apparaat aan kan sluiten waarna de verbinding via dat printje naar de Arduino gaat.
Tja, ik tel er achtedit: Net de datasheet bekeken, de pin-beschrijvingen komen niet eens helemaal overeen
X1, X2 voor kristal
VCC, GND, SDA, SCL
SQW
en dan een pennetje 3 voor VBatt.
Maar geen DS ?
DS kun je op de pagina in edit2 van mijn vorige bericht vinden
[ Voor 37% gewijzigd door Raven op 25-12-2013 15:24 ]
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Verwijderd
' Wil je ook van die nrf24 nodes(arduino 328 + printje) '
ja graag.. indien dat mag wil ik wel een paar meebestellen.
het voordeel van jou printje zijn natuurlijk de afmetingen (anders moet ik op expi print een normale 328 monteren) en de lage spanning van die smd versie waardoor de lipo's ook klein blijven.
als je zover ben DM me even.. bvd
Er schiet me ineens wat te binnen, bij P1 P2 zitten 3 aansluitingen die niet gebruikt worden. zie afb vorige post.
Grote kans dat 1 daarvan misschien sqw is.
Ga zometeen proberen met krokodillenklem erop
[ Voor 4% gewijzigd door kitao op 25-12-2013 15:34 . Reden: foutje P1/P2 ]
Verwijderd

ik had nog een paar temp sensors type LM35 liggen.
gelijk even uitgeprobeerd een kind kan de was doen
- http://www.instructables....-TEMPERATURE-SENSOR-LM35/
- http://playground.arduino.cc/Main/LM35HigherResolution
zoekende naar een datasheet kwam ik deze leuke toepassing tegen, gebouwd met processing, waardoor je je arduino data grafisch weer kan geven op een PC via serial.

de processing editor ziet er hetzelfde uit als die van arduino, de code draait op de PC.
[ Voor 51% gewijzigd door Verwijderd op 26-12-2013 17:21 ]
Is het niet makkelijker om de spoortjes te volgen of er een multimeter met doormeetstand (piepstand noem ik hetkitao schreef op woensdag 25 december 2013 @ 15:28:
Bedankt voor die link zeg.
Er schiet me ineens wat te binnen, bij P1 P2 zitten 3 aansluitingen die niet gebruikt worden. zie afb vorige post.
Grote kans dat 1 daarvan misschien sqw is.
Ga zometeen proberen met krokodillenklem erop
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Ja, goeie tip.Raven schreef op woensdag 25 december 2013 @ 15:57:
[...]
Is het niet makkelijker om de spoortjes te volgen of er een multimeter met doormeetstand (piepstand noem ik het) op aan te sluiten om te kijken waar die SQ pin mogelijk mee verbonden is?
Net gedaan, hoewel wat lastig met smd.
Echter, ik krijg nog steeds geen blokgolf op de scoop. Die staat met probe op de sqw en de andere op Gnd.
Zou je toch verwachten dat je dan wat in beeld krijgt.
Ik heb toch nog een andere rtc gevonden, dat is deze :
http://www.ebay.com/itm/D...ain_0&hash=item4d03e98fe9
Die heeft wel sqw en slechts één rij aansluitingen. Tijd werkt maar eveneens geen sqw in beeld.
Dusss......, of het ligt aan mijn instellingen/aansluitingen van de scoop of het programma is gammel :
1
2
| Wire.write(00010000); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave Wire.endTransmission(); |
Trouwens Raven, in jouw link wordt juist P1 gebruikt om op uno aan te sluiten en niet P2 zoals ik heb :

Dus het kan toch allebei.
En dan nog iets, als ik seriele monitor open zie ik de tijd.
Sluit ik de monitor en open ik die opnieuw begint de tijd weer opnieuw ?!!
Ik wist niet dat die monitor een reset functie had ?
@Borroz
Ik vind het wel meevallen hoor, tijd loopt nog steeds goed.
Of wat je van elektronicahobbyist zou verwachten pas je hem aan zodat die wel doet wat je wilt. Kwestie van twee pootjes solderen van nieuwe kristal en hij doet het prima. En beteken ook niet dat alle printjes zo slecht zijn, zitten grote variaties in goedkope kristallen een op de zoveel wijkt gewoon gigantisch af en de rest wijkt beetje af, veel geld word er niet besteedt aan sorteren van dit soort goedkope onderdelen.Verwijderd schreef op woensdag 25 december 2013 @ 16:13:
[...]
jij ook en bij deze mijn kersttip om veel ergenis te voorkomen![]()
[afbeelding]
Gebruik ook wel eens chinezen kristallen, klok zit er meestal minuutje naast per maand, maar dat kan je prima in software corrigeren, weet immer hoeveel die afwijkt.
[ Voor 27% gewijzigd door mad_max234 op 25-12-2013 17:30 ]
Dat klopt, P1 hoort gebruikt te worden, P2 alleen voor doorlussen, al werkt P2 blijkbaar wel aangesloten op de Arduino? En dat met de seriële monitor heb ik ook wel eens gemerkt, leesvoer: http://playground.arduino...toResetOnSerialConnectionkitao schreef op woensdag 25 december 2013 @ 17:09:
[...]
Ja, goeie tip.
Net gedaan, hoewel wat lastig met smd.
Echter, ik krijg nog steeds geen blokgolf op de scoop. Die staat met probe op de sqw en de andere op Gnd.
Zou je toch verwachten dat je dan wat in beeld krijgt.
Ik heb toch nog een andere rtc gevonden, dat is deze :
http://www.ebay.com/itm/D...ain_0&hash=item4d03e98fe9
Die heeft wel sqw en slechts één rij aansluitingen. Tijd werkt maar eveneens geen sqw in beeld.
Dusss......, of het ligt aan mijn instellingen/aansluitingen van de scoop of het programma is gammel :
C++:
1 2 Wire.write(00010000); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave Wire.endTransmission();
Trouwens Raven, in jouw link wordt juist P1 gebruikt om op uno aan te sluiten en niet P2 zoals ik heb :
[afbeelding]
Dus het kan toch allebei.
En dan nog iets, als ik seriele monitor open zie ik de tijd.
Sluit ik de monitor en open ik die opnieuw begint de tijd weer opnieuw ?!!
Ik wist niet dat die monitor een reset functie had ?
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Verwijderd
maar goed, er zitten wellicht ook goede exemplaren tussen
[ Voor 33% gewijzigd door Verwijderd op 25-12-2013 17:43 ]
Ja, zo zit het al een jaar of meer.Raven schreef op woensdag 25 december 2013 @ 17:37:
Dat klopt, P1 hoort gebruikt te worden, P2 alleen voor doorlussen, al werkt P2 blijkbaar wel aangesloten op de Arduino?
Toen ik dat ding kreeg zat er maar ene pinheader bij met 5 pootjes dus die heb ik op P2 gezet.
En sindsdien gebruikt.
Ps, en weer bedankt voor de link.
Maar dat wordt morgen, ben er klaar mee voor vandaag
Ps2
Dit staat in jouw link :
The most useful pins are duplicated from P1 to P2.
Die pennetjes zijn gewoon duplicaatjes
[ Voor 21% gewijzigd door kitao op 25-12-2013 17:56 ]
I2C is een bus protocol, je hebt dus geen specifieke in en uitgangen voor I2C in princiepe kan je op alle printjes met een doorlus functie dus allebei de aansluitingen gebruiken.kitao schreef op woensdag 25 december 2013 @ 17:45:
[...]
Ja, zo zit het al een jaar of meer.
Toen ik dat ding kreeg zat er maar ene pinheader bij met 5 pootjes dus die heb ik op P2 gezet.
En sindsdien gebruikt.
Ps, en weer bedankt voor de link.
Maar dat wordt morgen, ben er klaar mee voor vandaag
Ps2
Dit staat in jouw link :
The most useful pins are duplicated from P1 to P2.
Die pennetjes zijn gewoon duplicaatjes
De auto reset kan je uitschakelen, dit zit er in voor de upload van software. Hou er rekening mee dat als je het uitzet je dan altijd de reset knop moet vasthouden voor dat je de upload van software start.
[ Voor 3% gewijzigd door SnowDude op 25-12-2013 23:36 ]
All electric components run on smoke. If you let the smoke out, they won't work anymore.
Daarom heet die tweede aansluiting ook XDA en XCL, daaraan zie je al dat het niet de zelfde bus is als SDA en SDL.Sissors schreef op donderdag 26 december 2013 @ 10:44:
Er zijn daar wel uitzonderingen op. Als je bijvoorbeeld een MPU6050 printje ophaalt heb je ook twee I2C poorten, maar de ene is enkel geschikt als uitgang terwijl op de andere je microcontroller moet zijn aangesloten (de andere gaan via de MPU6050 die een doorlus functie heeft of zelf controle kan overnemen van de tweede I2C poort).
All electric components run on smoke. If you let the smoke out, they won't work anymore.
Hmm, nee bedankt, ik zit maar wat te rommelen en is voorlopig geen noodzaak of iets.SnowDude schreef op woensdag 25 december 2013 @ 23:35:
De auto reset kan je uitschakelen, dit zit er in voor de upload van software. Hou er rekening mee dat als je het uitzet je dan altijd de reset knop moet vasthouden voor dat je de upload van software start.
Inmiddels headertje op P1 gezet : kitao in "[Discussie] Arduino-topic"
Aanvankelijk nog steeds geen signaal op SQW en wou net opgeven maar toen heb ik dit programma nog eens geprobeerd : http://tronixstuff.com/20...th-arduino-chapter-seven/
DS1307 Square-wave machine
Used to demonstrate the four different square-wave outputs from Maxim DS1307
Eindelijk beeld op de scoop zeg, pff

klik
Momenteel gebruik ik het nergens voor maar dat Tiny RTC-module is me nu wel een stuk duidelijker geworden dankzij de nodige hulp
O ja, volgende stap wordt dan om te kijken of ik er ergens een temperatuurmeting via DS eruit kan halen.
[ Voor 4% gewijzigd door kitao op 26-12-2013 12:20 . Reden: O ja ]
Je moet blijkbaar in de eerste string die je wil samenvoegen met een 2e string, ruimte hebben gedeclareerd, die ruim genoeg is voor beide strings.
Dus als stringA = "blabla" (7 byte (6 text, 1 terminator '0'))
en stringB = "fuuu" (5 byte, (4 text, 1 terminator '0')),
moet je StringA als 12 byte groot declareren....
Ik kreeg namelijk allemaal vreemde fouten die leken op een RAM overflow. Maar het blijkt dus dat die StringA 5 byte wegsnoepte van geheugen gereserveerd voor andere vars/functies... Lekker is dat
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
ja daar loop ik ook nog regelmatig tegen aan, het juist converteren/gebruiken van datatypes, anders zie ik alleen maar oranje regels onderaan mijn scketchalexandersamson schreef op donderdag 26 december 2013 @ 12:51:
Gisteravond had ik iets heel sneaky meegemaakt met de strcat() functie.
Je moet blijkbaar in de eerste string die je wil samenvoegen met een 2e string, ruimte hebben gedeclareerd, die ruim genoeg is voor beide strings.
Dus als stringA = "blabla" (7 byte (6 text, 1 terminator '0'))
en stringB = "fuuu" (5 byte, (4 text, 1 terminator '0')),
moet je StringA als 12 byte groot declareren....
Ik kreeg namelijk allemaal vreemde fouten die leken op een RAM overflow. Maar het blijkt dus dat die StringA 5 byte wegsnoepte van geheugen gereserveerd voor andere vars/functies... Lekker is dat
Verwijderd
die sqw kan vb gebruikt worden in je sketch om te checken of je klokmodule wel loopt, daartoe verbind je dat signaal met een input op je arduino en lees die een paar keer in.kitao schreef op donderdag 26 december 2013 @ 12:18:
[...]
Hmm, nee bedankt, ik zit maar wat te rommelen en is voorlopig geen noodzaak of iets.
Inmiddels headertje op P1 gezet : kitao in "[Discussie] Arduino-topic"
Aanvankelijk nog steeds geen signaal op SQW en wou net opgeven maar toen heb ik dit programma nog eens geprobeerd : http://tronixstuff.com/20...th-arduino-chapter-seven/
DS1307 Square-wave machine
Used to demonstrate the four different square-wave outputs from Maxim DS1307
Eindelijk beeld op de scoop zeg, pff
[afbeelding]
klik
Momenteel gebruik ik het nergens voor maar dat Tiny RTC-module is me nu wel een stuk duidelijker geworden dankzij de nodige hulp
O ja, volgende stap wordt dan om te kijken of ik er ergens een temperatuurmeting via DS eruit kan halen.
als je wel een tijd/datum binnenkrijgt maar je hebt geen 'hartbeat' is je klokmodule kaput.
-
Ik ga vandaag weer verder met het trachten te lezen van een CSV file op een SD kaartje met de arduino(mini) , met gebruik van oa de sdfatlib
Daartoe heb ik een eenvoudige CSV testfile geschreven op dat kaartje mbv CSved
Uiteindelijk is de bedoeling dat ik verjaardagen, ect. op kan slaan voor het hele jaar en mijn matrix klokje kijkt 1 x per dag op dat kaartje of er nog iets bijzonders te melden is.
Bij een verjaardag laat hij vb een knipperend hartje zien, bij een overlijden datum een kruisje + naam persoon.. work in progress


[ Voor 21% gewijzigd door Verwijderd op 26-12-2013 13:55 ]
String functie(zins versie 19) van arduino is een arduino fucntie, en geen echte c functie. Op achtergrond is string gewoon char array, zoals je dat bij c doet.alexandersamson schreef op donderdag 26 december 2013 @ 12:51:
Gisteravond had ik iets heel sneaky meegemaakt met de strcat() functie.
Je moet blijkbaar in de eerste string die je wil samenvoegen met een 2e string, ruimte hebben gedeclareerd, die ruim genoeg is voor beide strings.
Dus als stringA = "blabla" (7 byte (6 text, 1 terminator '0'))
en stringB = "fuuu" (5 byte, (4 text, 1 terminator '0')),
moet je StringA als 12 byte groot declareren....
Ik kreeg namelijk allemaal vreemde fouten die leken op een RAM overflow. Maar het blijkt dus dat die StringA 5 byte wegsnoepte van geheugen gereserveerd voor andere vars/functies... Lekker is dat
Dat gebeurd ook zonder strcat, als je array neemt die te klein is zal deel er niet in komen te staan.
Bij C moet je altijd array ruimte opgeven(of , het hoeft geen 12byte zijn, array mag alleen niet te klein zijn want dan mis je bytes, als arrary 6byte groot is en je probeer er 12byte in te stoppen zal alleen 6 MSB erin staan en de 6 LSB zullen erbuiten vallen, dat merkt de compiler en geeft dus fout.
Even snel voorbeeldje in elkaar gezet hoe ik het altijd doe, code niet getest.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| char stringbuffer[64]; // buffer naar eigen smaak aanpassen, zorg dat de buffer niet kleiner is dan alle gezamelijke strings bij elkaar. char string1[] = "hallo"; char string2[] = " wereld"; void setup() { // start serial port at 9600 bps: Serial.begin(9600); } void loop() { strcat(stringbuffer, string1); //string 1 in de buffer strcat(stringbuffer, string2); //string 2 erbij, nu in de buffer aanwezig: hallo wereld. Serial.println(stringbuffer); // Print: hallo wereld memset(stringbuffer, 0, sizeof(stringbuffer)); //reset buffer, anders loopt de buffer helemaal vol. delay(1000); } |
Edit/
Overigens mag je met string functie van de arduino ook zo doe met string.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| String string1 = "Hallo "; String string2 = "wereld"; // the setup routine runs once when you press reset: void setup() { Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { String String3 = string1 + string2; // string3 bevat: hallo wereld Serial.println(String3); delay(1000); } |
Maar voorbeeld 1 heeft minder resource nodig, geef dus voorkeur aan strcat ipv arduino string functie.
voorbeeld 1
Binaire sketch-grootte: 2.180 bytes (van een 32.256-byte maximum)
Voorbeeld 2
Binaire sketch-grootte: 4.024 bytes (van een 32.256-byte maximum)
[ Voor 15% gewijzigd door mad_max234 op 26-12-2013 18:03 ]
Ok bedankt.Verwijderd schreef op donderdag 26 december 2013 @ 12:58:
die sqw kan vb gebruikt worden in je sketch om te checken of je klokmodule wel loopt, daartoe verbind je dat signaal met een input op je arduino en lees die een paar keer in.
als je wel een tijd/datum binnenkrijgt maar je hebt geen 'hartbeat' is je klokmodule kaput.
Nu meen ik wel gelezen te hebben dat zo'n ds1307 niet vanzelf een blokgolf op sqw zet. Die zou eerst aangeroepen moeten worden met een register zoals 0x07
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| void sqw1() // set to 1Hz { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0x07); // move pointer to SQW address Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) Wire.endTransmission(); } void sqw2() // set to 4.096 kHz { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0x07); // move pointer to SQW address Wire.write(0x11); // sends 0x11 (hex) 00010001 (binary) Wire.endTransmission(); } |
Als dit eenmaal gedaan is dan 'onthoudt' de batterij dat.
Indien ik dat goed begrepen heb en er is nog geen register aangeroepen dan zou iemand dus wellicht ten onrechte kunnen denken dat die rtc naar de knoppen is.
Veel succes trouwens met je SD, ziet er ingewikkeld uit
Alle registers staan standaard op 0 van de ds1307, dat is bij meeste chips het geval. Staat dus standaard uit, en je mag de sqw pin als je niet aanzet gewoon los laten, gebruik je die functie niet heb je nisk te maken met sqw, mag je laten floaten.
"Bit 4: Square-Wave Enable (SQWE). This bit, when set to logic 1, enables the oscillator output. The frequency of the square-wave output depends upon the value of the RS0 and RS1 bits. With the square-wave output set to 1Hz, the clock registers update on the falling edge of the square wave. On initial application of power to the device, this bit is typically set to a 0."
Wat historie uit het dagboek van een hobby n00b:
Ik ben met een standaard 4x7 segment display (3461B) aan de slag gegaan omdat ik multiplexing wilde leren begrijpen. Ik wilde ook geen voorbeelden of libraries gebruiken maar de code zelf schrijven. Om die reden heb ik het display ook direct op mijn Uno boardje aangesloten zonder gebruik van een shift register (dat komt hierna
Ik gebruik een functie met 4 parameters om de cijfers te weer te geven. Nu zou ik dit prima met een 'for' lusje kunnen doen maar is het ook mogelijk om die 4 parameters daarin te verwerken? Wat ik bedoel:
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
| void displaynumber(byte numberToShow0,byte numberToShow1, byte numberToShow2, byte numberToShow3) { digitalWrite(ledPosition[0],HIGH); for(int a=0;a<8;a++){ if(bitRead(numberToShow0,a)==1){ digitalWrite(ledSegment[a],LOW); } else{ digitalWrite(ledSegment[a],HIGH); } } delay(wait); digitalWrite(ledPosition[0],LOW); // Vanaf hier moet ik herhalen: digitalWrite(ledPosition[1],HIGH); for(int a=0;a<8;a++){ if(bitRead(numberToShow1,a)==1){ digitalWrite(ledSegment[a],LOW); } else{ digitalWrite(ledSegment[a],HIGH); } } delay(wait); digitalWrite(ledPosition[1],LOW); // en dat voor alle 4 de cijfers... |
En dat vind ik erg 'lelijk' ik wil het liefste iets zoals dit gebruiken:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| void displaynumber(byte numberToShow0,byte numberToShow1, byte numberToShow2, byte numberToShow3) { for(b=0;b<4;b++){ digitalWrite(ledPosition[b],HIGH); for(int a=0;a<8;a++){ if(bitRead(numberToShow0,a)==1){ digitalWrite(ledSegment[a],LOW); } else{ digitalWrite(ledSegment[a],HIGH); } } delay(wait); digitalWrite(ledPosition[b],LOW); } |
Alleen zoek ik nu een manier om numberToShow0 in deze lus te kunnen vervangen door numberToShow1 etc. Zie ik weer iets simpels over het hoofd of kan het misschien helemaal niet? Met behulp van Google kom ik er niet uit. Wie heeft het verlossende antwoord voor me?
We do what we must because we can.
numberToShow[] = {numberToShow0, numberToShow1, numberToShow2, etc, etc}
En dan loop om de huidige loop heen die numberToShow[] verhoogt.
edit/
Extra loop is niet nodig als je aantal hetzelfde is al ledPosition, dan kan je gewoon b gebruiken, maar weet niet helemaal hoe en wat je wilt bereiken, dus dat laat ik even aan jou.
uiteraard niet getest, maar zoiets moet denk ik werken, wellicht moet je het even wat aanpassen want weet niet helemaal of dit de bedoeling is, maar gaat om het principe, dus numberToShow in array stoppen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| byte numberToShow[] = {numberToShow0, numberToShow1, numberToShow2} void displaynumber(byte numberToShow[]) { for(b=0;b<4;b++){ digitalWrite(ledPosition[b],HIGH); for(int a=0;a<8;a++){ if(bitRead(numberToShow[b],a)==1){ digitalWrite(ledSegment[a],LOW); } else{ digitalWrite(ledSegment[a],HIGH); } } delay(wait); digitalWrite(ledPosition[b],LOW); } |
[ Voor 63% gewijzigd door mad_max234 op 26-12-2013 15:41 ]
Dit is het geworden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| void displaynumber() { numberToShow[0]=numberTable[minuut]; numberToShow[1]=numberTable[secondeL]; numberToShow[2]=numberTable[secondeR]; numberToShow[3]=numberTable[tiende]; for(int b=0;b<4;b++){ digitalWrite(ledPosition[b],HIGH); for(int a=0;a<8;a++){ if(bitRead(numberToShow[b],a)==1){ digitalWrite(ledSegment[a],LOW); } else{ digitalWrite(ledSegment[a],HIGH); } } delay(wait); digitalWrite(ledPosition[b],LOW); } } |
Hmm waarom heeft jouw code kleurtjes en de mijne niet?
P.s. mad_max: je onderschrift link (http://www.aquabiotoop.nl/) werkt niet
[ Voor 13% gewijzigd door ResuCigam op 26-12-2013 22:40 ]
We do what we must because we can.
Kan ze beter doorgeven zoals het hoort, scheelt hoop geheugen en is sneller, vanuit register rekenen gaat sneller en hoef niet steeds naar ram geschreven te worden.
1
2
3
| void displaynumber(byte status, byte test) { } |
Je stopt er dan zo variabel in. Naam van varibale die je wilt doorgeven zet je op dezelfde plek als de variable van de functie die de waarde moet ontvangen. var1 gaat nu naar status en var2 gaat naar test.
1
2
3
4
| byte var1 = 5; byte var2 = 3; displaynumber(var1, var2); |
En waarde uit functie krijgen doe je met return
1
2
3
4
5
6
7
| void displaynumber(byte status, byte test) { uitkomst = status + test; return uitkomst } |
Spreek je dan zo aan
1
2
3
4
| byte var1 = 5; byte var2 = 3; byte som = displaynumber(var1, var2); // som zal uitkomst bevatten. |
Edit/
Over die kleurtjes vind je hier.
Overzicht van UBB-codes #tag_code
code=c
[ Voor 16% gewijzigd door mad_max234 op 26-12-2013 22:31 ]
1
2
3
| void displaynumber(byte number1, byte number2, byte number3, byte number4){ // te gebruiken in combinatie met: displaynumber(numberTable[minuut], numberTable[secondeR], numberTable[secondeL], numberTable[tiende]); |
dan:
1
2
3
| void displaynumber(){ // te gebruiken in combinatie met: displaynumber(); |
Mij leek de laatste uitvoering juist eleganter? De rest van de functie blijft gelijk, ik moet nog steeds mijn nieuwe array numberToShow[] vullen om een lus te kunnen gebruiken (mijn oorspronkelijke vraag). In het eerste geval moet ik numberToShow[] vullen met number1 etc. En in het tweede geval gebruik ik daar meteen numberTable[whatever] voor.
[ Voor 31% gewijzigd door ResuCigam op 26-12-2013 23:15 ]
We do what we must because we can.
declare
1
| void displaynumber(byte number1, byte number2, byte number3, byte number4); |
Functie zelf
1
2
3
4
5
| void displaynumber(byte number1, byte number2, byte number3, byte number4) { blablabla, code van de functie. } |
Gebruikt de fucntie dan zo, geeft minuten door aan number1, en geeft secondeR door aan number2, etc. number1 bevat dan dus de waarde minuut.
1
| displaynumber(minuut, secondeR, secondeL, tiende); |
Je mag number1 ook gewoon minuut noemen, geldt ook voor de andere, number2, 3 en 4, compiler ziet dat als twee verschillende stukken code variabel mogen dus hetzelfde genoemd worden. Code in functie is private en afgeschermd van rest van de code simpel uitgelegd.
Als je het niet helemaal begrijpt kan je dit nog even lezen.
http://arduino.cc/en/Reference/FunctionDeclaration
En google is geen schande hoor, als beginner is het juist iets goeds, dat je opzoek gaat naar andere insteken en gaat lezen hoe andere iets oplossen. Later als je wat gevorderd bent kan je zelf dingen gaan bedenken met kennis die je hebt opgedaan.
Edit/
Voor beginnen lijkt het wellicht netter, maar is het niet, is juist slordig programmeren, variabele die bij de functie horen heb jij nu ergens in de code staan, jou functie kan je niet zomaar even naar andere code kopiëren, moet je ook al variabel erbij zoeken. Dan nog compiler die jou code omzet naar veel minder efficiënte machine code.
[ Voor 21% gewijzigd door mad_max234 op 26-12-2013 23:16 ]
We do what we must because we can.
Vooraf declare is niet eens nodig, zolang de functie boven je code staat die hem aanroept, maar dat is even niet van belang, gaat om doorgeven van variabele, of zoals in de link worden genoemd parameters.
En is bij dit soort simpel codes niet erg van belang, maar word het complexer of heb je bepaalde snelheid nodig is je code dan kan van belang zij. Of als je gewoon netjes wilt leren programmeren.
Maar zijn meer wegen die naar Rome leiden,, alleen zijn ze niet allemaal even goed en sommige zelfs af te raden. En wij programmeurs wandelen graag allemaal op dezelfde weg, op die manier snappen we elkaars code beter.
Goede oefening, bestudeer deze code eens, en zet eens bij elk regel wat het doet of wat het is, met //commentaar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| void setup(){ Serial.begin(9600); } void loop() { int i = 2; int j = 3; int k; k = myMultiplyFunction(i, j); // k now contains 6 Serial.println(k); delay(500); } int myMultiplyFunction(int x, int y){ int result; result = x * y; return result; } |
[ Voor 25% gewijzigd door mad_max234 op 26-12-2013 23:27 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| void displaynumbers() { for(int b=0;b<4;b++){ digitalWrite(ledPosition[b],HIGH); for(int a=0;a<8;a++){ if(bitRead(numberToShow[b],a)==1){ digitalWrite(ledSegment[a],LOW); } else{ digitalWrite(ledSegment[a],HIGH); } } delay(wait); digitalWrite(ledPosition[b],LOW); } } |
We do what we must because we can.
Heb hier best wat aan gehad.mad_max234 schreef op donderdag 26 december 2013 @ 14:04:
[...]
String functie(zins versie 19) van arduino is een arduino fucntie, en geen echte c functie. Op achtergrond is string gewoon char array, zoals je dat bij c doet.
Dat gebeurd ook zonder strcat, als je array neemt die te klein is zal deel er niet in komen te staan.
Bij C moet je altijd array ruimte opgeven(of , het hoeft geen 12byte zijn, array mag alleen niet te klein zijn want dan mis je bytes, als arrary 6byte groot is en je probeer er 12byte in te stoppen zal alleen 6 MSB erin staan en de 6 LSB zullen erbuiten vallen, dat merkt de compiler en geeft dus fout.
Even snel voorbeeldje in elkaar gezet hoe ik het altijd doe, code niet getest.
C:
1 voorbeeldcode 1
Edit/
Overigens mag je met string functie van de arduino ook zo doe met string.
C:
1 voorbeeldcode 2
Maar voorbeeld 1 heeft minder resource nodig, geef dus voorkeur aan strcat ipv arduino string functie.
voorbeeld 1
Binaire sketch-grootte: 2.180 bytes (van een 32.256-byte maximum)
Voorbeeld 2
Binaire sketch-grootte: 4.024 bytes (van een 32.256-byte maximum)
doet die memset trouwens het zelfde als:
1
2
3
4
5
6
7
| #define ARRLENGTH 12 char thisIsACharArray[ARRLENGTH]; for(i=0;i<ARRLENGTH;i++){ thisIsACharArray[i] = 0; } |
?
Even voor de beeldvorming. Ik weet dat bovenstaande omslachtig zou zijn.
[ Voor 28% gewijzigd door alexandersamson op 27-12-2013 12:52 ]
Elektronicaprojecten van mij: http://www.gm7.nl
Hier wordt de waarde ingezet waarna je een functie gebruikt die het mbv malloc het juiste aantal geheugen alloceert (en dan daarna de buffer free'd). Dit geeft dan een pointer terug die je gewoon aan de variabele koppelt..
Maar om eerlijk te zijn zijn pointers ook niet de meest simpele dingen voor beginners.
MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000
Raven schreef op woensdag 25 december 2013 @ 15:10:
Zit er een tempsensor op dat ding? Zie dan http://www.hobbyist.co.nz/?q=real_time_clock
Geprobeerd volgens deze site : http://www.pjrc.com/teensy/td_libs_OneWire.htmlkitao schreef op donderdag 26 december 2013 @ 12:18:
Volgende stap wordt dan om te kijken of ik er ergens een temperatuurmeting via DS eruit kan halen.
1
2
| if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); |
Op de ser.mon. krijg ik te zien "No more addresses".
Ik neem aan dat er dan geen adres wordt gevonden en er dus geen DS18B20 opzit ?
Ik zie die sensor ook nergens zitten op de module.
C op PC of zo gebruik je iets anders dan C voor een uC, soms wil je niet dat er extra rekenwerk aan te pas komt omdat je maar erg beperkt resource hebt, dus rekenen je zelf de buffer uit en zet je die vast, scheelt weer ruimte en cpu tijd. Sommige c functies wil je ook liever niet gebruiken bij uC, geloof dat er ook aantal ontbreken voor AVR's.Icekiller2k6 schreef op vrijdag 27 december 2013 @ 13:04:
Imho in C wordt meestal een buffer/temp gebruikt die 512 chars is.
Hier wordt de waarde ingezet waarna je een functie gebruikt die het mbv malloc het juiste aantal geheugen alloceert (en dan daarna de buffer free'd). Dit geeft dan een pointer terug die je gewoon aan de variabele koppelt..
Maar om eerlijk te zijn zijn pointers ook niet de meest simpele dingen voor beginners.
Edit/
Pointers is een van de voordelen van C, dat heeft je veel meer vrijheid.
Nee niet helemaal, uitkomst kan wellicht hetzelfde maar werkt toch heel anders, menset is geheugenpointer, je bewerkt daarmee direct de geheugen cellen, je geeft gewoon op wat er in de geheugen moet komen te staan. De naam zegt het al, memset.alexandersamson schreef op vrijdag 27 december 2013 @ 12:50:
[...]
Heb hier best wat aan gehad.
doet die memset trouwens het zelfde als:
C:
1 2 3 4 5 6 7 #define ARRLENGTH 12 char thisIsACharArray[ARRLENGTH]; for(i=0;i<ARRLENGTH;i++){ thisIsACharArray[i] = 0; }
?
Even voor de beeldvorming. Ik weet dat bovenstaande omslachtig zou zijn.
je kan er dus hetzelfde doen als jij hierboven doet maar ook nog andere dingen, zoals delen vervangen, weghalen, etc. Manipuleert letterlijk de geheugen cellen waar de waarde van de variabele zich in bevind
http://www.tutorialspoint...ary/c_function_memset.htm
Hoop dat het beetje duidelijk is?
edit/2
Heb even testje gedaan met memset vs for loop(zoals jou voorbeeld).
Memset voorbeeld van vorige post
Binaire sketch-grootte: 2.180 bytes (van een 32.256-byte maximum)
Nu met de for loop, is dus net heel klein beetje efficiënter om for loop te gebruiken in dit geval.
Binaire sketch-grootte: 2.178 bytes (van een 32.256-byte maximum)
Snelheid heb ik niet getest, daar kan ook nog verschil in zitten, en dat is voor sommige projecten wellicht nog meer van belang, hangt natuurlijk van het project af.
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
| char stringbuffer[64]; // buffer naar eigen smaak aanpassen, zorg dat de buffer niet kleiner is dan alle gezamelijke strings bij elkaar. char string1[] = "hallo"; char string2[] = " wereld"; void setup() { // start serial port at 9600 bps: Serial.begin(9600); } void loop() { strcat(stringbuffer, string1); //string 1 in de buffer strcat(stringbuffer, string2); //string 2 erbij, nu in de buffer aanwezig: hallo wereld. Serial.println(stringbuffer); // Print: hallo wereld for(byte i=0;i<64;i++){ stringbuffer[i] = 0; } //memset(stringbuffer, 0, sizeof(stringbuffer)); //reset buffer, anders loopt de buffer helemaal vol. delay(1000); } |
Edit/3
Was even vergeten te melden dat ik ook zonder sizeof getest heb in memset functie/
memset(stringbuffer, 0, 64);
Dat maakte geen verschil, compiler optimaliseerde dat al naar vaste waarde, in de machinetaal zit er dus geen verschil tussen wel of geen sizeof in deze situatie.
[ Voor 67% gewijzigd door mad_max234 op 27-12-2013 15:23 ]
1
2
3
4
5
6
7
8
9
10
11
| int pinState; if (myDataOut & (1<<i) ) { pinState=true; } else { pinState=false; } digitalWrite(myDataPin, pinState); |
Dit leek mij te vereenvoudigen naar:
1
| digitalWrite(myDataPin, (myDataOut & (1<<i))); |
Echter gaan hierbij alleen de eerste 8 LED's branden
Unix doesn't prevent a user from doing stupid things, because that would necessarily prevent them from doing brilliant things.
while true ; do echo -n "bla" ; sleep 1 ; done
interessant eigenlijk dat een ogenschijnlijk omslachtigere manier, met 2 byte efficienter ismad_max234 schreef op vrijdag 27 december 2013 @ 14:28:
[...]
Hoop dat het beetje duidelijk is?
edit/2
Heb even testje gedaan met memset vs for loop(zoals jou voorbeeld).
Memset voorbeeld van vorige post
Binaire sketch-grootte: 2.180 bytes (van een 32.256-byte maximum)
Nu met de for loop, is dus net heel klein beetje efficiënter om for loop te gebruiken in dit geval.
Binaire sketch-grootte: 2.178 bytes (van een 32.256-byte maximum)
Snelheid heb ik niet getest, daar kan ook nog verschil in zitten, en dat is voor sommige projecten wellicht nog meer van belang, hangt natuurlijk van het project af.
C:
1 stuk code
Edit/3
Was even vergeten te melden dat ik ook zonder sizeof getest heb in memset functie/
memset(stringbuffer, 0, 64);
Dat maakte geen verschil, compiler optimaliseerde dat al naar vaste waarde, in de machinetaal zit er dus geen verschil tussen wel of geen sizeof in deze situatie.
Elektronicaprojecten van mij: http://www.gm7.nl
Volgens mij een hele zooimad_max234 schreef op vrijdag 27 december 2013 @ 14:28:
[...]
C op PC of zo gebruik je iets anders dan C voor een uC, soms wil je niet dat er extra rekenwerk aan te pas komt omdat je maar erg beperkt resource hebt, dus rekenen je zelf de buffer uit en zet je die vast, scheelt weer ruimte en cpu tijd. Sommige c functies wil je ook liever niet gebruiken bij uC, geloof dat er ook aantal ontbreken voor AVR's.
Ik werk dan ook altijd in avr studio en/of eclipse in C als ik iets ontwerp in kleine serie, arduino is dan echt veel te zwaar, moet gewoon twee keer zo dure avr kopen als je arduino erbij gaat halen om code erin kwijt te kunnen. En dan heb ik het nog niet over snelheidsverlies, dat is niet te compenseren door duurder mega te kopen, 20Mhz is max ook voor de grotere mega's.
Maar vind arduino wel leuk om wat mee te spelen, bekende chips kan je gewoon veel snller aan de praat krijgen en daarna je eigen code ervan maken, meestal moet libs wel aanpassen voordat ze doen wat je wilt maar je het een werkende basis.
Kan ook prima vanuit datasheet een lib schrijven maar kost altijd paar avonden en soms meer als het wat tegen zit en je fouten niet snel ontdekt. Je kent het vast wel, van die fouten waar je uren naar opzoek bent van de standaard foutjes die overduidelijk recht voor je neus staan, foute register aanspreken, verkeerd pin hoog, etc, soms zie je ze gewoon niet, nachtje slapen doet vaak wonderen. Dan is werkend voorbeeld wel zo fijn, kan je gelijk aan de slag.
Edit/
Wat ik ook wel eens vergeet of te lui bent om over na te denken is dat arduino op -Os staat, dus op grote word geoptimaliseerd. De code die je in C of arduino schrijft zal ook niet de code zijn die in de uC zal komen te staan. De compiler maakt daar afhankelijk van de instellingen een code van, soms kan heel stuk code helemaal weg geoptimaliseerd worden puur omdat het eigenlijk niks doet. Zoals sizeof in mijn voorbeeld, had het verder niet getest en had over het hoofd gezien dat alle array's een constante grote hadden, en sizeof dus totaal overbodig was want vooraf waren alle waardes al bekend en zou nooit veranderen, dan zal de compiler daar dus ook geen geheugen voor vrijmaken en alles zo klein mogelijk maken.
Let dus op dat functie wel eens anders kan uitpakken als je met variabele wekt die wel veranderen.
[ Voor 23% gewijzigd door mad_max234 op 27-12-2013 21:45 ]
Er zíjn mensen die het leuk vinden om een lib te schrijven, zodat mensen die dat niet leuk vinden tóch lekker met hun AVR kunnen hobbyen. Zo zijn er ook mensen die het leuk vinden om uit te zoeken hoe je het onderste uit een WiFi router kunt halen - ik zeg: prima! Dit electro interessegebied is zo enorm uitgebreid, er is altijd wel wat voor iemand.mad_max234 schreef op vrijdag 27 december 2013 @ 21:03:
Kan ook prima vanuit datasheet een lib schrijven maar kost altijd paar avonden en soms meer als het wat tegen zit en je fouten niet snel ontdekt. Je kent het vast wel, van die fouten waar je uren naar opzoek bent van de standaard foutjes die overduidelijk recht voor je neus staan, foute register aanspreken, verkeerd pin hoog, etc, soms zie je ze gewoon niet, nachtje slapen doet vaak wonderen. Dan is werkend voorbeeld wel zo fijn, kan je gelijk aan de slag.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Verwijderd
en ik een tmp36Verwijderd schreef op zaterdag 28 december 2013 @ 11:12:
spraak besturingbordje binnen..

kan weer stapje verder op naar hfdst 2
http://tronixstuff.com/20...with-arduino-chapter-two/
schiet al op, nog maar 55 te gaan
Verwijderd
wil je wat nauwkeuriger meten > http://playground.arduino.cc/Main/LM35HigherResolution
en verder nog wat info:
http://pscmpf.blogspot.nl/2008/12/arduino-lm35-sensor.html
http://www.instructables....-TEMPERATURE-SENSOR-LM35/
voor een buitentemp meter heb ik dit kant en klare kabeltje gekocht, lui als ik ben

waar ze ook een leuk programmertje verkopen .. tip zelf al een aantal maal daar iets gekocht.. prima shop
[ Voor 42% gewijzigd door Verwijderd op 28-12-2013 12:04 ]
Heb even filmpje gemaakt met dat ik 4 timers instel met zo'n keypadje
http://www.youtube.com/watch?v=nWh25nONraI
Elektronicaprojecten van mij: http://www.gm7.nl
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
heb wel alvast een ethernet shield besteld en een gratis dev account aangemaakt

[ Voor 16% gewijzigd door Verwijderd op 28-12-2013 13:15 ]
Elektronicaprojecten van mij: http://www.gm7.nl
Verwijderd
ik ga als proefje (wanneer ik tijd heb

[ Voor 46% gewijzigd door Verwijderd op 28-12-2013 16:16 ]
Bedankt voor de links weer, ik zal die tzt eens bekijken. Voorlopig ben ik even bezig met mijn 'eigen'site aan het uit te vogelen. Ik snap dat verhaal van hem namelijk niet zo goed, zie :Verwijderd schreef op zaterdag 28 december 2013 @ 11:54:
TMP36, die doen het best goed.
wil je wat nauwkeuriger meten...........
http://tronixstuff.com/20...with-arduino-chapter-two/
Kijk ik echter op de datasheet rechtsonder dan zie ik wat anders. Om het makkelijk te maken heb ik vergrootbare plaatjes :Looking again at page eight of the data sheet, it describes the output characteristics of the sensor. With our TMP36, the output voltages increases 10 millivolts for every degree Celsius increase; and that the output voltage for 25 degrees Celsius is 750 mV; and that there is an offset voltage of 400 mV.

Hier staat toch duidelijk offset= 0.5V = 500mV
Aan de andere kant is het wel zo dat bij -40'C tot 0'C en 10mV/'C daar een verschil in zit van 400mV.
Dus wat hij schrijft is deels (in)correct, niet volledig, of ik zie iets over het hoofd.
Met deze grafiek 6 erbij zou de spanning op -40'C 100mV moeten zijn en op 0'C 500mV.

Helaas heb ik vandaag geen andere thermometer om te vergelijken maar ik begin wel enigzins te twijfelen aan zijn programma.
Verwijderd
ben ook erg nieuwsgierig hoe jij -40 denkt te gaan meten
[ Voor 29% gewijzigd door Verwijderd op 28-12-2013 14:47 ]
Jij had allang een hamer gepakt om er 'uit' te komen niet ?Verwijderd schreef op zaterdag 28 december 2013 @ 14:44:
ja het zal wel weer aan dat boek of die site liggen.. ik ken je onderhand wel
ben ook erg nieuwsgierig hoe jij -40 denkt te gaan meten
Verwijderd
bouw dat simpele schakelingetje nou eerst is op.. verdiep je in de code en kijk(evt) naar die linkjes om de nauwkeurigheid nog wat te verhogen (heb ik vorige week ook gedaan)
[ Voor 7% gewijzigd door Verwijderd op 28-12-2013 15:03 ]
En natuurlijk wou ik afgegeven spanning meten bij kamertemp en niet bij -40. Moet je wel weten hoe warm het in de kamer is.
Overigens is die meneer echt niet foutloos hoor.
En die Xavi ziet het ook niet goed want volgens grafiek 6 is het geen 0mV bij -40Xavi says:
October 11, 2012 at 2:55 am
Hi,
I tested your sketch but I think you make a little mistake. TMP36 goes from -40 degrees C (0mv) to +125 degrees C in steps of 10mV per degree. This means that 0 degrees is equal of 400mV. The offset voltage may be -400 to set the correct temperature.
Is it right?
Reply
John Boxall says:
October 11, 2012 at 3:05 am
Wow – thanks for seeing that. You’re right, and I’ve updated the article.
Thank you
[ Voor 5% gewijzigd door kitao op 28-12-2013 15:07 ]
Verwijderd
er is wel een klein verschilletje tussen de TMP35 en de TMP36
maar als die 18.45 graden aangeeft, weet ik ook niet of het 18.63 in werkelijkheid op dat moment is.. voor een kamertemperatuurmeter boeien.. in een produktie proces uitkijken
[ Voor 11% gewijzigd door Verwijderd op 28-12-2013 15:17 ]
Datasheet zegt : offset 500mV
Aussie zegt : offset 400mV
dan hebben we het niet over een verschil van 0.18 graad maar over 10 graden verschil.