|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Hogy melyik címen levő utasítás hajtódik végre.
Túlcsordul: eléred a chip végét és a 0. címről folytatódik.
Értem, tehát ez nem befolyásolja végülis a program futását, ugye?
Sziasztok!
Arduino Uno-ra írtam programot, 6 Lithium cella feszültségét mérem, amíg merítem őket, percenként, és ezt soros porton elküldöm a gépnek. Sajnos még nem érkezett meg a Board, addig csak a programmal (1.0.5-r2) tudtam ellenőriztetni, nem írt hibát.
/* Analoginput EXT1
60 nap alatt arduino tanfolyam alapján
/* módosítva kovidivi által */
/* 2014.07.20 */
// analóg bemenetek beállítása
int sensorPin0 = A0;
int sensorPin1 = A1;
int sensorPin2 = A2;
int sensorPin3 = A3;
int sensorPin4 = A4;
int sensorPin5 = A5;
//beolvasott érték tárolása
int sensorValue;
//átszámított feszültség
double eredmeny;
void setup()
{
//Hogy a PC-n olvashassuk az eredmenyt
Serial.begin(9600);
Serial.println("Start.");
Serial.println("Idő, 1. 2. 3. 4. 5. 6."); //Idő, és a cellák sorszámának elküldése
}
void loop() {
analogReference (EXTERNAL ); //TL431 2.5V -> 2,4414mV lépésköz
//A cellák 10k-10k feszültség osztóval vannak az analóg
// bemenetre kötve, 4,2V->2,1V, 3,0V->1,5V
// értékek: 860 614
//beolvassuk az analog erteket
unsigned long time;
time = millis();
Serial.print(time); //kezdeti idő elküldése
Serial.print(" "); //tabulátor
sensorValue = analogRead(sensorPin0);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print(" ");
sensorValue = analogRead(sensorPin1);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print(" ");
sensorValue = analogRead(sensorPin2);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print(" ");
sensorValue = analogRead(sensorPin3);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print(" ");
sensorValue = analogRead(sensorPin4);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print(" ");
sensorValue = analogRead(sensorPin5);
eredmeny = (sensorValue * 5)/1023;
Serial.println(eredmeny);
// kb. 1 perc várakozás
for (long i = 0; i == 60; i++) {
delay(1000); }
}
Láttok benne esetleg valami hibát? A Soros-Monitorból át tudom majd másolni az adatokat Excelbe?
Még szeretnék rakni bele egy sípolót, ami jelez, ha valamelyik cella feszültsége túl alacsony.
Köszönöm A hozzászólás módosítva: Júl 20, 2014
Szia!
A kód jónak tűnik. A "for (long i = 0; i == 60; i++) {delay(1000); }" szerintem felesleges. A delay, ha jól tudom 2^16-1-ig paraméterezhető, szóval a 60000 még belefér.
Egyszerűbb dolgod lenne a Leonardo-val. Ott ugyanis lehetőség van billentyűzet emulálására, így akár közvetlenül az Excel táblázatba kerülhetnének a mért adatok. A hozzászólás módosítva: Júl 20, 2014
Ha Hyperterminált használsz, közvetlenül szöveges állományba lementhető a bejövő adatsor, amit egyszerű EXCEL-be importálni. Processing-ben pedig akár olyan programot is összeüthetsz, ami az adatok lementése mellett grafikusan is mutatja az eredményeket.
Üdvözletem!
Van egy BMP180 szenzorom amivel a légköri nyomást lehet mérni. Letöltöttem hozzá a libet és látszólag működik is. A gondom annyi hogy meg kell adni a pontos magasságot ahhoz hogy közel jól mérjen. Ezt szeretném valahogy elkerülni. Én csak a nyomás pontos értékét szeretném lekérdezni. Van valakinek ötlete?
Próbáltan beállítani úgy hogy egy okostelóról lekértem a magassági adatot és ezt adtam meg a kódban. Ezután kerestem egy meterológiai állomást a neten. A két adatot összehasonlítva volt eltérés nem is kevés. Én mértem 1024-et, a neten pedig 1015 volt.
Magasságtól függetlenül tényleg csak a nyers nyomás értéket szeretném kiszedni.
A segítséget előre is köszönöm.
Idézet: „Magasságtól függetlenül tényleg csak a nyers nyomás értéket szeretném kiszedni.”
A bmp.readPressure(); pont ezt teszi, nemde?
(Az Adafruit_BMP085 könyvtárat használom)
A két érték között csak 9mbar van, ami nem is olyan rossz. Ha építesz két rendszert, egymás mellé téve azok sem fognak egyformát mérni.
Akkor ennyi hibatűrés lehet a pontosságában?
Még nem, kerestem rá hogy milyen időnél mekkora nyomás szokott lenne. Lehet hogy ez az eltérés akkor nem is sok? Ha jól számolom ez belefér egy +/- 1%-os hibatűrésbe.
Én másik libet használok.
Erről az oldalról szedtem le. MBP180 lib
És itt is a következő példakódot tettem fel.
/* SFE_BMP180 library example sketch
This sketch shows how to use the SFE_BMP180 library to read the
Bosch BMP180 barometric pressure sensor.
https://www.sparkfun.com/products/11824
Like most pressure sensors, the BMP180 measures absolute pressure.
This is the actual ambient pressure seen by the device, which will
vary with both altitude and weather.
Before taking a pressure reading you must take a temparture reading.
This is done with startTemperature() and getTemperature().
The result is in degrees C.
Once you have a temperature reading, you can take a pressure reading.
This is done with startPressure() and getPressure().
The result is in millibar (mb) aka hectopascals (hPa).
If you'll be monitoring weather patterns, you will probably want to
remove the effects of altitude. This will produce readings that can
be compared to the published pressure readings from other locations.
To do this, use the sealevel() function. You will need to provide
the known altitude at which the pressure was measured.
If you want to measure altitude, you will need to know the pressure
at a baseline altitude. This can be average sealevel pressure, or
a previous pressure reading at your altitude, in which case
subsequent altitude readings will be + or - the initial baseline.
This is done with the altitude() function.
Hardware connections:
- (GND) to GND
+ (VDD) to 3.3V
(WARNING: do not connect + to 5V or the sensor will be damaged!)
You will also need to connect the I2C pins (SCL and SDA) to your
Arduino. The pins are different on different Arduinos:
Any Arduino pins labeled: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, Due: 20 21
Leonardo: 2 3
Leave the IO (VDDIO) pin unconnected. This pin is for connecting
the BMP180 to systems with lower logic levels such as 1.8V
Have fun! -Your friends at SparkFun.
The SFE_BMP180 library uses floating-point equations developed by the
Weather Station Data Logger project: http://wmrx00.sourceforge.net/
Our example code uses the "beerware" license. You can do anything
you like with this code. No really, anything. If you find it useful,
buy me a beer someday.
V10 Mike Grusin, SparkFun Electronics 10/24/2013
*/
// Your sketch must #include this library, and the Wire library.
// (Wire is a standard library included with Arduino.):
#include <Wire.h>
// You will need to create an SFE_BMP180 object, here called "pressure":
#define ALTITUDE 1655.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters
void setup()
{
Serial.begin(9600);
Serial.println("REBOOT");
// Initialize the sensor (it is important to get calibration values stored on the device).
if (pressure.begin())
Serial. println("BMP180 init success");
else
{
// Oops, something went wrong, this is usually a connection problem,
// see the comments at the top of this sketch for the proper connections.
Serial. println("BMP180 init fail\n\n");
while(1); // Pause forever.
}
}
void loop()
{
char status;
double T,P,p0,a;
// Loop here getting pressure readings every 10 seconds.
// If you want sea-level-compensated pressure, as used in weather reports,
// you will need to know the altitude at which your measurements are taken.
// We're using a constant called ALTITUDE in this sketch:
Serial.println();
Serial.print("provided altitude: ");
Serial.print(ALTITUDE,0);
Serial.print(" meters, ");
Serial.print(ALTITUDE*3.28084,0);
Serial.println(" feet");
// If you want to measure altitude, and not pressure, you will instead need
// to provide a known baseline pressure. This is shown at the end of the sketch.
// You must first get a temperature measurement to perform a pressure reading.
// Start a temperature measurement:
// If request is successful, the number of ms to wait is returned.
// If request is unsuccessful, 0 is returned.
status = pressure.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.
// Function returns 1 if successful, 0 if failure.
status = pressure.getTemperature(T);
if (status != 0)
{
// Print out the measurement:
Serial.print("temperature: ");
Serial.print(T,2);
Serial.print(" deg C, ");
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(" deg F");
// Start a pressure measurement:
// The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
// If request is successful, the number of ms to wait is returned.
// If request is unsuccessful, 0 is returned.
status = pressure.startPressure(3);
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed pressure measurement:
// Note that the measurement is stored in the variable P.
// Note also that the function requires the previous temperature measurement (T).
// (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
// Function returns 1 if successful, 0 if failure.
status = pressure.getPressure(P,T);
if (status != 0)
{
// Print out the measurement:
Serial.print("absolute pressure: ");
Serial.print(P,2);
Serial.print(" mb, ");
Serial.print(P*0.0295333727,2);
Serial.println(" inHg");
// The pressure sensor returns abolute pressure, which varies with altitude.
// To remove the effects of altitude, use the sealevel function and your current altitude.
// This number is commonly used in weather reports.
// Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
// Result: p0 = sea-level compensated pressure in mb
p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
Serial.print("relative (sea-level) pressure: ");
Serial.print(p0,2);
Serial.print(" mb, ");
Serial.print(p0*0.0295333727,2);
Serial.println(" inHg");
// On the other hand, if you want to determine your altitude from the pressure reading,
// use the altitude function along with a baseline pressure (sea-level or other).
// Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
// Result: a = altitude in m.
a = pressure.altitude(P,p0);
Serial.print("computed altitude: ");
Serial.print(a,0);
Serial.print(" meters, ");
Serial.print(a*3.28084,0);
Serial.println(" feet");
}
else Serial.println("error retrieving pressure measurement\n");
}
else Serial.println("error starting pressure measurement\n");
}
else Serial.println("error retrieving temperature measurement\n");
}
else Serial.println("error starting temperature measurement\n");
delay(5000); // Pause for 5 seconds.
}
Az adatok egy szerverre kerülnek fel. Lessz egy DHT22 szenzor is mellette. Így már a hőmérséklet páratartalom és a légnyomás adatok is felkerülnek.
SQL-ből meg már tudok grafikonokat rajzolni ami csak kell.
A különbség nagyjából az, hogy az általad használt könyvtárban van egy sealevel() metódus is, annak a használatához kell a magasság. Ha nem hívod meg, akkor nincs szükség a magasság ismeretére. Nálad a pressure.getPressure(P,T); adja meg a nyomás abszolút értékét.
Megkerestem az adatlapot.
Itt a következők vannak: BMP180 adatlap
+/- 0.12 hPa
+/- 1.0 m
Ha jól gondolom az 1% jóval több mint a megengedett.
Az járható út hogy egy fix értéket mindig elveszek belőle? Vagy beteszek egy szorzót korrekciónak?
A 0.12 hPa az egyenlő 0.12 mbar-ral, ami igen jó pontosság.
Az igaz. Nálam 9mbar az eltérés. Tehát lényegesen több a megengedettnél.
Ha tudom megnézem hogy melyik fgv írja ki az értéket. Gyanús hogy a pressure.altitude(P,p0); meg csak 1003 volt. Ezt lehet csak éjszaka tudom ellenőrizni.
Sziasztok, olyan kérdéssel fordulnék hozzátok, hogy egy 328-al szerelt Nano panelt szeretnék SD kártya modulra kötni.
Az Ardunio CardInfo mintályát szeretném használni. Feltöltöttem a programot, de mindíg sikertelen az inicializálás.
Bekötésem;
Arduino SD module
D4 CS
D11 MOSI
D12 MISO
D13 SCK
Tápot is kötöttem. Az arduino-ról szedtem le az 5V-ot és a GND-t is.
A kártyát leformáztam, a gépem tökéletesen látja.
FAT-ra formaztad?Nalam mar az autos virtualis CD-tar csinalt olyant,hogy FAT-ra volt formazva es FAT32 kellet
FAT-ra volt formázva, most átformáztam FAT32-ra, de így sem jó
Mekkora az SD kártya? Próbálkozz 2Gb-nál kisebbel, ha most nagyobbat használsz.
Erre is gondoltam, itthon a legkissebb amit találtam az 128Mb-volt, most azt használom. A hozzászólás módosítva: Júl 22, 2014
(#) |
silent15 válasza (Felhasználó 15355) hozzászólására (») |
Júl 23, 2014 |
|
/ |
|
|
Kicseréltem, de így sem jó :S
Az SD kártya 3.3V-os, azt I/O részek is!
Direkt bekötve az 5V-ra nem működnek!
A Chipselect kiválasztás a gyári mintában _hibás_.
A chipselect és az Output definíció _is_ kell!. Persze mind a CS lábra mutasson. Az output az a 10-es lábra (SS) hivatkozik eredetileg!
SZia, ezeket a deffiníciókat hogy írjam bele? Másik kérdésem, amit linkeltem panelt, azon van 3,3V os stab. Ki is mértem, a 3,3V megvan, hogy érted, hogy direktbe kötve nem működik?
Itt van kicsit átgondolva engedelmeddel, a sípolás is beletettem, a tabulátorokat cseréltem igazi tabulátorra, illetve a delayes várást átírtam.
Viszont kérlek ellenőrizd le, kicsit korán írtam meg, és nem tudtam unon leellenőrizni.
/* Analoginput EXT1
60 nap alatt arduino tanfolyam alapján
/* módosítva kovidivi által */
/* 2014.07.20 */
// analóg bemenetek beállítása
int sensorPin0 = A0;
int sensorPin1 = A1;
int sensorPin2 = A2;
int sensorPin3 = A3;
int sensorPin4 = A4;
int sensorPin5 = A5;
int SPKR= 3; //PWM lábnak kell lennie!
//beolvasott érték tárolása
int sensorValue;
//átszámított feszültség
double eredmeny;
long interval = 60000; //ms ben megadott idő, mivel itt számolja az időt így "nincsen" korlátja
void setup()
{
//Hogy a PC-n olvashassuk az eredmenyt
Serial.begin(9600);
Serial.println("Start.");
Serial.println("Idő,/t1./t2./t3./t4./t5./t6."); //Idő, és a cellák sorszámának elküldése /t tabaltúra.
pinMode(SPKR, OUTPUT);
}
void beep(double be){ //sípolás
if (be< 2.5)
{
digitalWrite(SPKR, HIGH); //turn the speaker on
delay(500); //wait for half a second
digitalWrite(SPKR, LOW); //turn the speaker off
delay(500);
}
}
void loop() {
analogReference (EXTERNAL ); //TL431 2.5V -> 2,4414mV lépésköz
//A cellák 10k-10k feszültség osztóval vannak az analóg
// bemenetre kötve, 4,2V->2,1V, 3,0V->1,5V
// értékek: 860 614
//beolvassuk az analog erteket
unsigned long currentMillis = millis(); //időszámlálónak, külön tettem hogy ne nullázza a mért időt
unsigned long time=0, previousMillis=0;
time = millis();
Serial.print(time); //kezdeti idő elküldése
Serial.print("/t"); //tabulátor
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
sensorValue = analogRead(sensorPin0);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print("/t");
beep(eredmeny);
sensorValue = analogRead(sensorPin1);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print("/t");
beep(eredmeny);
sensorValue = analogRead(sensorPin2);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print("/t");
beep(eredmeny);
sensorValue = analogRead(sensorPin3);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print("/t");
beep(eredmeny);
sensorValue = analogRead(sensorPin4);
eredmeny = (sensorValue * 5)/1023;
Serial.print(eredmeny);
Serial.print("/t");
beep(eredmeny);
sensorValue = analogRead(sensorPin5);
eredmeny = (sensorValue * 5)/1023;
Serial.println(eredmeny);
beep(eredmeny);
// kb. 1 perc várakozás
}
}
A hozzászólás módosítva: Júl 24, 2014
Idézet: „hogy érted, hogy direktbe kötve nem működik?” Úgy, hogy a digitális I/O jelszintek sem stimmelnek: az Arduino 5 V körüli kimenőjele esetleg megárthat az SD kártyának, vagy fordítva: az SD kártya 3,3 V körüli kimenőjele túl alacsony ahhoz, hogy az Arduino magas szintnek érzékelje.
A képen látható kártyán például minden adatvonalnál egy-egy szintillesztő található, ami megoldja ezt a problámát.
(#) |
icserny válasza (Felhasználó 15355) hozzászólására (») |
Júl 24, 2014 |
|
/ |
|
|
Idézet: „Nincs rajta ellenállásosztó?” Miért is volna?
(#) |
silent15 válasza (Felhasználó 15355) hozzászólására (») |
Júl 24, 2014 |
|
/ |
|
|
Ahogy nézem nincs rajta ellenállásosztó ,azok csak felhúzó ellenállások.
Kép
Esetleg, megpróbálnám a szintillesztést, mivel lehetne a legegyszerűbben megoldani? A hozzászólás módosítva: Júl 24, 2014
Sziasztok!
Arduino + MCP 41010 digitális potméterrel akadtam el.
Tesztelném SPI-n, de akármekkora értéket küldök neki, mindig csak középértéken marad a kimenete az MCP41010-nek (512).
Mellékelem a bekötést, adatlapot, kódot. Nem tudom mi a hiba.
Bekötésben annyi a különbség, hogy led helyett A0-ra van bekötve a PW0, hogy lássam milyen értéket kapok.
MCP adatlap
#include <SPI.h>
int csPin = 10;
int sensorPin = A0;
int sensorValue = 0;
void setup()
{
SPI.begin();
Serial.begin(9600);
pinMode(csPin, OUTPUT);
}
void loop()
{
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
SPI.transfer(0);
SPI.transfer(100); //bármilyen értéket adok meg, 512 marad.
delay(100);
}
Az SPI.transfer() előtt és után neked kell beállítani csPin értékét (gondolom, előtte lehúzni, utána felhúzni). Így most az eszköz nem érzi magát megszólítva, ezért nem reagál.
Szia, próbáltam úgy is, de ugyanúgy középértéken marad a kimenet.
void loop()
{
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
digitalWrite(csPin, LOW);
SPI.transfer(0);
SPI.transfer(200); //bármilyen értéket adok meg, 512 marad.
digitalWrite(csPin, HIGH);
delay(100);
}
|
|