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   190 / 853
(#) sunside válasza Medve hozzászólására (») Feb 9, 2016 /
 
Akkor a bekeretezett rész elég lesz?

mega328.jpg
    
(#) kegyetlen19 válasza sunside hozzászólására (») Feb 9, 2016 /
 
(#) sunside válasza kegyetlen19 hozzászólására (») Feb 9, 2016 /
 
Kössz az ötletet.
(#) morgo válasza sunside hozzászólására (») Feb 9, 2016 /
 
Szia!
Alkalmazásfüggő a dolog. Nem minden esetben kell a kvarc, de a biztosítékbitekre figyelni kell!
(#) GPeti1977 hozzászólása Feb 10, 2016 /
 
Szeretnék segítséget kérni, a C programozás alapjai mennek de a strukúrálás vagy minek nevezzem az még nem.
Építettem egy LiPo akku tesztert mely méri a cellák belső ellenállását, az A/D átalakítója MCP3208, mivel nem túl szabványos SPI protokolja van így az arduino.cc oldalról letöltöttem egy demót hogyan kell használni. A készülék sikerült mér is de azt szeretném hogy az a rész ami az MCP3208-at kezeli egy külön .cpp és .h file-ba legyen, na ennek nem értem a mikéntjét, olyanz már írtam amiben volt egy config.h hogy ne kelljen beállításkor bogarászni a sorok között.
Szóval ez a program:

  1. #include <LiquidCrystal.h>
  2. #include <EEPROM.h>
  3. //#include "MCP3208.h"
  4. #define SELPIN 10
  5. #define DATAOUT 11
  6. #define DATAIN 12
  7. #define SPICLOCK 13
  8. #define LOAD1 2
  9. #define LOAD2 3
  10. #define BTN A5
  11. //kalibracios ertekek:
  12. const float vref = 2.750;
  13. const float cal1 = 1.0038;
  14. const float cal2 = 1.00072;
  15. const float cal3 = 1.0078;
  16. const float cal4 = 0.9902;
  17. const float cal5 = 1.01297;
  18. const float cal6 = 0.9951;
  19.  
  20. //Cella feszultseg:
  21. float c1;
  22. float c2;
  23. float c3;
  24. float c4;
  25. float c5;
  26. float c6;
  27.  
  28. //Terhelt cella feszultseg:
  29. float c1l;
  30. float c2l;
  31. float c3l;
  32. float c4l;
  33. float c5l;
  34. float c6l;
  35.  
  36. //Nyers nem terhelt cella ertekek:
  37. float readvalue1;
  38. float readvalue2;
  39. float readvalue3;
  40. float readvalue4;
  41. float readvalue5;
  42. float readvalue6;
  43.  
  44. //Nyers terhelt cella ertekek:
  45. float readvalue1l;
  46. float readvalue2l;
  47. float readvalue3l;
  48. float readvalue4l;
  49. float readvalue5l;
  50. float readvalue6l;
  51.  
  52. // Terhelo ellenallas: 1  Ohm
  53. float r;
  54. // Szamitott cella belso ellenallasok:
  55. float r1;
  56. float r2;
  57. float r3;
  58. float r4;
  59. float r5;
  60. float r6;
  61. // Ossz ellenallas:
  62. float rsum;
  63. //Szamitott terhelo aram:
  64. float current;
  65. //Akku fesz:
  66. float vsum=0;
  67.  
  68. //Gombhoz kell:
  69. boolean bt;
  70. //Valtozott a cella szam:
  71. boolean change = false;
  72. // A gomb ertekenek beolvasasa:
  73. int val;
  74. // Cellak szama:
  75. byte n = 3;
  76.  
  77. LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
  78.  
  79. void setup() {
  80.  
  81.  // LCD RS pin to digital pin 4
  82.  // LCD Enable pin to digital pin 5
  83.  // LCD D4 pin to digital pin 6
  84.  // LCD D5 pin to digital pin 7
  85.  // LCD D6 pin to digital pin 8
  86.  // LCD D7 pin to digital pin 9
  87.  
  88.  //MCP3208 SPI port:
  89.   pinMode(SELPIN, OUTPUT);
  90.   pinMode(DATAOUT, OUTPUT);
  91.   pinMode(DATAIN, INPUT);
  92.   pinMode(SPICLOCK, OUTPUT);
  93.   //Terhelo ellenallas FET bekapcsolasa:
  94.   pinMode(LOAD1, OUTPUT);
  95.   pinMode(LOAD2, OUTPUT);
  96.   //
  97.   pinMode(BTN, INPUT);
  98.   digitalWrite(SELPIN, HIGH);
  99.   digitalWrite(DATAOUT, LOW);
  100.   digitalWrite(SPICLOCK, LOW);
  101.   digitalWrite(LOAD1, LOW);
  102.   digitalWrite(LOAD2, LOW);
  103.   Serial.begin(115200);
  104.   Serial.println("LiPo Tester");  
  105.   Serial.println();
  106.  
  107.   lcd.begin(20, 4);
  108.  
  109.   n = EEPROM.read(0);
  110.   if (n>6) {
  111.     n=6;
  112.     EEPROM.write(0, n);  
  113.   }
  114.  
  115.   lcd.setCursor(0, 1);
  116.   lcd.print("   Battery Tester   ");
  117.   lcd.setCursor(0, 2);
  118.   lcd.print("Cell number ? ");
  119.   lcd.print(n, DEC);
  120.  
  121.   for(int j=0; j<3000; j++) {
  122.   delay(1);
  123.   val = digitalRead(BTN);
  124.   if (val==0) {
  125.     change = true;
  126.     j=0;
  127.     n++;
  128.     if(n>6) n=3;
  129.     lcd.setCursor(0, 2);
  130.     lcd.print("Cell number ? ");
  131.     lcd.print(n, DEC);
  132.    
  133.     delay(250);  
  134.   }        
  135.   }
  136.     if (change== true) EEPROM.write(0, n);
  137.     lcd.setCursor(0, 2);
  138.     lcd.print("                   ");
  139. }
  140. //****************************************************Ezt kellene atvinni a cpp-be.
  141. int read_adc(int channel) {
  142.   int adcvalue = 0;
  143.   byte commandbits = B11000000;
  144.   commandbits|=((channel-1)<<3);
  145.   digitalWrite(SELPIN, LOW);
  146.   for (int i=7; i>=3; i--) {
  147.     digitalWrite(DATAOUT, commandbits & 1<<i);
  148.     digitalWrite(SPICLOCK, HIGH);
  149.     digitalWrite(SPICLOCK, LOW);
  150.     }
  151.    
  152.     digitalWrite(SPICLOCK, HIGH);
  153.     digitalWrite(SPICLOCK, LOW);
  154.     digitalWrite(SPICLOCK, HIGH);
  155.     digitalWrite(SPICLOCK, LOW);
  156.    
  157.     for (int i=11; i>=0; i--) {
  158.       adcvalue += digitalRead(DATAIN)<<i;
  159.       digitalWrite(SPICLOCK, HIGH);
  160.       digitalWrite(SPICLOCK, LOW);
  161.       }
  162.       digitalWrite(SELPIN, HIGH);
  163.       return adcvalue;
  164.       }
  165. //****************************************************
  166.  
  167. void loop() {
  168.  
  169.   val = digitalRead(BTN);
  170.  
  171.   if(val==1) bt=true;
  172.   delay(10);
  173.   if(val==0 && bt==true) delay(10);
  174.   if(val==0 && bt==true) {
  175.   bt=false;  
  176.   Serial.println("Start Test");
  177.   Serial.println("No Load");
  178.  
  179.   digitalWrite(LOAD1, LOW);
  180.   digitalWrite(LOAD2, LOW);
  181.  
  182.   delay(100);
  183.  
  184.   readvalue1 = read_adc(7);
  185.   Serial.println(readvalue1, DEC);
  186.  
  187.   readvalue2 = read_adc(6);
  188.   Serial.println(readvalue2, DEC);
  189.  
  190.   readvalue3 = read_adc(5);
  191.   Serial.println(readvalue3, DEC);
  192.  
  193.   if (n >= 4) {
  194.   readvalue4 = read_adc(4);
  195.   Serial.println(readvalue4, DEC);
  196.   }
  197.  
  198.   if (n >=5) {
  199.   readvalue5 = read_adc(3);
  200.   Serial.println(readvalue5, DEC);
  201.   }
  202.  
  203.   if (n>=6) {
  204.   readvalue6 = read_adc(2);
  205.   Serial.println(readvalue6, DEC);
  206.   }
  207.  
  208.   Serial.println();
  209.   Serial.println("Load ON");
  210.  
  211.   digitalWrite(LOAD1, HIGH);
  212.   //if (readvalue4 < 100) {
  213.     digitalWrite(LOAD2, HIGH);
  214.     r = 1;
  215.   //}
  216.   //else {
  217.    // r = 2;
  218.   //}
  219.  
  220.   delay(100);
  221.      
  222.   readvalue1l = read_adc(7);
  223.   Serial.println(readvalue1l, DEC);
  224.  
  225.   readvalue2l = read_adc(6);
  226.   Serial.println(readvalue2l, DEC);
  227.  
  228.   readvalue3l = read_adc(5);
  229.   Serial.println(readvalue3l, DEC);
  230.  
  231.   if (n>=4) {
  232.   readvalue4l = read_adc(4);
  233.   Serial.println(readvalue4l, DEC);
  234.   }
  235.  
  236.   if (n>=5) {
  237.   readvalue5l = read_adc(3);
  238.   Serial.println(readvalue5l, DEC);
  239.   }
  240.  
  241.   if (n>=6) {
  242.   readvalue6l = read_adc(2);
  243.   Serial.println(readvalue6l, DEC);
  244.   }
  245.  
  246.   Serial.println();
  247.  
  248.   digitalWrite(LOAD1, LOW);
  249.   digitalWrite(LOAD2, LOW);
  250.   Serial.println("Load OFF");
  251.   Serial.println("Stop Test");
  252.   Serial.println();
  253.   Serial.println();
  254.  
  255.   c4 = 0;
  256.   c5 = 0;
  257.   c6 = 0;
  258.   c1 = (((( readvalue1)/4096)*vref)*((5600+620)/620))*cal1;
  259.   c2 = (((( readvalue2-readvalue1)/4096)*vref)*((5600+620)/620))*cal2;
  260.   c3 = (((( readvalue3-readvalue2)/4096)*vref)*((5600+620)/620))*cal3;
  261.   if (n>=4) c4 = (((( readvalue4-readvalue3)/4096)*vref)*((5600+620)/620))*cal4;
  262.   if (n>=5) c5 = (((( readvalue5-readvalue4)/4096)*vref)*((5600+620)/620))*cal5;
  263.   if (n>=6) c6 = (((( readvalue6-readvalue5)/4096)*vref)*((5600+620)/620))*cal6;
  264.   vsum = c1+c2+c3+c4+c5+c6;
  265.  
  266.   c4l = 0;
  267.   c5l = 0;
  268.   c6l = 0;
  269.   c1l = (((( readvalue1l)/4096)*vref)*((5600+620)/620))*cal1;
  270.   c2l = (((( readvalue2l-readvalue1l)/4096)*vref)*((5600+620)/620))*cal2;
  271.   c3l = (((( readvalue3l-readvalue2l)/4096)*vref)*((5600+620)/620))*cal3;
  272.   if (n>=4) c4l = (((( readvalue4l-readvalue3l)/4096)*vref)*((5600+620)/620))*cal4;
  273.   if (n>=5) c5l = (((( readvalue5l-readvalue4l)/4096)*vref)*((5600+620)/620))*cal5;
  274.   if (n>=6) c6l = (((( readvalue6l-readvalue5l)/4096)*vref)*((5600+620)/620))*cal6;
  275.  
  276.   current = (c1l+c2l+c3l+c4l+c5l+c6l)/r;
  277.   r4 = 0;
  278.   r5 = 0;
  279.   r6 = 0;
  280.   r1 = ((c1-c1l)/current)*1000;
  281.   r2 = ((c2-c2l)/current)*1000;
  282.   r3 = ((c3-c3l)/current)*1000;
  283.   if (n>=4) r4 = ((c4-c4l)/current)*1000;
  284.   if (n>=5) r5 = ((c5-c5l)/current)*1000;
  285.   if (n>=6) r6 = ((c6-c6l)/current)*1000;
  286.  
  287.   rsum = r1+r2+r3+r4+r5+r6;
  288.    
  289.    Serial.println(c1, 3);
  290.    Serial.println(c2, 3);
  291.    Serial.println(c3, 3);
  292.    Serial.println(c4, 3);
  293.    Serial.println(c5, 3);
  294.    Serial.println(c6, 3);
  295.    Serial.println();
  296.    Serial.println(c1l, 3);
  297.    Serial.println(c2l, 3);
  298.    Serial.println(c3l, 3);
  299.    Serial.println(c4l, 3);
  300.    Serial.println(c5l, 3);
  301.    Serial.println(c6l, 3);
  302.    Serial.println(r);
  303.    
  304.    Serial.print(r1);
  305.    Serial.println(" mOhm");
  306.    Serial.print(r2);
  307.    Serial.println(" mOhm");
  308.    Serial.print(r3);
  309.    Serial.println(" mOhm");
  310.    Serial.print(r4);
  311.    Serial.println(" mOhm");
  312.    Serial.print(r5);
  313.    Serial.println(" mOhm");
  314.    Serial.print(r6);
  315.    Serial.println(" mOhm");
  316.    Serial.print(rsum);
  317.    Serial.println(" mOhm SUM");
  318.    Serial.println();
  319.    lcd.clear();
  320.    lcd.setCursor(0, 0);
  321.    lcd.print(r1);
  322.    lcd.print(" m ");
  323.    lcd.print(r2);
  324.    lcd.print(" m ");
  325.    
  326.    lcd.setCursor(0, 1);
  327.    lcd.print(r3);
  328.    lcd.print(" m ");
  329.    if (n>=4) lcd.print(r4);
  330.    if (n>=4) lcd.print(" m ");
  331.    
  332.    lcd.setCursor(0, 2);
  333.    if (n>=5) lcd.print(r5);
  334.    if (n>=5) lcd.print(" m ");
  335.    if (n>=6)lcd.print(r6);
  336.    if (n>=6)lcd.print(" m ");
  337.    
  338.    lcd.setCursor(0, 3);
  339.    lcd.print("SUM");
  340.    lcd.print(rsum);
  341.    lcd.print ("mOhm ");
  342.    lcd.print(vsum);
  343.    lcd.print("V");  
  344.   }
  345.  
  346. }


Leírtam benne mit kellene átrakni.
Ez lenne az MCP3208.cpp egyenlőre még minden ki van kommentelve:
  1. //#include "MCP3208.h"
  2. /*
  3. int read_adc(int channel) {
  4.   int adcvalue = 0;
  5.   byte commandbits = B11000000;
  6.   commandbits|=((channel-1)<<3);
  7.   digitalWrite(SELPIN, LOW);
  8.   for (int i=7; i>=3; i--) {
  9.     digitalWrite(DATAOUT, commandbits & 1<<i);
  10.     digitalWrite(SPICLOCK, HIGH);
  11.     digitalWrite(SPICLOCK, LOW);
  12.     }
  13.    
  14.     digitalWrite(SPICLOCK, HIGH);
  15.     digitalWrite(SPICLOCK, LOW);
  16.     digitalWrite(SPICLOCK, HIGH);
  17.     digitalWrite(SPICLOCK, LOW);
  18.    
  19.     for (int i=11; i>=0; i--) {
  20.       adcvalue += digitalRead(DATAIN)<<i;
  21.       digitalWrite(SPICLOCK, HIGH);
  22.       digitalWrite(SPICLOCK, LOW);
  23.       }
  24.       digitalWrite(SELPIN, HIGH);
  25.       return adcvalue;
  26.       }
  27.      
  28.       */


Ez pedig az MCP3208.h:

  1. #ifndef _MCP3208_H_
  2. #define _MCP3208_H_
  3.  
  4.  
  5.  
  6.  
  7. #endif
(#) Balázs válasza GPeti1977 hozzászólására (») Feb 10, 2016 / 1
 
A fejlécfájlba (.h) mennek a deklarációk, a forrásfájlba (.cpp) a definíciók. Ez utóbbi már kész van, csak a kommentet kell kiszedni. A fejlécfájl tartalma pedig:
  1. #ifndef _MCP3208_H_
  2. #define _MCP3208_H_
  3.  
  4. int read_adc(int channel);
  5.  
  6. #endif

Ezután a főprogramból kiszedheted az átvitt részt (és persze az elején include-olni kell az MCP3208.h-t).

Pár szabály, amivel úgy látom, tisztában vagy, de a teljesség kedvéért leírom: Csak fejlécfájlt include-olunk, forrásfájlt soha. Gyári könyvtárakkal ellentétben a saját fájlokat idézőjelek, nem kacsacsőrök között include-olunk. Minden fejlécfájlba kellenek az #ifndef ... #define ... direktívák, mert különben fennáll a veszélye, hogy több helyre is bemásolódik, és merőrül a linker. Ha olyan globális változót szeretnél használni, amely nem csak az MCP3208.cpp-ben látszik, hanem mindenhol, ahová az MCP3208.h fájlt include-olták, akkor a fejlécfájlban az extern kulcsszóval tudod bejelenteni (bővebben).

Ha már strukturáljuk a kódot, akkor én átvinném a szoftveres SPI beállításával kapcsolatos dolgokat is (4-7., 88-92. és 98-100. sorok). Például lehetne egy init_adc() nevű függvény, és azt hívnám meg a setupban.
(#) GPeti1977 válasza Balázs hozzászólására (») Feb 10, 2016 /
 
Még nem minden világos, így írtam át a .h fájlt:
  1. #ifndef _MCP3208_H_
  2. #define _MCP3208_H_
  3. int read_adc(int channel);
  4. byte commandbits = B11000000;
  5. #define SELPIN 10
  6. #define DATAOUT 11
  7. #define DATAIN 12
  8. #define SPICLOCK 13
  9.  
  10. #endif


A következő a hiba:
In file included from LiPo.cpp:3:
MCP3208.h:3: error: 'byte' does not name a type
(#) Balázs válasza GPeti1977 hozzászólására (») Feb 10, 2016 /
 
Ennek az az oka, hogy a byte nem standard C típus. Ha ilyen "arduinós" dolgokat akarsz ott használni, akkor a .h fájl elejére:
  1. #include <Arduino.h>

Viszont nem fogadtad meg, amit a globális változókról írtam. Ha a commandbits változót csak az MCP3208.cpp fájlban szeretnéd használni, akkor ott definiáld, a fejlécben ne! Ha szeretnéd, hogy kívülről is látsszon, akkor a fejlécben:
  1. extern byte commandbits;

A forrásfájlban pedig:
  1. byte commandbits = B11000000;
A hozzászólás módosítva: Feb 10, 2016
(#) GPeti1977 válasza Balázs hozzászólására (») Feb 10, 2016 /
 
A byte -ot megoldottam unsigned char -ral, a B11000000 -ot 0b1100000 -tal, így ez jó már.
Az MCP3208.cpp -be kellett beleírni az arduino.h-t mert még a digitalWrite sem értette.

Még mindig sok sötét folt van, csak sorolom:
public: , class , :: jel stb.
A hozzászólás módosítva: Feb 10, 2016
(#) Balázs válasza GPeti1977 hozzászólására (») Feb 10, 2016 /
 
Ezek C++ alapfogalmak, úgyhogy szerintem C++ online tutorialokat olvasgass. Illetve ez egy kiváló könyv, tudom ajánlani. Röviden:

Az osztály (class) az objektumorientált programozás alapköve. Olyan, mint az ANSI C-ben megszokott struktúra, csak a tagjai lehetnek függvények is. Például amikor azt mondod, hogy
  1. SoftwareSerial mySerial(10,11);

akkor valójában a SoftwareSerial osztályt példányosítod mySerial néven. Ezután meg tudod hívni a tagfüggvényeit (például mySerial.available()). A public és a private kulcsszavak egy osztály tagjainak a láthatóságát módosítják. A public függvényekhez és változókhoz hozzá lehet férni kívülről (pl. a SoftwareSerial osztály available() függvénye ilyen), a private tagokat viszont csak az osztály saját tagfüggvényei tudják elérni. A :: (scope resolution operator) kicsit bonyolultabb, most csak egy példát mondok rá. Alapesetben egy osztály tagfüggvényei és tagváltozói csak példányonként léteznek, viszont bizonyos (ún. statikus) tagok önmagukban is értelmesek. Ezekre példányosítás nélkül is lehet hivatkozni, így: ValamiOsztaly::StatikusFuggveny().
(#) GPeti1977 válasza Balázs hozzászólására (») Feb 10, 2016 / 1
 
Szerintem ezek már olyan dolgok amit iskolában lehet csak rendesen megtanulni. Sajnos én ipari elektronikai technikusként tanultam de a mai világban nem sokat ér az hogy tudom mi B osztályú erősítő, az általánosban basic es Videoton gépek voltak ezért is szeretek ma is abban programozni (BASCOM), középiskolában pascal volt egy évig.
Ahová jártam ott voltak programozó évfolyamtársak, bele is olvasgattam a C könyvükbe, persze amikor odaértem hogy I= I+1 helyett I++ van le is tettem a könyvet hogy na ekkora baromságot, pedig nem kellett volna, azt is furcsállom hogy a C ben van sok olyan matematikai formula amit sehol nem tanultunk általános matematika szintjén.
(#) icserny válasza GPeti1977 hozzászólására (») Feb 10, 2016 /
 
Mi az ördögnek ehhez iskola? Idő, elszántság, érdeklődés és egy-két jó könyv kell hozzá - meg rengeteg mintapélda.

C könyv
C++ könyv
(#) erik001 hozzászólása Feb 11, 2016 /
 
Sziasztok.
Valaki tudna segíteni? Azt jelzi hogy feltölti de valószínű hogy nem mert ha kilépek programból meg vissza akkor ugyan úgy üres. Mitől lehet ?
Mert már több órája próbálkozok de ugyan úgy semmi

arduino.jpg
    
(#) Balázs válasza erik001 hozzászólására (») Feb 11, 2016 /
 
Nem teljesen értem a kérdést... pontosan mi üres?
(#) erik001 válasza Balázs hozzászólására (») Feb 11, 2016 /
 
Már semmi gond működik rendesen.
Annyi kérdésem lenne hogy amit feltöltök rá azt hogy tudom megnézni ha kihúzom meg vissza dugom hogy mi van az arduino-n rajta ?
(#) KBal76 válasza erik001 hozzászólására (») Feb 11, 2016 /
 
Azt nem tudod megnézni, feltöltéskor visszaellenőrzi és kiírja hogy sikerült. Utána az benne van ameddig mással felül nem írod.
(#) erik001 válasza KBal76 hozzászólására (») Feb 11, 2016 /
 
Értem Köszönöm a segítséget. Csak pár hónapja kezdtem bele és nem tiszta minden.
Magyar oldalakon meg nem nagyon találok róla semmit hogy minek hogy kel pontosan lenni.
PIC-nél is ugyan ez a helyzet ami rá van írva azt nem tudom megnézni csak max újra ráírni valamit ?
(#) KBal76 válasza erik001 hozzászólására (») Feb 11, 2016 /
 
Az attól függ. Ha le van zárva (írásvédelem) akkor nem olvasod vissza sehogy.
Visszaolvasni olyannak ahogyan beleírtad sose fogod (tehát kommentek, változónevek, stb), mert a programot a fordító átfordítja gépi-kódra, tehát amit most (vagyis akkor látsz amikor feltöltötted) nem fogsz többet. A visszatöltött kódot viszont (ha nincs levédve) letöltheted és egy másik ugyanolyan PIC-be kiírhatod, másolhatod magyarán. De egy eladásra szánt elektronikába levédik, mert senkinek nem hiányzik hogy másolják a termékét.
Ezt úgy képzeld el, mint most ha belenéznél egy .exe programfájlba, akkor abban is csak "zagyvaságot" látsz, és gondolhatod hogy a program írója nem ezt látta. De ez a zagyvaság a számítógép számára pont érthetô.
A hozzászólás módosítva: Feb 11, 2016
(#) RoliNyh válasza KBal76 hozzászólására (») Feb 11, 2016 /
 
Erről az jutott eszembe, nem létezik az arduino gépi kódra disassembler?
(#) KBal76 válasza RoliNyh hozzászólására (») Feb 11, 2016 /
 
Szinte minden processzorra létezhet disassembler (az Arduino pedig nem processzor, csak egy fejlesztôi platform). De a disassemblerel nem az eredeti állapotot állítod vissza, hanem egy olyant, ami (legjobb esetben) újra átfordítható kódot ad (de mivel a változók nevei és a kommentek elvesztek, illetve a program struktúrája is (a fordító programok optimalizálják a kódot) nehéz lesz megérteni hol/mit/miért csinál a kód.
(#) RoliNyh válasza KBal76 hozzászólására (») Feb 11, 2016 /
 
Persze, hogy elvesznek a megjegyzések, ami nincs benne, azt nem is lehet disassemblálni...
De hogy a változó neveket is átszerkeszti azt nem tudtam...
(#) KBal76 válasza RoliNyh hozzászólására (») Feb 11, 2016 /
 
Változó nevek csak neked kellenek, valóságban azok csak a proci memóriájának egy-egy kis szegmensei, azok a gépi-kódban csak a memóriacímet tartalmazzák. Ugyanígy a függvények helyett is csak a programtár egy pontjára utaló szám lesz (ugrási cím). Vagy az sem, csak relatív cím (pl. táblázat).
A hozzászólás módosítva: Feb 11, 2016
(#) erdeidominik1999 hozzászólása Feb 12, 2016 /
 
Sziasztok! Az lenne a kérdésem, hogy egy ilyen programozó jó nanóhoz, unohoz, és megához is? Illetve esetleg due-vel működhet? Előre is köszi!
(#) Tibicsek válasza erdeidominik1999 hozzászólására (») Feb 12, 2016 /
 
Minek programozó az arduinok alapból tartalmazzák a programozót annyi az egész, hogy feltelepíted az arduino programot usb-vel csatlakoztatod az arduinot és már programozhatsz is
(#) morgo válasza erdeidominik1999 hozzászólására (») Feb 12, 2016 /
 
Az Arduino bootloadert tartalmaz, ezért nem kell külső programozó. Ez soros porton keresztül betölti a programot. Az általad felsorolt lapokon van USB-soros konverter, ezért csak egy USB kábelre van szükséged.
(#) Kovidivi válasza erdeidominik1999 hozzászólására (») Feb 12, 2016 /
 
Használhatsz egy Arduinot is programozónak. Feltöltöd rá az Arduino as ISP programmer sketch-et, utána már mint normál programozó működik. Neten utána tudsz nézni ennek, hogy is működik.
(#) erdeidominik1999 válasza Kovidivi hozzászólására (») Feb 12, 2016 /
 
Köszi, utána nézek, azért kell, mert van 2 ardum, aminek rossz a soros konvertere, de maga a lap jó, és nem akarom kidobni.
(#) atus1981 hozzászólása Feb 12, 2016 /
 
Sziasztok!
Van ez a kód, amihez meg is csináltam a hardvert, működik szépen.
Viszont az a kérdésem, hogy hogyan tudnék más adatokat is kinyerni az autóból?
Ez a program most alap dolgokat ír a kijelzőre, de én kíváncsi lennék például a gázpedál állására és a szívócső nyomására is.
Ebben kérném valaki segítségét.
Köszi.
  1. /*
  2. Arduino Nano OBD reader (OBD protocol KW1281,  Audi A4 B5 etc.)
  3.  
  4. wiring:
  5. D2 --- OBD level shifter input (RX) (e.g. LM339)
  6. D3 --- OBD level shifter output (TX) (e.g. LM339)
  7. A5 --- Arduino 20x4 LCD display SCL
  8. A4 --- Arduino 20x4 LCD display SDA
  9.  
  10. NOTE: For the level shifting, I used a 'AutoDia K409 Profi USB adapter', disassembled it,
  11.       and connected the Arduino to the level shifter chip (LM339) - the original FTDI chip TX line
  12.       was removed (so it does not influence the communication)                                                                                              
  13. */
  14.  
  15. #include <Wire.h>
  16. #include "LiquidCrystal_I2C.h"
  17. #include "NewSoftwareSerial.h"
  18. //#include <SoftwareSerial.h>
  19.  
  20.  
  21. //SoftwareSerial BTSerial(10, 11); // RX | TX
  22.  
  23. #define pinKLineRX 2
  24. #define pinKLineTX 3
  25. #define pinLED 13
  26. #define pinBuzzer 9
  27. #define pinButton 10
  28.  
  29.  
  30.  
  31. #define ADR_Engine 0x01
  32. #define ADR_Gears  0x02
  33. #define ADR_ABS_Brakes 0x03
  34. #define ADR_Airbag 0x15
  35. #define ADR_Dashboard 0x17
  36. #define ADR_Immobilizer 0x25
  37. #define ADR_Central_locking 0x35
  38.  
  39. //#define DEBUG 1
  40.  
  41. LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display
  42. NewSoftwareSerial obd(pinKLineRX, pinKLineTX, false); // RX, TX, inverse logic
  43.  
  44. uint8_t currAddr = 0;
  45. uint8_t blockCounter = 0;
  46. uint8_t errorTimeout = 0;
  47. uint8_t errorData = 0;
  48. bool connected = false;
  49. int sensorCounter = 0;
  50. int pageUpdateCounter = 0;
  51. int alarmCounter = 0;
  52.  
  53. uint8_t currPage = 1;
  54.  
  55.  
  56. int8_t coolantTemp = 0;
  57. int8_t oilTemp = 0;
  58. int8_t intakeAirTemp = 0;
  59. int8_t oilPressure = 0;
  60. float engineLoad = 0;
  61. int   engineSpeed = 0;
  62. float throttleValve = 0;
  63. float supplyVoltage = 0;
  64. uint8_t vehicleSpeed = 0;
  65. uint8_t fuelConsumption = 0;
  66. uint8_t fuelLevel = 0;
  67. unsigned long odometer = 0;
  68.  
  69.  
  70. String floatToString(float v){
  71.   String res;
  72.   char buf[16];      
  73.   dtostrf(v,4, 2, buf);
  74.   res=String(buf);
  75.   return res;
  76. }
  77.  
  78. void disconnect(){
  79.   connected = false;
  80.   currAddr = 0;
  81. }
  82.  
  83. void lcdPrint(int x, int y, String s, int width = 0){
  84.   lcd.setCursor(x,y);
  85.   while (s.length() < width) s += " ";
  86.   lcd.print(s);
  87. }
  88.  
  89. void obdWrite(uint8_t data){
  90. #ifdef DEBUG
  91.   Serial.print("uC:");
  92.   Serial.println(data, HEX);
  93. #endif
  94.   obd.write(data);
  95. }
  96.  
  97. uint8_t obdRead(){
  98.   unsigned long timeout = millis() + 1000;  
  99.   while (!obd.available()){
  100.     if (millis() >= timeout) {
  101.       Serial.println(F("ERROR: obdRead timeout"));
  102.       disconnect();      
  103.       errorTimeout++;
  104.       return 0;
  105.     }
  106.   }
  107.   uint8_t data = obd.read();
  108. #ifdef DEBUG  
  109.   Serial.print("ECU:");
  110.   Serial.println(data, HEX);
  111. #endif  
  112.   return data;
  113. }
  114.  
  115. // 5Bd, 7O1
  116. void send5baud(uint8_t data){
  117.   // // 1 start bit, 7 data bits, 1 parity, 1 stop bit
  118.   #define bitcount 10
  119.   byte bits[bitcount];
  120.   byte even=1;
  121.   byte bit;
  122.   for (int i=0; i < bitcount; i++){
  123.     bit=0;
  124.     if (i == 0)  bit = 0;
  125.       else if (i == 8) bit = even; // computes parity bit
  126.       else if (i == 9) bit = 1;
  127.       else {
  128.         bit = (byte) ((data & (1 << (i-1))) != 0);
  129.         even = even ^ bit;
  130.       }
  131.     Serial.print(F("bit"));      
  132.     Serial.print(i);          
  133.     Serial.print(F("="));              
  134.     Serial.print(bit);
  135.     if (i == 0) Serial.print(F(" startbit"));
  136.       else if (i == 8) Serial.print(F(" parity"));    
  137.       else if (i == 9) Serial.print(F(" stopbit"));              
  138.     Serial.println();      
  139.     bits[i]=bit;
  140.   }
  141.   // now send bit stream    
  142.   for (int i=0; i < bitcount+1; i++){
  143.     if (i != 0){
  144.       // wait 200 ms (=5 baud), adjusted by latency correction
  145.       delay(200);
  146.       if (i == bitcount) break;
  147.     }
  148.     if (bits[i] == 1){
  149.       // high
  150.       digitalWrite(pinKLineTX, HIGH);
  151.     } else {
  152.       // low
  153.       digitalWrite(pinKLineTX, LOW);
  154.     }
  155.   }
  156.   obd.flush();
  157. }
  158.  
  159.  
  160. bool KWP5BaudInit(uint8_t addr){
  161.   Serial.println(F("---KWP 5 baud init"));
  162.   //delay(3000);
  163.   send5baud(addr);
  164.   return true;
  165. }
  166.  
  167.  
  168. bool KWPSendBlock(char *s, int size){
  169.   Serial.print(F("---KWPSend sz="));
  170.   Serial.print(size);
  171.   Serial.print(F(" blockCounter="));
  172.   Serial.println(blockCounter);    
  173.   // show data
  174.   Serial.print(F("OUT:"));
  175.   for (int i=0; i < size; i++){    
  176.     uint8_t data = s[i];
  177.     Serial.print(data, HEX);
  178.     Serial.print(" ");    
  179.   }  
  180.   Serial.println();
  181.   for (int i=0; i < size; i++){
  182.     uint8_t data = s[i];    
  183.     obdWrite(data);
  184.     /*uint8_t echo = obdRead();  
  185.     if (data != echo){
  186.       Serial.println(F("ERROR: invalid echo"));
  187.       disconnect();
  188.       errorData++;
  189.       return false;
  190.     }*/
  191.     if (i < size-1){
  192.       uint8_t complement = obdRead();        
  193.       if (complement != (data ^ 0xFF)){
  194.         Serial.println(F("ERROR: invalid complement"));
  195.         disconnect();
  196.         errorData++;
  197.         return false;
  198.       }
  199.     }
  200.   }
  201.   blockCounter++;
  202.   return true;
  203. }
  204.  
  205. // count: if zero given, first received byte contains block length
  206. // 4800, 9600 oder 10400 Baud, 8N1
  207. bool KWPReceiveBlock(char s[], int maxsize, int &size){  
  208.   bool ackeachbyte = false;
  209.   uint8_t data = 0;
  210.   int recvcount = 0;
  211.   if (size == 0) ackeachbyte = true;
  212.   Serial.print(F("---KWPReceive sz="));
  213.   Serial.print(size);
  214.   Serial.print(F(" blockCounter="));
  215.   Serial.println(blockCounter);
  216.   if (size > maxsize) {
  217.     Serial.println("ERROR: invalid maxsize");
  218.     return false;
  219.   }  
  220.   unsigned long timeout = millis() + 1000;  
  221.   while ((recvcount == 0) || (recvcount != size)) {
  222.     while (obd.available()){      
  223.       data = obdRead();
  224.       s[recvcount] = data;    
  225.       recvcount++;      
  226.       if ((size == 0) && (recvcount == 1)) {
  227.         size = data + 1;
  228.         if (size > maxsize) {
  229.           Serial.println("ERROR: invalid maxsize");
  230.           return false;
  231.         }  
  232.       }
  233.       if ((ackeachbyte) && (recvcount == 2)) {
  234.         if (data != blockCounter){
  235.           Serial.println(F("ERROR: invalid blockCounter"));
  236.           disconnect();
  237.           errorData++;
  238.           return false;
  239.         }
  240.       }
  241.       if ( ((!ackeachbyte) && (recvcount == size)) ||  ((ackeachbyte) && (recvcount < size)) ){
  242.         obdWrite(data ^ 0xFF);  // send complement ack        
  243.         /*uint8_t echo = obdRead();        
  244.         if (echo != (data ^ 0xFF)){
  245.           Serial.print(F("ERROR: invalid echo "));
  246.           Serial.println(echo, HEX);
  247.           disconnect();
  248.           errorData++;
  249.           return false;
  250.         }*/
  251.       }
  252.       timeout = millis() + 1000;        
  253.     }
  254.     if (millis() >= timeout){
  255.       Serial.println(F("ERROR: timeout"));
  256.       disconnect();
  257.       errorTimeout++;
  258.       return false;
  259.     }
  260.   }
  261.   // show data
  262.   Serial.print(F("IN: sz="));  
  263.   Serial.print(size);  
  264.   Serial.print(F(" data="));  
  265.   for (int i=0; i < size; i++){
  266.     uint8_t data = s[i];
  267.     Serial.print(data, HEX);
  268.     Serial.print(F(" "));    
  269.   }  
  270.   Serial.println();
  271.   blockCounter++;
  272.   return true;
  273. }
  274.  
  275. bool KWPSendAckBlock(){
  276.   Serial.print(F("---KWPSendAckBlock blockCounter="));
  277.   Serial.println(blockCounter);  
  278.   char buf[32];  
  279.   sprintf(buf, "\x03%c\x09\x03", blockCounter);  
  280.   return (KWPSendBlock(buf, 4));
  281. }
  282.  
  283. bool connect(uint8_t addr, int baudrate){  
  284.   Serial.print(F("------connect addr="));
  285.   Serial.print(addr);
  286.   Serial.print(F(" baud="));  
  287.   Serial.println(baudrate);  
  288.   tone(pinBuzzer, 1200);    
  289.   delay(100);
  290.   noTone(pinBuzzer);            
  291.   //lcd.clear();
  292.   lcdPrint(0,0, F("KW1281 wakeup"), 20);
  293.   lcdPrint(0,1, "", 20);
  294.   lcdPrint(0,2, "", 20);  
  295.   blockCounter = 0;  
  296.   currAddr = 0;
  297.   obd.begin(baudrate);      
  298.   KWP5BaudInit(addr);
  299.   // answer: 0x55, 0x01, 0x8A          
  300.   char s[3];
  301.   lcdPrint(0,0, F("KW1281 recv"), 20);
  302.   int size = 3;
  303.   if (!KWPReceiveBlock(s, 3, size)) return false;
  304.   if (    (((uint8_t)s[0]) != 0x55)
  305.      ||   (((uint8_t)s[1]) != 0x01)
  306.      ||   (((uint8_t)s[2]) != 0x8A)   ){
  307.     Serial.println(F("ERROR: invalid magic"));
  308.     disconnect();
  309.     errorData++;
  310.     return false;
  311.   }
  312.   currAddr = addr;
  313.   connected = true;  
  314.   if (!readConnectBlocks()) return false;
  315.   return true;
  316. }
  317.  
  318. bool readConnectBlocks(){  
  319.   // read connect blocks
  320.   Serial.println(F("------readconnectblocks"));
  321.   lcdPrint(0,0, F("KW1281 label"), 20);
  322.   String info;  
  323.   while (true){
  324.     int size = 0;
  325.     char s[64];
  326.     if (!(KWPReceiveBlock(s, 64, size))) return false;
  327.     if (size == 0) return false;
  328.     if (s[2] == '\x09') break;
  329.     if (s[2] != '\xF6') {
  330.       Serial.println(F("ERROR: unexpected answer"));
  331.       disconnect();
  332.       errorData++;
  333.       return false;
  334.     }
  335.     String text = String(s);
  336.     info += text.substring(3, size-2);
  337.     if (!KWPSendAckBlock()) return false;
  338.   }
  339.   Serial.print("label=");
  340.   Serial.println(info);
  341.   //lcd.setCursor(0, 1);
  342.   //lcd.print(info);      
  343.   return true;
  344. }
  345.  
  346. bool readSensors(int group){
  347.   Serial.print(F("------readSensors "));
  348.   Serial.println(group);
  349.   lcdPrint(0,0, F("KW1281 sensor"), 20);  
  350.   char s[64];
  351.   sprintf(s, "\x04%c\x29%c\x03", blockCounter, group);
  352.   if (!KWPSendBlock(s, 5)) return false;
  353.   int size = 0;
  354.   KWPReceiveBlock(s, 64, size);
  355.   if (s[2] != '\xe7') {
  356.     Serial.println(F("ERROR: invalid answer"));
  357.     disconnect();
  358.     errorData++;
  359.     return false;
  360.   }
  361.   int count = (size-4) / 3;
  362.   Serial.print(F("count="));
  363.   Serial.println(count);
  364.   for (int idx=0; idx < count; idx++){
  365.     byte k=s[3 + idx*3];
  366.     byte a=s[3 + idx*3+1];
  367.     byte b=s[3 + idx*3+2];
  368.     String n;
  369.     float v = 0;
  370.     Serial.print(F("type="));
  371.     Serial.print(k);
  372.     Serial.print(F("  a="));
  373.     Serial.print(a);
  374.     Serial.print(F("  b="));
  375.     Serial.print(b);
  376.     Serial.print(F("  text="));
  377.     String t = "";
  378.     String units = "";
  379.     char buf[32];    
  380.     switch (k){
  381.       case 1:  v=0.2*a*b;             units=F("rpm"); break;
  382.       case 2:  v=a*0.002*b;           units=F("%%"); break;
  383.       case 3:  v=0.002*a*b;           units=F("Deg"); break;
  384.       case 4:  v=abs(b-127)*0.01*a;   units=F("ATDC"); break;
  385.       case 5:  v=a*(b-100)*0.1;       units=F("°C");break;
  386.       case 6:  v=0.001*a*b;           units=F("V");break;
  387.       case 7:  v=0.01*a*b;            units=F("km/h");break;
  388.       case 8:  v=0.1*a*b;             units=F(" ");break;
  389.       case 9:  v=(b-127)*0.02*a;      units=F("Deg");break;
  390.       case 10: if (b == 0) t=F("COLD"); else t=F("WARM");break;
  391.       case 11: v=0.0001*a*(b-128)+1;  units = F(" ");break;
  392.       case 12: v=0.001*a*b;           units =F("Ohm");break;
  393.       case 13: v=(b-127)*0.001*a;     units =F("mm");break;
  394.       case 14: v=0.005*a*b;           units=F("bar");break;
  395.       case 15: v=0.01*a*b;            units=F("ms");break;
  396.       case 18: v=0.04*a*b;            units=F("mbar");break;
  397.       case 19: v=a*b*0.01;            units=F("l");break;
  398.       case 20: v=a*(b-128)/128;       units=F("%%");break;
  399.       case 21: v=0.001*a*b;           units=F("V");break;
  400.       case 22: v=0.001*a*b;           units=F("ms");break;
  401.       case 23: v=b/256*a;             units=F("%%");break;
  402.       case 24: v=0.001*a*b;           units=F("A");break;
  403.       case 25: v=(b*1.421)+(a/182);   units=F("g/s");break;
  404.       case 26: v=float(b-a);          units=F("C");break;
  405.       case 27: v=abs(b-128)*0.01*a;   units=F("°");break;
  406.       case 28: v=float(b-a);          units=F(" ");break;
  407.       case 30: v=b/12*a;              units=F("Deg k/w");break;
  408.       case 31: v=b/2560*a;            units=F("°C");break;
  409.       case 33: v=100*b/a;             units=F("%%");break;
  410.       case 34: v=(b-128)*0.01*a;      units=F("kW");break;
  411.       case 35: v=0.01*a*b;            units=F("l/h");break;
  412.       case 36: v=((unsigned long)a)*2560+((unsigned long)b)*10;  units=F("km");break;
  413.       case 37: v=b; break; // oil pressure ?!
  414.       // ADP: FIXME!
  415.       /*case 37: switch(b){
  416.              case 0: sprintf(buf, F("ADP OK (%d,%d)"), a,b); t=String(buf); break;
  417.              case 1: sprintf(buf, F("ADP RUN (%d,%d)"), a,b); t=String(buf); break;
  418.              case 0x10: sprintf(buf, F("ADP ERR (%d,%d)"), a,b); t=String(buf); break;
  419.              default: sprintf(buf, F("ADP (%d,%d)"), a,b); t=String(buf); break;
  420.           }*/
  421.       case 38: v=(b-128)*0.001*a;        units=F("Deg k/w"); break;
  422.       case 39: v=b/256*a;                units=F("mg/h"); break;
  423.       case 40: v=b*0.1+(25.5*a)-400;     units=F("A"); break;
  424.       case 41: v=b+a*255;                units=F("Ah"); break;
  425.       case 42: v=b*0.1+(25.5*a)-400;     units=F("Kw"); break;
  426.       case 43: v=b*0.1+(25.5*a);         units=F("V"); break;
  427.       case 44: sprintf(buf, "%2d:%2d", a,b); t=String(buf); break;
  428.       case 45: v=0.1*a*b/100;            units=F(" "); break;
  429.       case 46: v=(a*b-3200)*0.0027;      units=F("Deg k/w"); break;
  430.       case 47: v=(b-128)*a;              units=F("ms"); break;
  431.       case 48: v=b+a*255;                units=F(" "); break;
  432.       case 49: v=(b/4)*a*0.1;            units=F("mg/h"); break;
  433.       case 50: v=(b-128)/(0.01*a);       units=F("mbar"); break;
  434.       case 51: v=((b-128)/255)*a;        units=F("mg/h"); break;
  435.       case 52: v=b*0.02*a-a;             units=F("Nm"); break;
  436.       case 53: v=(b-128)*1.4222+0.006*a;  units=F("g/s"); break;
  437.       case 54: v=a*256+b;                units=F("count"); break;
  438.       case 55: v=a*b/200;                units=F("s"); break;
  439.       case 56: v=a*256+b;                units=F("WSC"); break;
  440.       case 57: v=a*256+b+65536;          units=F("WSC"); break;
  441.       case 59: v=(a*256+b)/32768;        units=F("g/s"); break;
  442.       case 60: v=(a*256+b)*0.01;         units=F("sec"); break;
  443.       case 62: v=0.256*a*b;              units=F("S"); break;
  444.       case 64: v=float(a+b);             units=F("Ohm"); break;
  445.       case 65: v=0.01*a*(b-127);         units=F("mm"); break;
  446.       case 66: v=(a*b)/511.12;          units=F("V"); break;
  447.       case 67: v=(640*a)+b*2.5;         units=F("Deg"); break;
  448.       case 68: v=(256*a+b)/7.365;       units=F("deg/s");break;
  449.       case 69: v=(256*a +b)*0.3254;     units=F("Bar");break;
  450.       case 70: v=(256*a +b)*0.192;      units=F("m/s^2");break;
  451.       default: sprintf(buf, "%2x, %2x      ", a, b); break;
  452.     }
  453.    
  454.     switch (currAddr){
  455.       case ADR_Engine:
  456.         switch(group){
  457.           case 3:
  458.             switch (idx){
  459.               case 0: engineSpeed = v; break;
  460.               case 1: supplyVoltage=v; break;
  461.               case 2: coolantTemp =v; break;
  462.               case 3: intakeAirTemp=v; break;
  463.             }              
  464.             break;
  465.           case 11:
  466.             switch (idx){
  467.               case 1: engineLoad=v; break;
  468.               case 2: vehicleSpeed =v; break;
  469.               case 3: fuelConsumption=v; break;
  470.             }              
  471.             break;
  472.         }
  473.         break;
  474.       case ADR_Dashboard:
  475.         switch (group){
  476.           case 1:  
  477.             switch (idx){
  478.               case 0: vehicleSpeed = v; break;
  479.               case 1: engineSpeed = v; break;
  480.               case 2: oilPressure = v; break;
  481.             }
  482.             break;
  483.           case 2:
  484.             switch (idx){
  485.               case 0: odometer = v; break;
  486.               case 1: fuelLevel = v; break;        
  487.             }
  488.             break;
  489.           case 50:
  490.             switch (idx){
  491.               case 1: engineSpeed = v; break;
  492.               case 2: oilTemp = v; break;
  493.               case 3: coolantTemp = v; break;
  494.             }
  495.             break;
  496.         }
  497.         break;
  498.     }
  499.     if (units.length() != 0){
  500.       dtostrf(v,4, 2, buf);
  501.       t=String(buf) + " " + units;
  502.     }          
  503.     Serial.println(t);
  504.    
  505.     //lcd.setCursor(0, idx);      
  506.     //while (t.length() < 20) t += " ";
  507.     //lcd.print(t);      
  508.   }
  509.   sensorCounter++;
  510.   return true;
  511. }
  512.  
  513. void alarm(){
  514.   if (alarmCounter > 10) return;
  515.   tone(pinBuzzer, 1200);    
  516.   delay(100);
  517.   noTone(pinBuzzer);  
  518.   alarmCounter++;
  519. }
  520.  
  521. void updateDisplay(){
  522.   if (!connected){
  523.    /* if ( (errorTimeout != 0) || (errorData != 0) ){
  524.       lcdPrint(0,3, F("err to="));      
  525.       lcdPrint(7,3, String(errorTimeout), 3);
  526.       lcdPrint(10,3, F(" da="));      
  527.       lcdPrint(14,3, String(errorData), 6);
  528.     }
  529.   } else {*/
  530.     switch (currPage){
  531.       case 1:      
  532.         if (coolantTemp > 99){
  533.           lcdPrint(0,1, F("COOL"));          
  534.           alarm();          
  535.         } else lcdPrint(0,1, F("cool"));
  536.         lcdPrint(6,1,String(coolantTemp),3);                
  537.         if ( (oilTemp > 99) || ((oilPressure != 30) && (oilPressure != 31)) ){          
  538.           lcdPrint(10,1,F("OIL "));
  539.           alarm();
  540.         } else lcdPrint(10,1,F("oil "));        
  541.         lcdPrint(14,1,String(oilPressure),3);        
  542.         lcdPrint(0,2, F("rpm "));
  543.         lcdPrint(4,2, String(engineSpeed),4);        
  544.         lcdPrint(10,2, F("km/h "));
  545.         lcdPrint(15,2, String(vehicleSpeed, 3));        
  546.         lcdPrint(0,3, F("fuel "));
  547.         lcdPrint(5,3, String(fuelLevel),3);        
  548.         lcdPrint(10,3, F("odo "));
  549.         lcdPrint(14,3, String(odometer),6);                        
  550.         break;
  551.       case 2:
  552.         if (coolantTemp > 99){
  553.           lcdPrint(0,1, F("COOL"));          
  554.           alarm();          
  555.         } else lcdPrint(0,1, F("cool"));
  556.         lcdPrint(6,1,String(coolantTemp),3);                    
  557.         lcdPrint(10,1, F("air "));          
  558.         lcdPrint(14,1, String(intakeAirTemp), 3);                  
  559.         lcdPrint(0,2, F("rpm "));
  560.         lcdPrint(4,2, String(engineSpeed),4);        
  561.         lcdPrint(10,2, F("km/h "));
  562.         lcdPrint(15,2, String(vehicleSpeed, 3));                
  563.         lcdPrint(0,3, F("fuel "));
  564.         lcdPrint(5,3, String(fuelConsumption),3);                
  565.         lcdPrint(10,3, F("volt "));
  566.         lcdPrint(15,3, String(supplyVoltage),5);                                        
  567.         break;
  568.     }    
  569.   }
  570.   pageUpdateCounter++;
  571. }
  572.  
  573. void setup(){      
  574.   lcd.init();  
  575.   lcd.backlight();      
  576.   lcd.init();  
  577.    
  578.   pinMode(pinKLineTX, OUTPUT);  
  579.   digitalWrite(pinKLineTX, HIGH);  
  580.  
  581.   pinMode(pinButton, INPUT);  
  582.   pinMode(pinButton, INPUT_PULLUP);  
  583.  
  584.   pinMode(pinBuzzer, OUTPUT);
  585.   /*tone(pinBuzzer, 1200);    
  586.   delay(100);
  587.   noTone(pinBuzzer);*/
  588.  
  589.   Serial.begin(19200);  
  590.   Serial.println(F("SETUP"));            
  591.        
  592.   Serial.println(F("START"));      
  593. }
  594.  
  595.  
  596. void loop(){    
  597.  
  598.   if (digitalRead(pinButton) == LOW){    
  599.     currPage++;
  600.     if (currPage > 2) currPage = 1;
  601.     lcd.clear();
  602.     lcd.setCursor(0,0);
  603.     lcd.print(F("page "));    
  604.     lcd.print(currPage);    
  605.     errorTimeout = 0;
  606.     errorData = 0;            
  607.     while (digitalRead(pinButton) == LOW);        
  608.   }
  609.  
  610.   switch (currPage){
  611.     case 1:      
  612.       if (currAddr != ADR_Dashboard){        
  613.         connect(ADR_Dashboard, 9600);
  614.       } else  {
  615.         readSensors(1);
  616.         readSensors(2);
  617.         readSensors(50);        
  618.       }      
  619.       break;
  620.     case 2:
  621.       if (currAddr != ADR_Engine) {
  622.         connect(ADR_Engine, 9600);
  623.       } else {
  624.         readSensors(3);
  625.         readSensors(11);
  626.       }    
  627.       break;  
  628.   }        
  629.  
  630.   updateDisplay();          
  631. }
(#) KBal76 válasza erdeidominik1999 hozzászólására (») Feb 12, 2016 /
 
Akkor neked egy TTL soros-USB adapter kellene, de persze ezt is megrendelheted mert nem összeg egyik sem.
(#) andykaaa hozzászólása Feb 13, 2016 /
 
Itten olvastam hogy HD4478 lcd-nel max 8 speci karaktert lehet definialni. Ez igaz ?
Ha tobb ilyen karakterre van szuksegem, akkor azt a loop reszbe, vagyis helybe lehet definialni es amikor ezt a lepest atlepi az Arduino akkor elfelejti oket es hasznalja normalis modon az elore definialtakat (ami a ram-ba van) ?
Vagy pedig ha osszesen tobb mint 8 ilyen karakterem van akkor mindegyiket helybe kell definialni, letrehozni (a flash-ba) ?
Következő: »»   190 / 853
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