Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   510 / 854
(#) berkesandor válasza benjami hozzászólására (») Feb 1, 2019 /
 
Ezzel a kóddal, lényegesen kevesebb a baki, 100-150 ből kb. 1 hiba van.
A "pontosság" indok szerintem itt nem játszik, mert 0.01 inkább a saccolás kategóriája ebben a témában.
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Szam: 12345.896
Szorzott: 12345896

Szam: 12345.897
Szorzott: 12345896

Szam: 12345.898
Szorzott: 12345897
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Ebből nekem úgy tűnik, hogy az utolsó helyiértéket rontja el, tehát ha három tizedesre számolsz, de a harmadik tizedest eldobod, akkor meg is vagy.
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Hogy dobjam le?
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
  1. long szorzott;
  2. float  szam = 12345.87;
  3. double egeszresz;
  4. double tortresz;
  5. float ftortresz;
  6. float ftort;
  7.  
  8. void setup() {
  9.   Serial.begin(9600);
  10. }
  11. void loop() {
  12.   egeszresz = szam; // elvileg már itt egeszre lesz konvertálva
  13.   ftort = szam - egeszresz;
  14. // itt ki is lehetne íratni ellenőrzésképpen
  15.   Serial.print("Egeszresz: "); Serial.println(egeszresz);
  16.   Serial.print("Tortresz: "); Serial.println(ftort);
  17.  
  18.   egeszresz = egeszresz * 100;
  19.   tortresz = ftort * 100;
  20.   Serial.print("Egeszresz: "); Serial.println(egeszresz);
  21.   Serial.print("Tortresz: "); Serial.println(tortresz);
  22.  
  23.   szorzott = egeszresz  + tortresz;
  24.   Serial.print("Szorzott: "); Serial.println(szorzott);
  25.   Serial.println("");
  26.  
  27.   szam = szam +0.01;
  28. }


Ez nem oké:
Egeszresz: 12345.88
Tortresz: 0.00
Egeszresz: 1234588.00
Tortresz: 0.00
Szorzott: 1234588

Egeszresz: 12345.89
Tortresz: 0.00
Egeszresz: 1234589.00
Tortresz: 0.00
Szorzott: 1234589
(#) benjami válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Pedig játszik a pontosság. Mivel a float nem tízes számrendszerben számol, hanem kettesben, a te általad megadott számokat nem is tudja abszolút pontosan ábrázolni, mert végtelen kettedes törtszám. Amúgy a 12345.896 már nyolc számjegy, ami a 24 bites mantissába már csak kerekítve fér bele. Elolvastad az általam belinkelt oldalt amiben le van írva hogyan is áll össze egy float szám?
A hozzászólás módosítva: Feb 1, 2019
(#) berkesandor válasza benjami hozzászólására (») Feb 1, 2019 /
 
Elolvastam, csak nem lettem tőle okosabb.
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Long! Elnéztem bocsi! Nem double, hanem long!
(#) sargarigo válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Úgy dobod el, hogy amikor számolsz, akkor három tizedest használsz, mint a fenti példában. De amikor kiírod, akkor a harmadik tizedes jeggyel már nem foglalkozol. De ez egy másik vonal, előbb nézzük a fenti példát!
A hozzászólás módosítva: Feb 1, 2019
(#) benjami válasza berkesandor hozzászólására (») Feb 1, 2019 / 1
 
Amúgy mi az a dolog amihez feltétlenül lebegőpontos szám szükséges? Nagyrészt elkerülhető a lebegőpontos számok használata ha pl. méter helyett milliméterben számolunk, kg helyett grammban, MHz helyett mHz-ben stb. Én még az egész számmal történő osztást is próbálom elkerülni ahol lehet (a konstanssal történő osztás pl. sok esetben helyettesíthető szorzással és 2 hatványával történő osztással, ami ugyebár csak bittologatás).
(#) sargarigo válasza benjami hozzászólására (») Feb 1, 2019 /
 
Úgyvan!
A hozzászólás módosítva: Feb 1, 2019
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Szam: 12345.89
Egeszresz: 12345
Tortresz: 0.89
Egeszresz: 1234500
Tortresz: 88
Szorzott: 1234588
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Na, ez már jónak tűnik! Nagy mintával is működik?
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Annyira nem tűnik jónak, ugyanott vagyunk ahol indultunk.
Lehet ezt hagyni kell.
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Nemnem! Szétszedtük két részre, és a két részt egymástól függetlenül, de ugyanúgy tudjuk kezelni!
(#) sargarigo válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
Csak fogjuk a 12345 értéket, felbontjuk karakterekre, majd fogjuk a 88 értéket, és egy pötty után felbontjuk karakterekre. Így megkerültük a gyenge láncszemet. Igaz kicsit kavartunk vele, de legalább megoldható.
(#) berkesandor válasza benjami hozzászólására (») Feb 1, 2019 /
 
Mérleget csinálok. Igazából ez arra kellett volna, hogy egy 1621 kijelzőre írjak.
Nem akarok bonyolult lib-et használni, ezért kell a helyiértékre bontás.
Simán kikerülhető a lebegőpontos számolás, csak azt hittem valami egyértelmű dolgot nem tudok, vagy nem látok.
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Érthető. De már készen vagy. Mindjárt összefésülök egy kódot.
(#) berkesandor válasza sargarigo hozzászólására (») Feb 1, 2019 /
 
"Tortresz: 0.89
Egeszresz: 1234500
Tortresz: 88"

Itt hibázik, ezt a csorbát hogyan köszörülöd ki?
(#) sargarigo válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Tényleg! Ezt észre sem vettem
Azért ez már tényleg elég gáz, hogy a 0.89-et nem tudja megszorozni 100-zal.
Próbáld már ki, hogy mindent kigyomlálsz, és csak ezt a szorzást hagyod meg benne!

Utána próbáld ki azt hogy 100F-fel szorzod!
A hozzászólás módosítva: Feb 1, 2019
(#) benjami válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Hogy ráhibáztam a felhozott példámban a mértékegységre
Amúgy már csak megérteni szeretnéd? - Mert a mérlegedhez szerintem teljesen felesleges a lebegőpontos szám. Mérheted grammban, vagy milligrammban, vagy amiben akarod, aztán a kiírás során oda rakod a tizedes vesszőt/pontot ahova akarod, és annyi számjegyet raksz ki amennyit akarsz (csak a mértékegység és a tizedespont helye passzoljon).
Ha meg akarod érteni a float konverzióban a hiba okát, akkor szerintem használj olyan fejlesztőeszközt amiben lehet debuggolni és lépésenként futtatni a programodat (akár csak a szimulátorában). Ilyen pl. az Atmel studio, Atollic truestudio (igaz ez 32 bites ARM-hez van), stb.
Esetleg táblázatkezelőben (Libreoffice calc, Excel) is csinálhatsz szimulációkat, ha azt egyszerűbbnek találod.
(#) hadhazik hozzászólása Feb 1, 2019 /
 
Érdemes átírni az alábbi kódot?
QMC5883l érkezett HMC5883L helyett.
  1. [/[code=c]
  2. /*
  3.  * An Arduino code  of Antenna Rotator Controller.
  4.  * Copyright (c) 2016 Vinod E S (VU3ESV) , Jayaprakash L V (VU2JLH)
  5.  * Version 1.0 - initial release
  6.  * Version 1.1 - Inflight Entry after holding the "*" Key for 3 seconds
  7.  
  8.   * Permission is hereby granted, free of charge, to any person obtaining a copy
  9.  * of this software and associated documentation files (the "Software"), to deal
  10.  * in the Software without restriction, including without limitation the rights
  11.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12.  * copies of the Software, and to permit persons to whom the Software is
  13.  * furnished to do so, subject to the following conditions:
  14.  *
  15.  * The above copyright notice and this permission notice sh be included in
  16.  *  copies or substantial portions of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SH THE
  21.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ,
  23.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24.  * THE SOFTWARE.
  25.  * Arduino antenna rotator controller -update.
  26.    I have used the SevensegmentFull.c  the below link. Please download it to the utft library folder to solve the compiler errors.
  27.  
  28.    http://www.rinkydinkelectronics.com/r_fonts.php
  29.  
  30.  Harware Information :-
  31.  
  32.  1) Arduino Mega 2560R3 or its clones
  33.  2) HMC5883 Accelerometer
  34.  3) I2C Expander (NXP)
  35.  4) 2.8Inch TFT Display
  36.  5) Momentary push button switchs
  37.  6) Potentiometer
  38.  7) H-Bridge for driving the Motors
  39.  */
  40.  
  41. #include <Wire.h> //I2C Arduino Library
  42. #include <UTFT.h> // UTFT Library  Henning Karlsen (http://www.rinkydinkelectronics.com/library.php)
  43. #include <UTFT_Geometry.h> //UTFT Geometry Library  Henning Karlsen (http://www.rinkydinkelectronics.com/library.php)
  44. #include <Keypad.h>
  45. #include <EEPROM.h>
  46.  
  47. const int centreX  = 320;
  48. const int centreY  = 160;
  49. const int diameter = 130;
  50. const int x_Offset = 30;
  51. const int y_Offset = 128;
  52. const int z_Offset = 0;
  53. const byte rows = 4; // Four rows
  54. const byte cols = 3; // Three columns
  55. const int maxDegreeDigits = 3; //maximum owed input length
  56. const int fixedInflight = 5;
  57. const long maxInflight = 25;
  58.  
  59. extern uint8_t BigFont[];
  60. extern uint8_t SmFont[];
  61. extern uint8_t SevenSegmentFull[];
  62.  
  63. #define BLACK   0x0000
  64. #define BLUE    0x001F
  65. #define RED     0xF800
  66. #define GREEN   0x07E0
  67. #define CYAN    0x07FF
  68. #define MAGENTA 0xF81F
  69. #define YELLOW  0xFFE0
  70. #define WHITE   0xFFFF
  71. #define ORANGE  0xFF00
  72. #define address 0x0D //0011110b, I2C 7bit address of HMC5883
  73. #define EEPROM_ModeStatus_Location 10     // The starting address of the EEPROM where the data is Stored (10.11.12.13)
  74. #define EEPROMSetpointLocation         14
  75. #define EEPROM_ScaleMax_Location        18
  76. #define EEPROMInflightLocation         22
  77.  
  78. struct EEPROMValue   //EEPROM Data Structure : Taken  G0MGX DDS VFO Code  
  79. {
  80.   {
  81.     long Value;
  82.     struct
  83.     {
  84.       unsigned char Byte1;
  85.       unsigned char Byte2;
  86.       unsigned char Byte3;
  87.       unsigned char Byte4;
  88.     }
  89.     __attribute__((packed));
  90.   }
  91.   __attribute__((packed));
  92. }
  93. __attribute__((packed));
  94.  
  95. inline long ReadEEPROMValue(int16_t EEPROMStartAddress);              //Reads the values  EEPROM Like Calibration , set Parameters, etc
  96. inline void SaveEEPROMValue(int16_t EEPROMStartAddress, long Value);  //Save the Value to EEPROM starting the given StartAddress (4 Bytes of Data)
  97. inline double ReadAngleAccelerometer(int x_Offset, int y_Offset);
  98. inline void ResetInputBuffer(void);
  99.  
  100. // Define the Keymap
  101. char keys[rows][cols] =
  102. {
  103.   {
  104.     '1','2','3'                 }
  105.   ,
  106.   {
  107.     '4','5','6'                 }
  108.   ,
  109.   {
  110.     '7','8','9'                 }
  111.   ,
  112.   {
  113.     '*','0','#'                 }
  114. };
  115.  
  116. boolean UserEntryStarted = false;
  117. boolean UserEntryFinished = true;
  118. boolean InflightEntryStarted = false;
  119. boolean InflightEntryFinished = true;
  120. boolean stopFlag = true;
  121. boolean modeValue = false;    // modeValue = false (Manual Mode), modeValue = true (Auto Mode)
  122. boolean inpution = false; // false  =  SetPoint Input , True = inflight input
  123.  
  124. char KeyEntries[3];         //3 characters to store 0 to 360 Degrees
  125. char dataBuffer[60];
  126. char formattedDataBuffer[3];
  127.  
  128. int dx;
  129. int dy;
  130. int last_dx;
  131. int last_dy;
  132. int bufPtr = 0;
  133. int CWMotor  =  10;
  134. int CCWMotor = 11;
  135. int Stop_ResumeSignal = 12;
  136. int Manual_Auto_Mode = 13;
  137. int ManualSpeedControl = 9;
  138.  
  139. long UserEntry = 0;
  140. long DegreeInput = 0;
  141. long Inflight = 0;
  142. long storedModeValue = 0;
  143. long scaleMax  = 0;
  144.  
  145. double angle = 0;
  146.  
  147. //Normal Keyboard Connected To Arduino
  148. // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
  149. byte rowPins[rows] = {
  150.   8, 7, 6, 5 };
  151. // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
  152. byte colPins[cols] = {
  153.   4, 3, 2 };
  154.  
  155. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );
  156.  
  157.  UTFT utftDisplay(ILI9486,38,39,40,41);
  158. //UTFT utftDisplay(ITDB32S,38,39,40,41);
  159. #define  FormatData(x) strcpy_P(dataBuffer, PSTR(x))
  160.  
  161. void setup(){
  162.   Serial.begin(9600);
  163.   utftDisplay.InitLCD();
  164.   utftDisplay.InitLCD(LANDSCAPE);
  165.   utftDisplay.clrScr();
  166.   utftDisplay.setFont(BigFont);
  167.   utftDisplay.setColor(255, 0, 0);
  168.   utftDisplay.print("ANTENNA ROTATOR ", LEFT, 16);
  169.   utftDisplay.print("CONTROLLER ", 40, 40);
  170.   utftDisplay.drawLine(440, 160, 460, 160);
  171.   utftDisplay.drawLine(180, 160, 200, 160);
  172.   utftDisplay.drawLine(320, 20, 320, 40);
  173.   utftDisplay.drawLine(320, 280, 320, 300);
  174.   utftDisplay.setColor(255, 255, 0);
  175.   utftDisplay.print("BEAM DIR", LEFT, 87);
  176.   utftDisplay.setFont(SmFont);
  177.   utftDisplay.setColor(255, 100, 100);
  178.   utftDisplay.print("SET DIR", LEFT, 210);
  179.   utftDisplay.print("INFLIGHT", LEFT, 230);
  180.   utftDisplay.setFont(BigFont);
  181.   utftDisplay.setColor(255, 0, 0);
  182.   utftDisplay.print("O", 95,  115);
  183.   utftDisplay.setColor(255, 255, 255);
  184.   utftDisplay.print("HA0DX : ZOLI",LEFT, 290);
  185.   // Initialize I2C communications
  186.   Wire.begin();
  187.   //Put the HMC5883 IC into the correct operating mode
  188.   Wire.beginTransmission(address); //open communication with HMC5883
  189.   Wire.write(0x02); // mode register
  190.   Wire.write(0x00); //continuous measurement mode
  191.   Wire.endTransmission();
  192.   delay(300);
  193.   last_dx = centreX;
  194.   last_dy = centreY;
  195.  
  196.   DegreeInput = ReadEEPROMValue(EEPROMSetpointLocation);
  197.   Inflight = ReadEEPROMValue(EEPROMInflightLocation);
  198.   if(Inflight<fixedInflight)
  199.   {
  200.     Inflight = fixedInflight;
  201.   }
  202.   storedModeValue = ReadEEPROMValue(EEPROM_ModeStatus_Location);
  203.   scaleMax = ReadEEPROMValue(EEPROM_ScaleMax_Location);
  204.   if (storedModeValue ==0)
  205.   {
  206.     modeValue = false; //Manual Mode
  207.   }
  208.   else if (storedModeValue == 1)
  209.   {
  210.     modeValue = true;  // AutoMode
  211.   }
  212.   keypad.setDebounceTime(50);
  213.   keypad.setHoldTime(3000);
  214.   keypad.addEventListener(KeypadEventHandler); // Add an event listener for this keypad
  215.  
  216.   pinMode(ManualSpeedControl, OUTPUT);
  217.   pinMode(CWMotor,OUTPUT);
  218.   digitalWrite(CWMotor,LOW);
  219.   pinMode(CCWMotor,OUTPUT);
  220.   digitalWrite(CCWMotor,LOW);
  221.   pinMode(Manual_Auto_Mode,INPUT);
  222.   pinMode(Stop_ResumeSignal,INPUT);
  223.   analogReference(DEFAULT);
  224. }
  225. double ReadAngleAccelerometer(int x_Offset, int y_Offset)
  226. {
  227.   //Tell the HMC5883 where to begin reading data
  228.   Wire.beginTransmission(address);
  229.   Wire.write(0x03); // register 3, X MSB register
  230.   Wire.endTransmission();
  231.   //Read data  each axis, 2 registers per axis
  232.   Wire.request(address, 6);
  233.   int x,y,z; //triple axis data
  234.   if(6<=Wire.available())
  235.   {
  236.     x = Wire.read() << 8 | Wire.read();
  237.     z = Wire.read() << 8 | Wire.read();
  238.     y = Wire.read() << 8 | Wire.read();
  239.   }
  240.   DrawRotatorPosition();
  241.   return atan2((double)y + y_Offset,(double)x + x_Offset)* (180 / 3.141592654) + 180;
  242. }
  243. void loop()
  244. {
  245.   char key = keypad.getKey();
  246.   angle = ReadAngleAccelerometer(y_Offset, x_Offset);
  247.   if((digitalRead( Stop_ResumeSignal) == false)&& stopFlag == true)
  248.   {
  249.     stopFlag = false;
  250.   }
  251.   else if((digitalRead( Stop_ResumeSignal) == false)&& stopFlag == false)
  252.   {  
  253.     stopFlag = true;
  254.   }
  255.   if (stopFlag == true)
  256.   {  
  257.     digitalWrite(CWMotor,LOW);
  258.     digitalWrite(CCWMotor,LOW);
  259.     stopFlag = true;
  260.     utftDisplay.setColor(0, 0, 0);
  261.     utftDisplay.print("      ", RIGHT, 25);
  262.   }
  263.   else
  264.   {
  265.     if(((long)angle< DegreeInput )&& stopFlag == false)
  266.     {  
  267.       digitalWrite(CWMotor,HIGH);
  268.       digitalWrite(CCWMotor,LOW);
  269.       utftDisplay.setColor(0, 255, 255);
  270.       utftDisplay.print("  CW ", RIGHT, 25);
  271.     }
  272.     if(((long)angle >DegreeInput)&& stopFlag == false)
  273.     {  
  274.       digitalWrite(CWMotor,LOW);
  275.       digitalWrite(CCWMotor,HIGH);
  276.       utftDisplay.setColor(0, 255, 255);
  277.       utftDisplay.print(" CCW ", RIGHT, 25);
  278.     }
  279.     if(((long) angle == DegreeInput)||
  280.       ((long) angle > DegreeInput-Inflight)&&
  281.       ((long) angle < DegreeInput+ Inflight ))
  282.     {  
  283.       digitalWrite(CWMotor,LOW);
  284.       digitalWrite(CCWMotor,LOW);
  285.       stopFlag = true;
  286.       utftDisplay.setColor(0, 0, 0);
  287.       utftDisplay.print("      ", RIGHT, 25);
  288.     }
  289.   }
  290.   if((digitalRead( Manual_Auto_Mode) == false) && modeValue == false )
  291.   {
  292.     modeValue = true;  
  293.     SaveEEPROMValue(EEPROM_ModeStatus_Location, 1);
  294.   }
  295.   else if((digitalRead( Manual_Auto_Mode) == false) && modeValue == true )
  296.   {
  297.     modeValue = false;
  298.     SaveEEPROMValue(EEPROM_ModeStatus_Location, 0);
  299.   }
  300.   if (modeValue ==  false)
  301.   {
  302.     if(stopFlag == false)
  303.     {
  304.       int spdValue = analogRead(A0);
  305.       spdValue = map(spdValue, 0, 1023, 0 , 255);
  306.       analogWrite(ManualSpeedControl, spdValue);
  307.     }
  308.     else
  309.     {
  310.       analogWrite(ManualSpeedControl, 0);
  311.     }
  312.     utftDisplay.setColor(0, 255, 255);
  313.     utftDisplay.print("Manual ", RIGHT, 295);
  314.   }
  315.   else
  316.   {
  317.     if(stopFlag == false)
  318.     {
  319.       int rotationValue =abs( (int)(DegreeInput- (long) angle)); /* Irrespective of the Direction the difference in value needs to be considered for PWM
  320.        // , Stoping is based on Cw/CCW outputs*/
  321.       //Use Serial Print to check the value of rotationValue variable
  322.       int scaleRotationValue =  rotationValue *4;
  323.       int scaleMaxValue = scaleMax *4;
  324.       int newSpeedValue = map(scaleRotationValue,0,scaleMaxValue, 0,255);   //The Scaling needs to be fine tuned based on the Test.    
  325.       analogWrite(ManualSpeedControl, newSpeedValue);
  326.     }
  327.     else
  328.     {
  329.       analogWrite(ManualSpeedControl, 0);
  330.     }
  331.     utftDisplay.setColor(0, 255, 255);
  332.     utftDisplay.print("    Auto ", RIGHT, 295);
  333.   }
  334.   dx = (diameter * cos((angle-90)*3.14/180)) + centreX;    // calculate X position
  335.   dy = (diameter * sin((angle-90)*3.14/180)) + centreY;    // calculate Y position
  336.   utftDisplay.setColor(BLACK);
  337.   DrawArrow(last_dx,last_dy, centreX, centreY, 8, 8);        // Erase last arrow    
  338.   utftDisplay.setColor(GREEN);
  339.   DrawArrow(dx,dy, centreX, centreY, 8, 8);                  // Draw arrow in new position
  340.   last_dx = dx;
  341.   last_dy = dy;
  342.   delay(25);
  343.   utftDisplay.setFont(SevenSegmentFull);
  344.   utftDisplay.setColor(255, 0, 127);
  345.   int a =(int)angle;
  346.   sprintf(formattedDataBuffer, FormatData("%03d"),a);
  347.   utftDisplay.print(formattedDataBuffer, LEFT, 135);
  348.   if(UserEntryFinished == true)
  349.   {
  350.     utftDisplay.setFont(BigFont);
  351.     utftDisplay.setColor(0, 255, 0);
  352.     utftDisplay.printNumI(DegreeInput,80,205);
  353.   }
  354.   if(InflightEntryFinished == true)
  355.   {
  356.     utftDisplay.setFont(BigFont);
  357.     utftDisplay.setColor(0, 255, 0);
  358.     utftDisplay.printNumI(Inflight,80,225);
  359.   }
  360.   utftDisplay.setFont(BigFont);
  361.   utftDisplay.setColor(0, 100, 255);
  362.   if((angle < 22.5)  || (angle > 337.5 ))utftDisplay.print("     North", LEFT, 260);
  363.   if((angle > 22.5)  && (angle < 67.5 )) utftDisplay.print("North-East", LEFT, 260);
  364.   if((angle > 67.5)  && (angle < 112.5 ))utftDisplay.print("      East", LEFT, 260);
  365.   if((angle > 112.5) && (angle < 157.5 ))utftDisplay.print("South-East", LEFT, 260);
  366.   if((angle > 157.5) && (angle < 202.5 ))utftDisplay.print("     South", LEFT, 260);
  367.   if((angle > 202.5) && (angle < 247.5 ))utftDisplay.print("South-West", LEFT, 260);
  368.   if((angle > 247.5) && (angle < 292.5 ))utftDisplay.print("      West", LEFT, 260);
  369.   if((angle > 292.5) && (angle < 337.5 ))utftDisplay.print("North-West", LEFT, 260);
  370. }
  371.  
  372. void KeypadEventHandler(KeypadEvent key)
  373. {
  374.   if (key != NO_KEY)
  375.   {
  376.     switch (keypad.getState())
  377.     {
  378.     case IDLE:
  379.     case RELEASED:
  380.       break;
  381.     case HOLD:
  382.       switch (key)
  383.       {
  384.         case '*':      
  385.         if (inpution == true)
  386.         {
  387.           utftDisplay.setFont(BigFont);
  388.           utftDisplay.setColor(255, 0, 127);
  389.           utftDisplay.print("   ",80,225);
  390.           ResetInputBuffer();
  391.           UserEntry = 0;
  392.           InflightEntryStarted = true;
  393.           InflightEntryFinished = false;
  394.         }
  395.         break;
  396.       }
  397.       break;
  398.     case PRESSED:
  399.       switch (key)
  400.       {
  401.       case '#':
  402.         if (inpution == false)
  403.         {
  404.           UserEntryFinished = true;
  405.           UserEntryStarted = false;
  406.           if((UserEntry < 360) )
  407.           {
  408.             //If the User SetPoint is less than Inflight then we can't accept the set point
  409.             if(UserEntry> Inflight)
  410.             {
  411.               DegreeInput = UserEntry;
  412.               SaveEEPROMValue(EEPROMSetpointLocation, DegreeInput);
  413.               scaleMax = abs( (int)(DegreeInput- (long) angle));
  414.               SaveEEPROMValue (EEPROM_ScaleMax_Location, scaleMax);
  415.               utftDisplay.setFont(BigFont);
  416.               utftDisplay.setColor(BLACK);
  417.               utftDisplay.print("    ",80,205);
  418.               stopFlag = false;
  419.             }
  420.             else
  421.             {
  422.               //Show Error in UI
  423.             }    
  424.           }
  425.           else
  426.           {
  427.             utftDisplay.print("    ",80,205);
  428.             DegreeInput = ReadEEPROMValue(EEPROMSetpointLocation);
  429.           }
  430.           inpution = true;
  431.         }
  432.         else
  433.         {
  434.           InflightEntryFinished = true;
  435.           InflightEntryStarted = false;
  436.           if((UserEntry < maxInflight) )
  437.           {
  438.             Inflight = UserEntry;
  439.             SaveEEPROMValue(EEPROMInflightLocation, Inflight);
  440.             utftDisplay.setFont(BigFont);
  441.             utftDisplay.setColor(BLACK);
  442.             utftDisplay.print("    ",80,225);
  443.             stopFlag = false;
  444.           }
  445.           else
  446.           {
  447.             utftDisplay.print("    ",80,225);
  448.             Inflight = ReadEEPROMValue(EEPROMInflightLocation);
  449.           }
  450.           inpution = false;
  451.         }
  452.         break;      
  453.       case '*':
  454.         if (inpution ==false)
  455.         {
  456.           utftDisplay.setFont(BigFont);
  457.           utftDisplay.setColor(255, 0, 127);
  458.           utftDisplay.print("   ",80,205);
  459.           ResetInputBuffer();
  460.           UserEntry = 0;
  461.           UserEntryStarted = true;
  462.           UserEntryFinished = false;
  463.         }      
  464.         break;
  465.       case '0':
  466.       case '1':
  467.       case '2':
  468.       case '3':
  469.       case '4':
  470.       case '5':
  471.       case '6':
  472.       case '7':
  473.       case '8':
  474.       case '9':
  475.         if (bufPtr < maxDegreeDigits)
  476.         {
  477.           KeyEntries[bufPtr] = key;
  478.           bufPtr++;          
  479.           UserEntry = atol (KeyEntries);
  480.           utftDisplay.setFont(BigFont);
  481.           utftDisplay.setColor(255, 0, 127);
  482.           if (UserEntryStarted == true)
  483.           {
  484.             utftDisplay.printNumI(UserEntry,80,205);
  485.           }
  486.           if (InflightEntryStarted == true)
  487.           {
  488.             utftDisplay.printNumI(UserEntry,80,225);
  489.           }
  490.         }
  491.         break;  
  492.       }
  493.       break;
  494.     }
  495.   }
  496. }
  497.  
  498. void DisplayUserEntry(int x, int y, String userData)
  499. {
  500.   utftDisplay.setColor(RED);
  501.   utftDisplay.setFont(BigFont);
  502.   utftDisplay.print(userData,x,y);
  503. }
  504.  
  505. void DrawArrow(int x2, int y2, int x1, int y1, int arrowLength, int arrowWidth)
  506. {
  507.   float distance;
  508.   int dx, dy, x2Outer,y2Outer,x3,y3,x4,y4,k;
  509.   distance = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
  510.   dx = x2 + (x1 - x2) * arrowLength / distance;
  511.   dy = y2 + (y1 - y2) * arrowLength / distance;
  512.   k = arrowWidth / arrowLength;
  513.   x2Outer = x2 - dx;
  514.   y2Outer = dy - y2;
  515.   x3 = y2Outer * k + dx;
  516.   y3 = x2Outer * k + dy;
  517.   x4 = dx - y2Outer * k;
  518.   y4 = dy - x2Outer * k;
  519.   utftDisplay.drawLine(x1, y1, x2, y2);
  520.   utftDisplay.drawLine(x1, y1, dx, dy);
  521.   utftDisplay.drawLine(x3, y3, x4, y4);
  522.   utftDisplay.drawLine(x3, y3, x2, y2);
  523.   utftDisplay.drawLine(x2, y2, x4, y4);
  524. }
  525.  
  526. void DrawRotatorPosition()
  527. {
  528.   int dxOuter, dyOuter, dxi, dyi;
  529.   utftDisplay.setColor(255, 128, 0);
  530.   utftDisplay.drawCircle(centreX,centreY,diameter);  // Draw compass circle
  531.   for (float i = 0; i <360; i = i + 22.5) {
  532.     utftDisplay.setColor(255, 128, 0);
  533.     dxOuter = diameter * cos((i-90)*3.14/180);
  534.     dyOuter = diameter * sin((i-90)*3.14/180);
  535.     dxi = dxOuter * 0.98;
  536.     dyi = dyOuter * 0.98;
  537.     utftDisplay.drawLine(dxi+centreX,dyi+centreY,dxOuter+centreX,dyOuter+centreY);
  538.   }
  539.   DisplayUserEntry((centreX-8),(centreY-157),"N");
  540.   DisplayUserEntry((centreX-8),(centreY+145),"S");
  541.   DisplayUserEntry((centreX+141),(centreY-7),"E");
  542.   DisplayUserEntry((centreX-160),(centreY-7),"W");
  543. }
  544.  
  545. void ResetInputBuffer()
  546. {
  547.   int length = sizeof(KeyEntries);
  548.   for (int i = 0; i < length; i++)
  549.   {
  550.     KeyEntries[i] = '\0';
  551.   }
  552.   bufPtr = 0;
  553. }
  554.  
  555. //Reads and returns the stored value specified in the EEPROM Start Address
  556. long ReadEEPROMValue(int16_t EEPROMStartAddress)
  557. {
  558.   volatile EEPROMValue eepromVal;
  559.   eepromVal.Byte1 = EEPROM.read(EEPROMStartAddress);
  560.   eepromVal.Byte2 = EEPROM.read(EEPROMStartAddress+1);
  561.   eepromVal.Byte3 = EEPROM.read(EEPROMStartAddress+2);
  562.   eepromVal.Byte4 = EEPROM.read(EEPROMStartAddress+3);
  563.   return eepromVal.Value;
  564. }
  565. /*Stores the specified value in the EEPROM   Start Address
  566.  EEPROM Write will only happens when the stored value and new value are different.
  567.  This will save the number of Writes to the EEPROM.*/
  568. void SaveEEPROMValue(int16_t EEPROMStartAddress, long Value)
  569. {
  570.   volatile EEPROMValue eepromVal;
  571.   eepromVal.Value = ReadEEPROMValue(EEPROMStartAddress);
  572.   if(eepromVal.Value != Value)
  573.   {
  574.     eepromVal.Value = Value;
  575.     EEPROM.write(EEPROMStartAddress,eepromVal.Byte1);
  576.     EEPROM.write(EEPROMStartAddress+1,eepromVal.Byte2);
  577.     EEPROM.write(EEPROMStartAddress+2,eepromVal.Byte3);
  578.     EEPROM.write(EEPROMStartAddress+3,eepromVal.Byte4);
  579.   }
  580. }
]
(#) Kovidivi válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Én akár unsigned long long-ot is használok, ha kell. 8 byte-ot foglal el, viszont így 2-a 64-en a maximum szám értéke! 1.8446744073709551616e+19 Ahova ez nem elég, ott gond van. Lehet venni signednek, ekkor a fele lesz. Szinte mindenre elég. A float-nál előfordul, hogy egy óriási számot növelsz kis lépésekben, és nem történik semmi!
(#) benjami válasza berkesandor hozzászólására (») Feb 1, 2019 /
 
Csináltam Libreoffice calc-ban egy kis float szám megjelenítőt, lehet vele játszani (Excel formátumban mentettem, hogy azzal is betölthető legyen). A sárga mezőkbe lehet bevinni a float értékeit.
(#) trickentrack hozzászólása Feb 2, 2019 /
 
Üdv!

Megkaptam Kovács Gábortól a "Ki mit épített?" topicban általa közzétett USB Teszter kapcsolását.
Ezúton is köszönöm neki!
Ő egy Arduino Pro Minivel készetette el. Én a méret miatt egy panelen szeretném elkészíteni.
Szerintetek így működőképes lenne? Nem csináltam még ilyet!

Előre is köszönöm!
(#) eSDi válasza trickentrack hozzászólására (») Feb 2, 2019 /
 
Hali!

Nem tudom, hogy a Pro Mini-n milyen kontroller van, de ha nem belső oszcillátorról megy, akkor kell mellé egy kvarc is két kondival. A panel jónak tűnik. A GND ágban elhelyezett sönttel én nem értek egyet, de az az én bajom. Így egyszerűbb, az biztos.
(#) eSDi válasza trickentrack hozzászólására (») Feb 2, 2019 /
 
Megtaláltam, Mega 328-as. Bővebben: Link
(#) trickentrack válasza eSDi hozzászólására (») Feb 2, 2019 /
 
A kvarc és a 2db 22pF os kondi ott van a 328 as bal sarkánál.
(#) eSDi válasza trickentrack hozzászólására (») Feb 2, 2019 /
 
Ja, már látom. Felrakhattad volna a te kapcsolási rajzodat is kép formában. Nem mindenki használ sprint layout-ot.
A hozzászólás módosítva: Feb 2, 2019
(#) trickentrack válasza eSDi hozzászólására (») Feb 2, 2019 / 1
 
Ez alapján készítettem. Egyedül a 47µF os kondenzátort hagytam ki.

29.png
    
Következő: »»   510 / 854
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem