Fórum témák
- • Autóriasztó és központi zár
- • Boombox javítás
- • CNC építése házi alkatrészekből az alapoktól
- • Li-Ion saját akkucsomag készítése
- • Elektromos távirányítós kapunyitó
- • Erősítő mindig és mindig
- • Analóg oszcilloszkóp javítása
- • LED szalag
- • Hangszórójavítás (otthon)
- • Számítógép hiba, de mi a probléma?
- • Mosógép vezérlők és általános problémáik
- • Sprint-Layout NYÁK-tervező
- • Érdekességek
- • Kaputelefon
- • Transzformátor készítés, méretezés
- • Villanypásztor
- • Kondenzátor
- • Arduino
- • Videomagnó problémák
- • IMI villanymotor
- • Digitális adatátvitel
- • Mosogatógép hiba
- • Nagyfeszültségű tápegység
- • 3-fázisú Modbus-os teljesítményszabályzó (SCR power controller)
- • Rádióamatőrök topikja
- • Elfogadnám, ha ingyen elvihető
- • Villanyszerelés
- • TDA7294 végerősítő
- • Klíma szervizelés, javítás
- • Klíma beszerelése, fűtés-hűtés házilag
- • Kombikazán működési hiba
- • Általános antennás kérdések, válaszok
- • Dobozolási technikák, műszerdobozok
- • Elektronikai témájú könyvek újságok
- • Elektromos vezérlésű pneumatika
- • Internetes rádióvevő
- • Alternativ HE találkozó(k)
- • 3D nyomtatás
- • Felajánlás, azaz ingyen elvihető
- • Akkumulátor töltő
- • Háromfázisú aggregátor
- • Szintetizátor javítás
- • Sütő javítás
- • Laptop javítás, tuning
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Villanymotor
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • TV hiba, mi a megoldás?
- • Szünetmentes táp javítása, élesztése
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Függvénygenerátor építése
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Az a gond, hogy nem tudjuk, honnan kapod a 2 bytes karakter kódot?
Mert ezt esetleg meg lehetne változtatni, hogy 1 byteos kódot használjon a rendszered.
Mivel a legtöbb helyen a használt karakter kód megválasztható.
Ezért javasoltam fentebb a YAT terminált. Ez Windowsban betud neked állítani UTFT-8 készletett.
Vagy ami nálam alapbeállítás valami „Közép Európai Win(1250)” ez is csak 1Byteos ékezetes karaktereket használ, és azokat már tudnád használni akár az LCD-hez is.
Vagy ez szintén csak 1 Bytes kód tábla: ASCII table according to Windows-1252
Bővebben: Link
Használd ezt. A hozzászólás módosítva: Jan 15, 2019
Szerintem az általad használt "szövegszerkesztő" használ unicode kódolást.
Javaslom tölts le egy notepad++ programot (vagy valami hasonlót), nyisd meg azzal a forrás file-t, és a format menüben próbáld meg utf-ről ansi kódolásra alakítani. (Gondolom windows-t használsz.)
Esetleg egy ötlet. Én megpróbálnám azt, hogy akkor fogadjon a függvény int-et, aztán a függvényen belül meg szétszeded két részre.
char fgv(int myInput)
{
char highChar, lowChar;
highChar = myInput & 0bff00;
lowChar = myInput & 0b00ff;
return lowChar;
}
Arról kellene meggyőződnöd, hogy konkrétan hol jelentkezik az anomália. Valamilyen átalakításnál lesz az. A hozzászólás módosítva: Jan 15, 2019
Lehet el tudtam indulni. Pl.: char []="szoveg" az 6 byte-on lesz tárolva (az strlen szerint). Viszont a char []="szöveg" 7byte-on. Az ö betű plusz egy byte-ot foglal, és ha használom a char [2]=="ö" feltételt, nem lesz igaz. Ha " helyett '-t használok akkor se igaz. A char [1] a z, char [2] és char [3] tárolja az ö betűt. Ha átkasztolom unsigned char-ba, akkor 195 és 182 az értékük. Így már sikerülnie kell!
Azt kell még megnéznem, hogy a pgm_read_byte 1 vagy 2byte-on adja vissza az ékezetes karaktereket. A hozzászólás módosítva: Jan 15, 2019
Valahogy így képzelem el az átrendezést:
// ekezetKezelo.ino
#include <string.h>
#include <ctype.h>
char S[128]= {"Ütve fúró gép"};
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
int hossz = strlen (S);
int iSeged=0;
char Ss[hossz]; // A rendezett String
// Rendezzük a karakter sórt
for(int i=0; i<hossz; i++){
if(S[i]>126){ // Ha nagyobb mint ~ Equivalency sign - tilde
// Kihagyjuk és vesszük a következő Byteot
Ss[iSeged++] = S[++i]; // Akkor ide kellene a kasztolás.
// Vagy behelyettesítés a fent linkelt táblázat megfelelő kódjával
}else{
Ss[iSeged++] = S[i];
}
}
}
A hozzászólás módosítva: Jan 15, 2019
Írtad, hogy az strlen nem adja vissza a Stringet lezáró /0 karaktert?
Akkor változtatni kellene a for cikluson, hogy a /0-is át jöjjön.
for(int i=0; i<hossz+1; i++){
…
}
hossz=strlen(Ss); // Az új string hossza a + végén a lezáró /0
Sziasztok!
Programozásban kérnék egy kis segítséget. adott az alábbi kód:
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <TimeLib.h>
int TMP36Pin = 0; //the analog pin the TMP36's Vout (sense) pin is connected to the resolution is 10 mV/degree centigrade with a 500 mV offset to allow for negative temperatures
// Let's compare an average of 100
const byte averageCount = 100;
// Variables for the Modified Moving Average
double movingAverage = 0;
double movingAverageSum = 0;
// Timer variables
unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
unsigned long printTempInterval = 1000; // print out measured results every 1000 msec
unsigned long printTimeInterval = 1000; // print out measured results every 1000 msec
const int chip = 10;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) ; // wait for serial port to connect. Needed for native USB port only
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chip)) {
Serial.println("Card failed, or not present");
// don't do anything more:
while (1);
}
Serial.println("card initialized.");
// Pre-load MMA
for (int x=0; x < averageCount; x++)
movingAverageSum = movingAverageSum + analogRead (TMP36Pin );
//Serial.print(movingAverageSum);
//Serial.println(" movingAverageSum ");
// Calculate inital average
movingAverage = movingAverageSum / averageCount;
//Serial.print(movingAverage);
//Serial.println(" movingAverage ");
}
void loop() {
tmElements_t tm;
// make a string for assembling the data to log:
String dataTemp = "";
String dataYear = "";
String dataMonth = "";
String dataDay = "";
String dataHour = "";
String dataMinute= "";
String dataSecond = "";
//getting the voltage reading the temperature sensor and append to the string:
//Modified Moving Avarege method used to smooth sensor data
// each interation of loop, update moving average
// Get a new sample
// unsigned int currentValue = analogRead(analogPin);
// Remove previous movingAverage the sum
movingAverageSum = movingAverageSum - movingAverage;
// Replace it with the current sample
movingAverageSum = movingAverageSum + TMP36_Read;
// Recalculate movingAverage
movingAverage = movingAverageSum / averageCount;
//Serial.print(movingAverage);
//Serial.println(" calculated movingAverage ");
// analogRead values go 0 to 1023, analogWrite values 0 to 255
float voltage = ((movingAverage *5000) / 1024); // Gets you mV
//Serial.print(voltage);
//Serial.println(" voltage ");
// calculate the temperature
float temperatureC = (voltage - 500) / 10 ; //ing 10 mv per degree wit 500 mV offset to degrees ((voltage - 500mV) / 10)
// print out the time
if (RTC.read(tm)) {
/*Serial.print(tmYearToCalendar(tm.Year));
Serial.write('-');
Serial.print(tm.Month);
Serial.write('-');
Serial.print(tm.Day);
Serial.write(',');
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.println();*/
} else {
if (RTC.chipPresent()) {
Serial. println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
} else {
Serial. println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
}
//append to the string:
dataTemp = String(temperatureC,1);
dataYear = String(tmYearToCalendar(tm.Year));
dataMonth = String((tm.Month));
dataDay = String((tm.Day));
dataHour = String((tm.Hour));
dataMinute = String((tm.Minute));
dataSecond = String((tm.Second));
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
currentMillis = millis();
if (currentMillis-previousMillis >= printTimeInterval){
// reset the debouncing timer
previousMillis = millis();
// if the file is available, write to it:
if (dataFile){
dataFile.print(dataYear);
dataFile.print("-");
dataFile.print(dataMonth);
dataFile.print("-");
dataFile.print(dataDay);
dataFile.print("-");
dataFile.print(dataHour);
dataFile.print(":");
dataFile.print(dataMinute);
dataFile.print(":");
dataFile.print(dataSecond);
dataFile.print(",");
dataFile.print(dataTemp);
dataFile.close();
// print to the serial port too:
Serial.print(dataYear);
Serial.print("-");
Serial.print(dataMonth);
Serial.print("-");
Serial.print(dataDay);
Serial.print(",");
Serial.print(dataHour);
Serial.print(":");
Serial.print(dataMinute);
Serial.print(":");
Serial.print(dataSecond);
Serial.print(",");
Serial.println(dataTemp);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}
}
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
A kódnak ezzel a részével van gondom:
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
currentMillis = millis();
if (currentMillis-previousMillis >= printTimeInterval){
// reset the debouncing timer
previousMillis = millis();
// if the file is available, write to it:
if (dataFile){
dataFile.print(dataYear);
dataFile.print("-");
dataFile.print(dataMonth);
dataFile.print("-");
dataFile.print(dataDay);
dataFile.print("-");
dataFile.print(dataHour);
dataFile.print(":");
dataFile.print(dataMinute);
dataFile.print(":");
dataFile.print(dataSecond);
dataFile.print(",");
dataFile.print(dataTemp);
dataFile.close();
// print to the serial port too:
Serial.print(dataYear);
Serial.print("-");
Serial.print(dataMonth);
Serial.print("-");
Serial.print(dataDay);
Serial.print(",");
Serial.print(dataHour);
Serial.print(":");
Serial.print(dataMinute);
Serial.print(":");
Serial.print(dataSecond);
Serial.print(",");
Serial.println(dataTemp);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}
}
A szenzor és idő adatokat 1 másodpercenként szeretném kiiratni. A kód a az 1 másodperces időzítés nélkül működik, viszont másodpercenként kb 20 adatot ír ki, ennyire nincs szükségem.
Tehát ha a kódrészlet elején nincs benne ez a rész, akkor működik.
currentMillis = millis();
if (currentMillis-previousMillis >= printTimeInterval){
// reset the debouncing timer
previousMillis = millis();
Ha benne hagyom akkor mindig a belső if, else ágára fut és a "error opening datalog.txt" üzenetet írja ki kb 1 másodpercenként.
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
Hol rontom el?
Ezt a részletet
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
helyezd át az 1 másodpercenként lefutó részbe.
Köszönöm.
Közben találtam egy másik megoldást,
az
if (currentMillis-previousMillis >= printTimeInterval){
résznek csináltam egy else ágat és lezártam a txt fáljt
dataFile.close();
De a Te megoldásod korrektebb.
Mégegyszer köszönöm.
Szeirntem a másodpercenkéni nyitós-csukós dologgal ki fogod nyírni az SD kártyát...
Ha az adatot nem felülírja hanem bővíti az adott fájlt másodprecenként, akkor adott területet csak egyszer írja az SD kártyán, nem?
Az SD az nem FLASH alapú, azaz csak egy blokkot lehet írni egyszerre, mindegy, hogy csak 1 byte-ot akarsz !?
A végleges megoldás valószínűleg egy ESP 32 lesz és a flash-t akarom használni.
Ez csak próba, hogy meg tudom-e csinálni amit akarok.
Van egy fizikai blokkméret, jellemzően 512 byte vagy annak többszöröse, és ha csak egy bitet is változtatsz, akkor is az egész blokkot írja újra. Aztán ott van még a logikai blokkméret, az SD kártyákon jellemzően valamilyen FAT filerendszer van, már fogalmam sincs hogy az a része milyen, utoljára DOS alatt foglalkoztam ilyesmivel, az meg rég volt.
De az biztos, hogy a FAT nem figyeli a cellák egyenletes terhelését, semmilyen wear leveling nincs benne, és a cellák kibírnak párszáz, max. párezer újraírást, aztán végük.
++ a FAT bizonyos file metadata dolgokat egy meghatározott helyen tárol a file-hoz, ha pl. minden írásnál frissíti a file dátumát, akkor az ezt tartalmazó szektor fog legelőbb megkotlani. A hozzászólás módosítva: Jan 15, 2019
Ezért is érdemes volt felkelni ma. Különösképpen nem foglalkoztattak az SD kártyák de az infó hasznos volt.
Sziasztok!
Progmem-es problémával fordulok hozzátok, Arduino nano alatt, de uno-n is ugyanezt produkálja.
Ha az lng változót nem használom változtatom meg a programban, akkor kioptimalizálja a fordító, és mint konstans használja, az értéke végig 0, ilyenkor jól működik a program, a tárolt szövegeket küldi át soros porton.
Viszont ha elé rakom a volatile kulcsszót az unsigned char lng=0; elé, semmi mást nem változtatok a programon, nem működik megfelelően. Ha berakok egy if (lng>10000) lng=0; , ami egyrészt sosem lesz igaz, másrészt az lng értéke alapból 0, tehát szintén nem változtatok semmit, akkor sem működik a program megfelelően, mert a fordító innentől mint változó használja, a soros monitoron szemét adatok jönnek, a memória egyik véletlen helyéről (ismétlődően). Szeretném változtatni az lng értékét a program futása alatt is. Hogyan tehetném meg? Köszi.
void setup() {
Serial.begin(115200);
}
const char string_0[] PROGMEM = "Merítési áram:";
const char string_1[] PROGMEM = "Belső ell.mérése";
const char string_2[] PROGMEM = "merítési árammal";
const char string_0a[] PROGMEM = "1.Internal Res.";
const char string_1a[] PROGMEM = "2.Electric Load";
const char string_2a[] PROGMEM = "3.Settings";
const char string_0b[] PROGMEM = "1.Innenwiderst.";
const char string_1b[] PROGMEM = "2.Elektr. Last";
const char string_2b[] PROGMEM = "3.Einstellungen";
const char* const txt[3][3] PROGMEM =
{
{string_0, string_1, string_2},
{string_0a, string_1a, string_2a},
{string_0b, string_1b, string_2b}
};
//volatile unsigned char lng=0;
unsigned char lng=0;
void loop() {
lcd_ir(txt[lng][0]);
//if (lng>10000) lng=0;
delay(1000);
}
void lcd_ir(const char *progmem_s)
{
unsigned char c;
while ( (c = pgm_read_byte(progmem_s++)) )
{
Serial.print((char)c);
}
Serial.println();
}
A hozzászólás módosítva: Jan 17, 2019
Megvan egy lehetséges megoldás, hátha valaki belefut:
Mivel egy óriási pointer tömböt használok, ezért nem muszáj a pointer tömb címét átadnom a függvénnyel, elég csak a sorszámot.
lcd_ir(txt[lng][0]); - e helyett: lcd_ir(0)-használva, átírva az lcd_ir fv-t működik a dolog.
Sziasztok! Arduinoval szeretnék a szokásos 2x16-os karakteres kijelzőnél valami szebb és esetleg kicsit nagyobb kijelzőt használni. Milyen kijelzőt vegyek, amit könnyű használni, és a vezérlésének nem túl nagy az erőforrásigénye?
Én ezt nézegettem, de még nem vettem meg. 5 IO kell neki, és van adaftuit driver hozzá (ILI9341) Sajnos tapasztalattal még nem rendelkezem vele kapcsolatban.
Sziasztok.
Előre bocsájtom, hogy 63 éves vagyok, 50 éve foglalkozom elektrónikával, de a most felmerűlő problémával nem tudok mit kezdeni, mert nincs semmi tapasztalatom, ezért kéne a segitség.
Nos, az egyik volt munkatársam fia, vásárolt egy Arduino alapú Smart Open 02/4WD bluetooth-os kisaútó KIT-et, azzal a tervel, hogy ő ezzel a témával áll elő a főiskolai vizsgán.
Felkértek, ha tudok segitsek.
A következő a probléma.
A kisaútó Arduino UNO memóriába feltelepitettem azt az ino kiterjesztésű programot, amit a könvtárba találtam. De viszont ez a program nem tartalmazza az ultrahangos távmérő kezelését.
Sebaj gondoltam, telepitem a könyvtárból az ultrahangos kezelő programot is,....ami sikerűlt is, de akkor meg a motorok vezérlése nem működött. Ha jól értem, akkor az Arduino egyszerre csak egy programot tud végrehajtani,....s az útalag telepitett programot csinálja, azaz lecseréli az azelőtitt.
Hogyan kéne a két programot összefűzni, egymásba másolni, úgy hogy mindkét program fússon? A segitséget előre köszönöm. Amúgy szivesen leveleznék is e témába.
Szia !
A kerettől függ, de szerintem Nextion vagy hasonló, soros porton kezelhető !
A szebbhez grafikus kijelző kell, de az meg erőforrás igényesebb, kivéve, ha önálló processzorral elintézi a megjelenítést csak a változásokat kell neki jelezni soros porton --> Nextion !
Szia.
Alapvetően amit rátöltesz az eszközre programként, az is fog futni. Viszont egyszerre csak egy, ahogy te is tapasztaltad. Tehát a két programból kell készíteni újat.
A programokat össze kell fűzni. Tulajdonképpen van az Arduino programoknak egy tipikus felépítése, melybe az általad használt két program struktúrája is illeszkedik.
Szerintem töltsd fel ide a két programot (csatold az ino kiterjesztésű fájlokat mellékletként például), úgy hamarabb kapsz segítséget.
Ettől függetlenül annak a személynek kellene igencsak beleásnia magát a témába, aki ezt szeretné főiskolai vizsgán. Mert azokon a vizsgákon ez a feladat azért messze nem bonyolult és igenis önállóan el kell tudnia jutni benne egy szintig. Amikor elakad, akkor bátran kérdezhet akár itt is. Persze ettől függetlenül a segítség lehetősége most is adott, mert neked is és neki is ez egy újdonság és ilyenkor pár alapvető dologhoz adott magyarázat sokat segíthet. Továbbá ajánlom az alábbi linket:
Arduino Hivatalos Oldala (Angol)
Sziasztok!
Programozásban kérnék egy kis segítséget, második este küzdök vele de nem találom a hibát.
Ez a teljes kód:
//Writes data to sd with correct time stemp. Measures magnetic field, temerature, TMP36, QMC5883L sensors are used. Calculates moving avarage of temperature.
//Writes log data to a separate file when button pressed
#include <SPI.h>
#include <SD.h>
#include <SdFat.h>
#include <Wire.h>
#include <TimeLib.h>
#include <EEPROM.h>
#include <MechaQMC5883.h>
MechaQMC5883 qmc;
int TMP36Pin = 0; //the analog pin the TMP36's Vout (sense) pin is connected to the resolution is 10 mV/degree centigrade with a 500 mV offset to allow for negative temperatures
int buttonPin = 2; //logger's press button attached to this pin
// Let's compare an average of 100
const byte averageCount = 100;
// Variables for the Modified Moving Average
double movingAverage = 0;
double movingAverageSum = 0;
// Timer variables
unsigned long previousAutoLogMillis = 0;
unsigned long currentAutoLogMillis = millis();
unsigned long printTempInterval = 1000; // print out measured results every 1000 msec
unsigned long printTimeInterval = 1000; // print out measured results every 1000 msec
unsigned long lastDebounceTime = 0; // the last time the logger input button was toggled
unsigned long debounceDelay = 100; // the debounce time; increase if the output flickers
//magnetic sensor variables
int x = 0;
int y = 0;
int z = 0;
int azimuth = 0;
//magnetic sensor array for avarage calculation, stores 10 values
const byte arraySize = 5;
double myX[arraySize];
double myY[arraySize];
double myZ[arraySize];
double myAzimuth[arraySize];
double avgX = 0;
double avgY = 0;
double avgZ = 0;
double avgAzimuth = 0;
//the current address in the EEPROM where you write the number of starts of the device
int addr = 0;
//number of device starts
byte starts = 0;
//chip pin for the datalogger shield, generally 4,10 or SS
const int chip = 10;
// logger button state definition
int buttonState = LOW; // the current reading the input button
int lastButtonState = LOW; // the previous reading the input button
void setup() {
//define pin modes
pinMode (TMP36Pin, INPUT );
pinMode(buttonPin, INPUT);
//Join I2C bus
Wire.begin();
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) ; // wait for serial port to connect. Needed for native USB port only
//QMC 5853 magnetic sensor initialization
qmc.init();
//qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
// read a byte the current address of the EEPROM
starts = EEPROM.read(addr);
starts = starts +1;
EEPROM.write(addr, starts);
//Sd card initialization
Serial.println("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chip)) {
Serial.println("Card failed, or not present");
// don't do anything more:
while (1);
}
Serial.println("Card initialized.");
//Log file name generation
//Serial.println (("Log file: Log_") + String(starts) + (".csv") + (" is created"));
// Pre-load MMA
for (int x=0; x < averageCount; x++)
movingAverageSum = movingAverageSum + analogRead (TMP36Pin );
//Serial.print(movingAverageSum);
//Serial.println(" movingAverageSum ");
// Calculate inital average
movingAverage = movingAverageSum / averageCount;
//Serial.print(movingAverage);
//Serial.println(" movingAverage ");
Serial.println("MMA preloaded");
Serial.println ("Date,Time,Temperature,X,Y,Z,Azimuth");
}
void loop() {
tmElements_t tm;
// make a string for assembling the data to log:
String dataTemp = "";
String dataYear = "";
String dataMonth = "";
String dataDay = "";
String dataHour = "";
String dataMinute= "";
String dataSecond = "";
String dataX = "";
String dataY = "";
String dataZ = "";
String dataAzimuth = "";
//getting the voltage reading the temperature sensor and append to the string:
// read the state of the log er button into a local variable:
int reading = digitalRead(buttonPin);
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
//Modified Moving Avarege method used to smooth sensor data
// each interation of loop, update moving average
// Get a new sample
// unsigned int currentValue = analogRead(analogPin);
// Remove previous movingAverage the sum
movingAverageSum = movingAverageSum - movingAverage;
// Replace it with the current sample
movingAverageSum = movingAverageSum + TMP36_Read;
// Recalculate movingAverage
movingAverage = movingAverageSum / averageCount;
//Serial.print(movingAverage);
//Serial.println(" calculated movingAverage ");
// analogRead values go 0 to 1023, analogWrite values 0 to 255
float voltage = ((movingAverage *5000) / 1024); // Gets you mV
//Serial.print(voltage);
//Serial.println(" voltage ");
// calculate the temperature
float temperatureC = (voltage - 500) / 10 ; //ing 10 mv per degree wit 500 mV offset to degrees ((voltage - 500mV) / 10)
//azimuth calculation //is supporting float too
qmc.read(&x, &y, &z,&azimuth); //azimuth = qmc.azimuth(&y,&x);//you can get custom azimuth
// print out the time
if (RTC.read(tm)) {
/*Serial.print(tmYearToCalendar(tm.Year));
Serial.write('-');
Serial.print(tm.Month);
Serial.write('-');
Serial.print(tm.Day);
Serial.write(',');
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.println();*/
} else {
if (RTC.chipPresent()) {
Serial. println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
} else {
Serial. println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
}
//append temperature data to the string:
dataTemp = String(temperatureC,1);
//append date and time data to the string:
dataYear = String(tmYearToCalendar(tm.Year));
dataMonth = String((tm.Month));
dataDay = String((tm.Day));
dataHour = String((tm.Hour));
dataMinute = String((tm.Minute));
dataSecond = String((tm.Second));
//append compass data to the string:
dataX = String(x);
dataY = String(y);
dataZ = String(z);
dataAzimuth = String(azimuth);
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
SdFile::dateTimeCallback(dateTime);
currentAutoLogMillis = millis();
if (currentAutoLogMillis-previousAutoLogMillis >= printTimeInterval){
// reset the timer
previousAutoLogMillis = millis();
//open the log file for writing
File dataFile = SD.open("Log_" + String(starts) + ".csv", FILE_WRITE);
// if the file is opened write data into it:
if (dataFile){
dataFile.print(dataYear);
dataFile.print(".");
dataFile.print(dataMonth);
dataFile.print(".");
dataFile.print(dataDay);
dataFile.print(",");
dataFile.print(dataHour);
dataFile.print(":");
dataFile.print(dataMinute);
dataFile.print(":");
dataFile.print(dataSecond);
dataFile.print(",");
dataFile.print(dataTemp);
dataFile.print(",");
dataFile.print(dataX);
dataFile.print(",");
dataFile.print(dataY);
dataFile.print(",");
dataFile.print(dataZ);
dataFile.print(",");
dataFile.println(dataAzimuth);
// close log file
dataFile.close();
// print to the serial port too:
Serial.print(dataYear);
Serial.print(".");
Serial.print(dataMonth);
Serial.print(".");
Serial.print(dataDay);
Serial.print(",");
Serial.print(dataHour);
Serial.print(":");
Serial.print(dataMinute);
Serial.print(":");
Serial.print(dataSecond);
Serial.print(",");
Serial.print(dataTemp);
Serial.print(",");
Serial.print(dataX);
Serial.print(",");
Serial.print(dataY);
Serial.print(",");
Serial.print(dataZ);
Serial.print(",");
Serial.println(dataAzimuth);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening General log file");
}
}
// whatever the reading is at, it's been there for longer than the debounce delay, so take it as the actual current state:
if (millis() - lastDebounceTime > debounceDelay) {
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH) {
//**************************
Serial.println("Custom log data: ");
for (int i=0; i <= arraySize-1; i++){
myX[i] = x;
Serial.print(myX[i]);
Serial.print(" ");
}
Serial.println();
for (int i=0; i <= arraySize-1; i++){
myY[i] = y;
Serial.print(myY[i]);
Serial.print(" ");
}
Serial.println();
for (int i=0; i <= arraySize-1; i++){
myZ[i] = z;
Serial.print(myZ[i]);
Serial.print(" ");
}
Serial.println();
for (int i=0; i <= arraySize-1; i++){
myAzimuth[i] = azimuth;
Serial.print(myAzimuth[i]);
Serial.print(" ");
}
Serial.println();
avgX = 0;
avgY = 0;
avgZ = 0;
avgAzimuth = 0;
for (int i=0; i <= arraySize-1; i++){
//avgX = avgX + myX[i];
//avgY = avgY + myY[i];
avgZ = avgZ + myZ[i];
avgAzimuth = avgAzimuth + myAzimuth[i];
}
Serial.println("Avarage values: ");
avgX = avgX/arraySize;
avgY = avgY/arraySize;
avgZ = avgZ/arraySize;
avgAzimuth = avgAzimuth/arraySize;
//Serial.print("Avarage X value: ");
Serial.println(avgX);
//Serial.print("Avarage Y value: ");
Serial.println(avgY);
//Serial.print("Avarage Z value: ");
Serial.println(avgZ);
//Serial.print("Avarage Azimuth value: ");
Serial.println(avgAzimuth);
//*************************
//open the log file for writing
File customFile = SD.open("Dlog_" + String(starts) + ".csv", FILE_WRITE);
// if the file is opened write data into it:
if (customFile){
customFile.print(dataYear);
customFile.print(".");
customFile.print(dataMonth);
customFile.print(".");
customFile.print(dataDay);
customFile.print(",");
customFile.print(dataHour);
customFile.print(":");
customFile.print(dataMinute);
customFile.print(":");
customFile.print(dataSecond);
customFile.print(",");
customFile.print(dataTemp);
customFile.print(",");
customFile.print(dataX);
customFile.print(",");
customFile.print(dataY);
customFile.print(",");
customFile.print(dataZ);
customFile.print(",");
customFile.println(dataAzimuth);
// close log file
customFile.close();
Serial.println("Custom log written");
}
}
}
}
// save the reading. Next time through the loop, it'll be the lastButtonState
lastButtonState = reading;
}
/* Additional functions */
/**************************************/
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
void dateTime(uint16_t* date, uint16_t* time) {
tmElements_t tm;
RTC.read(tm);
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(tmYearToCalendar(tm.Year), tm.Month, tm.Day);
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(tm.Hour, tm.Minute, tm.Second);
}
A kódnak ezzel a részével van a gondom:
avgX = 0;
avgY = 0;
avgZ = 0;
avgAzimuth = 0;
for (int i=0; i <= arraySize-1; i++){
//avgX = avgX + myX[i];
//avgY = avgY + myY[i];
avgZ = avgZ + myZ[i];
avgAzimuth = avgAzimuth + myAzimuth[i];
}
Serial.println("Avarage values: ");
avgX = avgX/arraySize;
avgY = avgY/arraySize;
avgZ = avgZ/arraySize;
avgAzimuth = avgAzimuth/arraySize;
//Serial.print("Avarage X value: ");
Serial.println(avgX);
//Serial.print("Avarage Y value: ");
Serial.println(avgY);
//Serial.print("Avarage Z value: ");
Serial.println(avgZ);
//Serial.print("Avarage Azimuth value: ");
Serial.println(avgAzimuth);
Jelenleg azt csinálom, hogy egy tömbbe neolvasok 5 adatot, majd annak kiszámolom az átlagát és kiiratom a soros porta.
Eddig működik is a dolog:
Initializing SD card...
Card initialized.
Date,Time,Temperature,X,Y,Z,Azimuth
2019.1.18,23:17:2,27.6,788,-1102,-372,305
2019.1.18,23:17:3,26.3,798,-1103,-362,305
2019.1.18,23:17:4,26.3,788,-1095,-357,305
2019.1.18,23:17:5,26.2,801,-1102,-367,306
2019.1.18,23:17:6,27.0,783,-1102,-365,305
2019.1.18,23:17:7,26.9,753,-1113,-365,304
2019.1.18,23:17:8,26.8,768,-1106,-355,304
Custom log data:
791.00 791.00 791.00 791.00 791.00
-1118.00 -1118.00 -1118.00 -1118.00 -1118.00
-372.00 -372.00 -372.00 -372.00 -372.00
305.00 305.00 305.00 305.00 305.00
Avarage values:
0.00
0.00
-372.00
305.00
Custom log written
2019.1.18,23:17:9,26.9,778,-1113,-367,304
2019.1.18,23:17:10,26.5,763,-1111,-370,304
2019.1.18,23:17:11,26.5,773,-1111,-377,304
2019.1.18,23:17:12,26.5,783,-1123,-355,304
2019.1.18,23:17:13,26.5,766,-1116,-372,304
Az összegzést és így az átlagszámítást viszonz csak 2 változóra tudom elvégezni:
Ha az alábbi 2 kódrészletben bármelyik rész kikommentelését megszűntetem akkor az "error opening General log file" hibaüzenetet kapom. Nem értem, hogy ennek mi köze van ehhez a kódrészlethez.
Azt tapasztaltam, hogy 2 illetve 4 sort az összegzésnél és a kiiratásnál is ki kell kommentelni. Mindegy, hogy melyikeket.
Ha a tömböm méretét (arraySize) megnövelem 5-ről 10-re, az is ugyan ezt a jelenséget okozza.
Ha lecsökkentem 3-ra, akkor egy sort visszarakhatok. Vagy összegzést vagy soros porta kiiratást. De csak 1-et.
for (int i=0; i <= arraySize-1; i++){
//avgX = avgX + myX[i];
//avgY = avgY + myY[i];
avgZ = avgZ + myZ[i];
avgAzimuth = avgAzimuth + myAzimuth[i];
//Serial.print("Avarage X value: ");
Serial.println(avgX);
//Serial.print("Avarage Y value: ");
Serial.println(avgY);
//Serial.print("Avarage Z value: ");
Serial.println(avgZ);
//Serial.print("Avarage Azimuth value: ");
Serial.println(avgAzimuth)
Van v.kinek v.mi ötlete? A hozzászólás módosítva: Jan 19, 2019
Nagyon valószínű, hogy elfogyott a memória!
Próbáld meg a Flash kapcsolót használni az ilyen kiíratásoknál:
Serial. println("The DS1307 is stopped. Please run the SetTime");
Tehát ahol constans szöveget használsz, azt mindenűt kiegészíted így:
Serial. println(F ("The DS1307 is stopped. Please run the SetTime"));
Ezzel eléred, hogy nem másolja be a stringeket az alkalmazás a Ramba, hanem közvetlenül a flashból írja ki.
Nagyon sok memóriát megspórolhatsz így.
Bővebben: Link A hozzászólás módosítva: Jan 19, 2019
Kövessétek az előző lapon lévő irodalmak hivatkozásait:
itt lévőt
Köszönöm!!
Ez megoldotta a hibát.
Viszont újabb kérdést generált.
A hibásan működő kód betöltése után ez az eredmény:
Sketch uses 22038 bytes (71%) of program storage space. Maximum is 30720 bytes.
Global variables use 1553 bytes (75%) of dynamic memory, leaving 495 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.
Ugyan az a kód csak a Flash kapcsolót használva pedig ez:
Sketch uses 22314 bytes (72%) of program storage space. Maximum is 30720 bytes.
Global variables use 1299 bytes (63%) of dynamic memory, leaving 749 bytes for local variables. Maximum is 2048 bytes.
Látható, hogy a kód így több helyet foglal, viszont a dinamikus memória foglalás 12%-al csökkent.
Sajnos kb. csak a kód megírásának a felénél tartok és a jelek szerint nem lesz elég memória.
Még 1 szenzor, lcd és a szenzor adatok kiértékelése hátra van.
Van e v.mi általános szabály arra nézve, hogy meddig lehet felmenni azzel a két % értékkel?
Illetve, hogyan tudnám tovább csökkenteni a kódot (a változók típusát még átnézem)? A hozzászólás módosítva: Jan 19, 2019
Biztosan kell az összes String típusú dataxyz nevű változó?
Mi lenne, ha a numerikus értékeket ezek nélkül az egyetlen célra létrehozott tárolók nélkül készítenéd elő kiíratásra?
Pl:
int ev=2019;
byte ho=12, nap=31;
float atlag=123.456, csucs=333.333;
String strKimenet;
Serial.begin(9600);
strKimenet=String("Dátum:");
strKimenet+=ev+String(".")+ho+"."+nap+"., Átlag:"+atlag+" Csúcs:"+csucs;
Serial.println( strKimenet );
Például ne foglalj le memóriát ismeretlen mérettel óriási pazarlás: String dataYear = ""; ???
(Lefoglalja a max méretet 255 Byte?)
Az év az max 4+\0 char ez kerekítve páros számra=6 char tehát: String dataYear[6] = "";
Ez csak 6 Byte foglalás.
Másik ne foglalj feleslegesen int-et (2 Byte) ahol az 1 Byte is elég.
Más szerintem ez így SD gyilkos alkalmazás lesz! Nem kellene mindig írni a kártyára.
Mert az mindig 1 blokk újraírását jelenti, tehát összekellene gyűjteni 1 blokknyi adatott és egyszerre kiírni.
Pl. van az RTC-ben is 56 Byte nem felejtő RAM, felhasználható lenne ideiglenes tárolásra.
Illetve javasolt a String osztály mellőzése, az eléggé bloat. Ha szükséges, akkor lehet helyette megfelelő méretű char tömböt használni. De ennél a példánál pl. nem is szükséges:
int ev=2019;
byte ho=12, nap=31;
float atlag=123.456, csucs=333.333;
Serial.begin(9600);
Serial.print("Dátum:");
Serial.print(ev);
Serial.print('.');
Serial.print(ho);
Serial.print('.');
Serial.print(nap);
Serial.print("., Átlag:");
Serial.print(atlag);
Serial.print(" Csúcs:");
Serial.println(csucs);
|
|