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   514 / 839
(#) KoblogPerGyok válasza AutoKobot hozzászólására (») Márc 9, 2019 /
 
Szia!
Ha felepulok akkor szívesen megirnek pár függvényt neked. Alap dolgok mennek azért. Van itthon nanom és LCD ellenállás relé stb. Ha küldenel pár részletesebb leírást akkor ránéznek. De szerintem itt is sokan segítenek nyilvánosan összehozni a kódot. Már ha nem titkos.
Bocs de nem tudok telefonon rendesen írni.
(#) tbarath válasza AutoKobot hozzászólására (») Márc 9, 2019 /
 
Szerintem ha egyszeri/folyamatos fejlesztésre/karbantartásra keresel embert, akkor annak inkább az apróban lenne a helye. Ha pedig egy konkrét probléma megoldásában keresel segítséget, akkor írd le a problémádat, és megpróbálunk segíteni.
A hozzászólás módosítva: Márc 9, 2019
(#) sector99 hozzászólása Márc 9, 2019 /
 
Sziasztok !
Találtam egy szimpatikus Arduino-s projectet. (a kapcsolási rajz)
Mivel teljesen kezdő vagyok a programozásban, rögtön két probléma merült fel: az egyik hogy hibát jelez a fordító a 211-es sornál, ami az általam talált info szerint azért van mert az Uno-ban - és a Pro miniben - nincs ilyen port. Mit kell módosítanom ?
  1. #include <Arduino.h>
  2. #include <MAX31856.h>
  3. #include <PID_v1.h>
  4. #include <Bounce2.h>
  5.  
  6. #include <Adafruit_GFX.h>
  7. #include <Adafruit_SSD1306.h>
  8.  
  9. #define FONT_BIG futura_medium_condensed_bt22pt7b
  10. #define FONT_SMALL futura_medium_condensed_bt9pt7b
  11. #include "futuramdcn22pt7b.h"
  12. #include "futuramdcn9pt7b.h"
  13.  
  14. Adafruit_SSD1306 display;
  15.  
  16. #define GATE_PIN 12         // PD6
  17. #define ZERO_CROSSING_PIN 7 // PE6
  18. #define DRDY_PIN 10         // PB6
  19. #define SLEEP_PIN 11        // PB7
  20.  
  21. #define LEFT_BUTTON_PIN 8  // PB4
  22. #define RIGHT_BUTTON_PIN 9 // PB5
  23.  
  24. volatile unsigned long lastInterrupt = 0;
  25.  
  26. // Pins for the display
  27. #define SCK SCK
  28. #define CS 4
  29. #define SDI MOSI
  30. #define SDO MISO
  31.  
  32. // MAX31856 Initial settings (see MAX31856.h and the MAX31856 datasheet)
  33. // The default noise filter is 60Hz, suitable for the USA
  34. #define CR0_INIT (CR0_AUTOMATIC_CONVERSION + CR0_OPEN_CIRCUIT_FAULT_TYPE_K /* + CR0_NOISE_FILTER_50HZ */)
  35. #define CR1_INIT (CR1_AVERAGE_1_SAMPLE + CR1_VOLTAGE_MODE_GAIN_32)
  36. #define MASK_INIT (~(MASK_VOLTAGE_UNDER_OVER_FAULT + MASK_THERMOCOUPLE_OPEN_FAULT))
  37.  
  38. MAX31856 *temperature;
  39.  
  40. double currTemp = 0;
  41.  
  42. unsigned long lastSample = 0;
  43. double wait = 7800;
  44.  
  45. double targetTemp = 0;
  46.  
  47. double userTemp = 0;
  48.  
  49. bool SLEEP = false;
  50. bool OVERRIDE_DISABLE_HEATER = false;
  51. bool USER_DISABLE_HEATER = false;
  52.  
  53. char displayCurrTempStr[5] = "000.0";
  54. char displaySetTempStr[5] = "000.0";
  55. char displayWaitStr[4] = "0000";
  56. char displaySleepStr[1] = "0";
  57.  
  58. volatile unsigned long scheduledPulse = 0;
  59. volatile bool doPulse = false;
  60.  
  61. double Kp = 35, Ki = 26, Kd = 35;
  62.  
  63. //double Kp = 30, Ki = 16, Kd = 17.5;
  64. PID myPID(&currTemp, &wait, &targetTemp, Kp, Ki, Kd, REVERSE);
  65.  
  66. Bounce leftDebouncer = Bounce();
  67. Bounce rightDebouncer = Bounce();
  68.  
  69. #define MAIN_PAGE 0
  70. #define SET_TEMP_PAGE 1
  71.  
  72. uint8_t CURRENT_PAGE = MAIN_PAGE;
  73.  
  74. unsigned long lastDisplayUpdate = 0;
  75.  
  76. void setup()
  77. {
  78.     delay(300);
  79.  
  80.     /*pinMode(13, OUTPUT);
  81.     digitalWrite(13, HIGH);
  82.     delay(100);
  83.     digitalWrite(13, LOW);
  84.     delay(100);
  85.     digitalWrite(13, HIGH);
  86.     delay(100);
  87.     digitalWrite(13, LOW);*/
  88.  
  89.     myPID.SetOutputLimits(800, 7800);
  90.     myPID.SetSampleTime(100);
  91.  
  92.     myPID.SetMode(AUTOMATIC);
  93.  
  94.     //pinMode(DRDY_PIN, INPUT_PULLUP);
  95.     // make drdy pin input and pulled-up
  96.     DDRB = DDRB & B10111111;
  97.     PORTB = PORTB | B01000000;
  98.  
  99.     //pinMode(SLEEP_PIN, INPUT_PULLUP);
  100.     // make sleep pin input and pulled-up
  101.     DDRB = DDRB & B01111111;
  102.     PORTB = PORTB | B10000000;
  103.  
  104.     //pinMode(ZERO_CROSSING_PIN, INPUT_PULLUP);
  105.     // make zero crossing pin input and pulled-up
  106.     DDRE = DDRE & B10111111;
  107.     PORTE = PORTE | B01000000;
  108.  
  109.     //pinMode(GATE_PIN, OUTPUT);
  110.     // make gate pin output
  111.     DDRD = DDRD | B01000000;


A másik kérdés, hogy át lehet-e írni a programot SPI OLED-re ? ( mert ilyenem van - egyenlőre)
Az én tudásom szerint a D2,3, 5,6, és 13 még szabad. (írtam a szerzőnek, de konkrét megoldást nem kaptam tőle)
A hozzászólás módosítva: Márc 9, 2019
(#) tbarath válasza sector99 hozzászólására (») Márc 9, 2019 /
 
Hiba: legalább a kódsort és a hibaüzenetet írd már be.

SPI kijelző: lehet, kérdés hogy mennyi munka. Egy pin kell, egy chipselect a kijelzőnek, mert a MAX chip is SPI buszon ül. A kódot át kell írni, váltogatnod kell, hogy melyik SPI eszközzel legyen aktív a kommunikáció. Egyébként sokkal több pin szabad még, analóg pin-t is használhatsz digit ki/bemenetként.
(#) sector99 válasza tbarath hozzászólására (») Márc 9, 2019 /
 
'DDRE' was not declared in this scope - hibaüzenet jelenik meg ennél a résznél(5. sor):
  1. //pinMode(ZERO_CROSSING_PIN, INPUT_PULLUP);
  2.     // make zero crossing pin input and pulled-up
  3.     DDRE = DDRE & B10111111;
  4.     PORTE = PORTE | B01000000;

Nem akarom terhelni a topikot a teljes program itt található.
A hozzászólás módosítva: Márc 9, 2019
(#) tbarath válasza sector99 hozzászólására (») Márc 9, 2019 /
 
Most vagy vak vagyok, vagy szivatsz. Most 5. sort írsz, 4 sort látok. Az előbb 211. sort írtál, a 211. sor a forrásban:
  1. else if (TEMP_GRAB_STATE < 4)


Amúgy valóban nincs DDRE uno/nano/pro mini, vagyis semmilyen atmega 328-ra épülő uC-ben, DDRA, B, C és D van. A megfelelő pinhez tartozó regisztereket (Direct Data Register) piszkáld.
A hozzászólás módosítva: Márc 9, 2019
(#) sector99 válasza tbarath hozzászólására (») Márc 9, 2019 /
 
Bocs nem szivatni akarlak !....(csak még ez a kód beillesztés új nekem....:flame
Tehát írtam a hsz.-t beillesztettem a kódot és az előnézetben az 5. sorban mutatta... Szóval
  1. DDRE = DDRE & B10111111;

erre a sorra ugrik a fordító és írja ki a 'DDRE' was not declared in this scope üzenetet.
A linkelt eredeti programban a 106. sorban található. (ha úgy szoktátok csinálni beillesztem a teljes kódot..)
(#) tbarath válasza sector99 hozzászólására (») Márc 9, 2019 /
 
A probléma az, hogy ez a kód Arduino Micro-ra van írva, ami teljesen más Atmega chip-et tartalmaz, mint ami neked van. Azon ATmega32U4 van, az Uno-n (és Nano-n) ATmega328.
A kettő nem kompatibilis, nem csak ezt az egy sort kell átnézni, hanem _minden_ egyes ilyen regiszterpiszkálást (DDRx = Data Direction Register x), és a PORTx-eket, és a stb.

Vagy az egész kódot kell átnézni és - többé-kevésbé - átírni, vagy egy másik lapot beszerezni. Az utóbbira ezeket találtam:
Bővebben: Link
Bővebben: Link
Ez utóbbi nyilván Kínából fele- vagy harmadennyiért is megvehető, csak ki kell várni. Illetve kérdés, hogy ez programozható-e "direktben" USB-n, vagy még programozót is kell hozzá csinálni (pl. az Uno-ból).

szerk: bár jobban megnézve csak az elején tolta a kungfut a csávó, szóval szerintem a DDRx és PORTX sorokat kommentezd ki, és 2 sorral fentebb a kikommentezett pinMode sor elől vedd ki a kommentet.
A hozzászólás módosítva: Márc 9, 2019
(#) sector99 válasza tbarath hozzászólására (») Márc 9, 2019 /
 
Így már világos. Kezdőként biztosan nem vállalkozom a kód átírására. Majd még eldöntöm, hogy keresek egy másik kapcsolást vagy Kínából rendelek egy Micro-t. (nem adok hétezret érte a "Húúúú"-nál, az biztos...:nono)
Hálás köszönetem, hogy foglalkoztál a problémámmal !....

szerk.: egyszerre írtunk. Majd foglalkozok vele még egy kicsit - azzal is tanulok.
A hozzászólás módosítva: Márc 9, 2019
(#) tbarath válasza tbarath hozzászólására (») Márc 9, 2019 /
 
Az előző kommentet szerkesztettem: bár jobban megnézve csak az elején tolta a kungfut a csávó, szóval szerintem a DDRx és PORTX sorokat kommentezd ki, és 2 sorral fentebb a kikommentezett pinMode sor elől vedd ki a kommentet.

Illetve még (legalább) 1 helyen, 213-as sor:
  1. if (!(PINB & B01000000))

Itt a DRDY_PIN nevű pin-t olvassa, ami a MAX "hőelemkezelő" chip DRDY-jéről jön. Szerintem ez Data Ready lenne, ezzel jelzi a chip, hogy elkészült a méréssel és ez olvasható. És mivel úgy gondolom, hogy ezt a 10-es pin-t az elején inputra állítja és felhúzza pullup-pal, ezt a max chip jó eséllyel úgy jelzi, hogy földre húzza a pin-t. És _ha_ ez így van, akkor ez a sor kiváltható így:
  1. if (digitalRead(DRDY_PIN))


Amúgy annyira bírom az ilyet. Itt van egy kód, simán hordozható lenne ha nem "frenkizik" az illető, hanem az egyszer lefutó setup kódban regiszterpiszkálás helyett csak simán használná beépített pinMode parancsot, ami pont ugyanezt csinálja meg. De nem, elő kell adnia magát...
A hozzászólás módosítva: Márc 9, 2019
(#) sector99 válasza tbarath hozzászólására (») Márc 9, 2019 /
 
Ööö - hatvanpár évesen ezt már nem biztos hogy ilyen szinten meg tudom tanulni...De igyekszem mert állítólag sosem késő.
(#) tbarath válasza sector99 hozzászólására (») Márc 9, 2019 /
 
Minden tiszteletem, hogy hatvanpár évesen ilyesmiket tanulsz!

Egyébként átírtam a kódot úgy, ahogy gondolom. Az értelmével nem foglalkoztam, mechanikusan csináltam. (Illetve a MAX datasheet-ben megnéztem, jól tippeltem a DRDY lábat. Tetszik ez a chip, bár nekem MAX6675 van itthon - és elnézve az árát ez is marad.)
Illetve a 28. és a 131. sorban a CS konstansnevet kicseréltem CS_MAX31856-ra, mivel ez a hőelem chip-hez tartozik.
És felvettem a 33. sorban a 13-as pint (ami ugye a LED) az SPI kijelzőhoz tartozó chipselect pin-ként CS_SPIOLED néven. Ezt csak úgy, értelme még nincs.

  1. #include <Arduino.h>
  2. #include <MAX31856.h>
  3. #include <PID_v1.h>
  4. #include <Bounce2.h>
  5.  
  6. #include <Adafruit_GFX.h>
  7. #include <Adafruit_SSD1306.h>
  8.  
  9. #define FONT_BIG futura_medium_condensed_bt22pt7b
  10. #define FONT_SMALL futura_medium_condensed_bt9pt7b
  11. #include "futuramdcn22pt7b.h"
  12. #include "futuramdcn9pt7b.h"
  13.  
  14. Adafruit_SSD1306 display;
  15.  
  16. #define GATE_PIN 12              // PD6
  17. #define ZERO_CROSSING_PIN 7 // PE6
  18. #define DRDY_PIN 10              // PB6
  19. #define SLEEP_PIN 11            // PB7
  20.  
  21. #define LEFT_BUTTON_PIN 8  // PB4
  22. #define RIGHT_BUTTON_PIN 9 // PB5
  23.  
  24. volatile unsigned long lastInterrupt = 0;
  25.  
  26. // Pins for the display
  27. #define SCK SCK
  28. #define CS_MAX31856 4
  29. #define SDI MOSI
  30. #define SDO MISO
  31.  
  32. // az SPI OLED kijelzohoz
  33. #define CS_SPIOLED 13
  34.  
  35.  
  36. // MAX31856 Initial settings (see MAX31856.h and the MAX31856 datasheet)
  37. // The default noise filter is 60Hz, suitable for the USA
  38. #define CR0_INIT (CR0_AUTOMATIC_CONVERSION + CR0_OPEN_CIRCUIT_FAULT_TYPE_K /* + CR0_NOISE_FILTER_50HZ */)
  39. #define CR1_INIT (CR1_AVERAGE_1_SAMPLE + CR1_VOLTAGE_MODE_GAIN_32)
  40. #define MASK_INIT (~(MASK_VOLTAGE_UNDER_OVER_FAULT + MASK_THERMOCOUPLE_OPEN_FAULT))
  41.  
  42. MAX31856 *temperature;
  43.  
  44. double currTemp = 0;
  45.  
  46. unsigned long lastSample = 0;
  47. double wait = 7800;
  48.  
  49. double targetTemp = 0;
  50.  
  51. double userTemp = 0;
  52.  
  53. bool SLEEP = false;
  54. bool OVERRIDE_DISABLE_HEATER = false;
  55. bool USER_DISABLE_HEATER = false;
  56.  
  57. char displayCurrTempStr[5] = "000.0";
  58. char displaySetTempStr[5] = "000.0";
  59. char displayWaitStr[4] = "0000";
  60. char displaySleepStr[1] = "0";
  61.  
  62. volatile unsigned long scheduledPulse = 0;
  63. volatile bool doPulse = false;
  64.  
  65. double Kp = 35, Ki = 26, Kd = 35;
  66.  
  67. //double Kp = 30, Ki = 16, Kd = 17.5;
  68. PID myPID(&currTemp, &wait, &targetTemp, Kp, Ki, Kd, REVERSE);
  69.  
  70. Bounce leftDebouncer = Bounce();
  71. Bounce rightDebouncer = Bounce();
  72.  
  73. #define MAIN_PAGE 0
  74. #define SET_TEMP_PAGE 1
  75.  
  76. uint8_t CURRENT_PAGE = MAIN_PAGE;
  77.  
  78. unsigned long lastDisplayUpdate = 0;
  79.  
  80. void setup()
  81. {
  82.         delay(300);
  83.  
  84.         /*pinMode(13, OUTPUT);
  85.         digitalWrite(13, HIGH);
  86.         delay(100);
  87.         digitalWrite(13, LOW);
  88.         delay(100);
  89.         digitalWrite(13, HIGH);
  90.         delay(100);
  91.         digitalWrite(13, LOW);*/
  92.  
  93.         myPID.SetOutputLimits(800, 7800);
  94.         myPID.SetSampleTime(100);
  95.  
  96.         myPID.SetMode(AUTOMATIC);
  97.  
  98.         pinMode(DRDY_PIN, INPUT_PULLUP);
  99.         // make drdy pin input and pulled-up
  100.         //DDRB = DDRB & B10111111;
  101.         //PORTB = PORTB | B01000000;
  102.  
  103.         pinMode(SLEEP_PIN, INPUT_PULLUP);
  104.         // make sleep pin input and pulled-up
  105.         //DDRB = DDRB & B01111111;
  106.         //PORTB = PORTB | B10000000;
  107.  
  108.         pinMode(ZERO_CROSSING_PIN, INPUT_PULLUP);
  109.         // make zero crossing pin input and pulled-up
  110.         //DDRE = DDRE & B10111111;
  111.         //PORTE = PORTE | B01000000;
  112.  
  113.         pinMode(GATE_PIN, OUTPUT);
  114.         // make gate pin output
  115.         //DDRD = DDRD | B01000000;
  116.  
  117.         pinMode(LEFT_BUTTON_PIN, INPUT_PULLUP);
  118.         // setup left button  pb4
  119.         //DDRB = DDRB & B11101111;
  120.         //PORTB = DDRB | B00010000;
  121.         leftDebouncer.attach(LEFT_BUTTON_PIN);
  122.         leftDebouncer.interval(5);
  123.  
  124.         pinMode(RIGHT_BUTTON_PIN, INPUT_PULLUP);
  125.         // setup right button pb5
  126.         //DDRB = DDRB & B11011111;
  127.         //PORTB = PORTB | B00100000;
  128.         rightDebouncer.attach(RIGHT_BUTTON_PIN);
  129.         rightDebouncer.interval(5);
  130.  
  131.         temperature = new MAX31856(SDI, SDO, CS_MAX31856, SCK);
  132.  
  133.         // Initializing the MAX31855's registers
  134.         temperature->writeRegister(REGISTER_CR0, CR0_INIT);
  135.         temperature->writeRegister(REGISTER_CR1, CR1_INIT);
  136.         temperature->writeRegister(REGISTER_MASK, MASK_INIT);
  137.  
  138.         display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  139.         display.clearDisplay();
  140.  
  141.         display.setTextWrap(false);
  142.         display.setTextSize(1);
  143.         display.setTextColor(WHITE);
  144.         display.setCursor(0, 0);
  145.  
  146.         updateDisplay();
  147.  
  148.         attachInterrupt(digitalPinToInterrupt(ZERO_CROSSING_PIN), zeroCrossingInterrupt, RISING);
  149. }
  150.  
  151. // 0 == not waiting for temp
  152. // 1 == waiting for first bogus
  153. // 2 == waiting for second bogus
  154. // 3 == waiting for third bogus
  155. // when got third bogus in state == 2, go to 0
  156. uint8_t TEMP_GRAB_STATE = 0;
  157.  
  158. void loop()
  159. {
  160.         leftDebouncer.update();
  161.         rightDebouncer.update();
  162.  
  163.         if (leftDebouncer.fell())
  164.         {
  165.                 USER_DISABLE_HEATER = !USER_DISABLE_HEATER;
  166.         }
  167.         else if (rightDebouncer.fell())
  168.         {
  169.                 switch (CURRENT_PAGE)
  170.                 {
  171.                         case MAIN_PAGE:
  172.                         {
  173.                                 CURRENT_PAGE = SET_TEMP_PAGE;
  174.                                 break;
  175.                         }
  176.                         case SET_TEMP_PAGE:
  177.                         {
  178.                                 CURRENT_PAGE = MAIN_PAGE;
  179.  
  180.                                 targetTemp = userTemp;
  181.  
  182.                                 break;
  183.                         }
  184.                 }
  185.         }
  186.  
  187.         bool didSampleTemp = false;
  188.  
  189.         if (TEMP_GRAB_STATE == 0)
  190.         {
  191.                 if (doPulse && !SLEEP && !OVERRIDE_DISABLE_HEATER && !USER_DISABLE_HEATER)
  192.                 {
  193.                         if (micros() >= scheduledPulse)
  194.                         {
  195.                                 doPulse = false;
  196.  
  197.                                 digitalWrite(GATE_PIN, HIGH);
  198.                                 digitalWrite(GATE_PIN, LOW);
  199.  
  200.                                 /*PORTD = PORTD | B01000000;
  201.                                 delayMicroseconds(2);
  202.                                 PORTD = PORTD & B10111111;*/
  203.                         }
  204.                 }
  205.  
  206.                 if (millis() - lastSample > 400)
  207.                 {
  208.                         //noInterrupts();
  209.  
  210.                         TEMP_GRAB_STATE++;
  211.  
  212.                         getRidOfBogusReading();
  213.                 }
  214.         }
  215.         else if (TEMP_GRAB_STATE < 4)
  216.         {
  217.                 //if (!(PINB & B01000000))
  218.                 if (digitalRead(DRDY_PIN))
  219.                 {
  220.                         TEMP_GRAB_STATE++;
  221.                         getRidOfBogusReading();
  222.                 }
  223.         }
  224.         else
  225.         {
  226.                 // we got third bogus...let's update for real
  227.  
  228.                 currTemp = readTemp();
  229.  
  230.                 // check if sleep pin is asserted
  231.  
  232.                 //SLEEP = !(PINB & B10000000);
  233.                 SLEEP = !digitalRead(SLEEP_PIN);
  234.  
  235.                 if (currTemp > 999.9)
  236.                 {
  237.                         if (SLEEP)
  238.                                 currTemp = 0;
  239.                         else
  240.                         {
  241.                                 OVERRIDE_DISABLE_HEATER = true;
  242.                                 currTemp = 999.9;
  243.                         }
  244.                 }
  245.                 else if (currTemp < 0)
  246.                 {
  247.                         currTemp = 0;
  248.                 }
  249.                 else
  250.                 {
  251.                         OVERRIDE_DISABLE_HEATER = false;
  252.                 }
  253.  
  254.                 myPID.SetSampleTime(millis() - lastSample);
  255.  
  256.                 lastSample = millis();
  257.  
  258.                 didSampleTemp = true;
  259.  
  260.                 TEMP_GRAB_STATE = 0;
  261.  
  262.                 if (CURRENT_PAGE == SET_TEMP_PAGE)
  263.                 {
  264.                         userTemp = getUserTemp();
  265.                 }
  266.  
  267.                 // we can now re-enable interrupts
  268.                 //interrupts();
  269.         }
  270.  
  271.         if (!SLEEP && !OVERRIDE_DISABLE_HEATER && !USER_DISABLE_HEATER && currTemp != 0)
  272.                 myPID.Compute();
  273.  
  274.         // update more quickly if we're accepting user input
  275.  
  276.         /*if (CURRENT_PAGE == SET_TEMP_PAGE && millis() - lastDisplayUpdate >= 20)
  277.         {
  278.                 didSampleTemp = true;
  279.                 userTemp = getUserTemp();
  280.         }*/
  281.  
  282.         if (didSampleTemp)
  283.         {
  284.                 updateDisplay();
  285.         }
  286. }
  287.  
  288. void getRidOfBogusReading()
  289. {
  290.         readTemp();
  291.         delayMicroseconds(100);
  292.         /*while (PINB & B01000000)
  293.         //while (digitalRead(DRDY_PIN))
  294.         {
  295.                 ;
  296.         }*/
  297. }
  298.  
  299. void updateDisplay()
  300. {
  301.         display.clearDisplay();
  302.  
  303.         if (CURRENT_PAGE == MAIN_PAGE)
  304.                 drawMainPage();
  305.         else if (CURRENT_PAGE == SET_TEMP_PAGE)
  306.                 drawSetTempPage();
  307.  
  308.         display.display();
  309.  
  310.         lastDisplayUpdate = millis();
  311. }
  312.  
  313. void drawMainPage()
  314. {
  315.         display.setFont(&FONT_BIG);
  316.  
  317.         dtostrf(currTemp, 5, 1, displayCurrTempStr);
  318.  
  319.         display.setCursor(25, 36);
  320.         display.print(displayCurrTempStr);
  321.  
  322.         display.setFont(&FONT_SMALL);
  323.  
  324.         display.setCursor(110, 24);
  325.         display.print("F");
  326.  
  327.         dtostrf(targetTemp, 5, 1, displaySetTempStr);
  328.  
  329.         display.setCursor(48, 60);
  330.         display.print(displaySetTempStr);
  331.  
  332.         display.setFont();
  333.  
  334.         dtostrf(wait, 4, 0, displayWaitStr);
  335.  
  336.         display.setCursor(102, 52);
  337.         display.print(displayWaitStr);
  338.  
  339.         dtostrf(SLEEP, 1, 0, displaySleepStr);
  340.  
  341.         display.setCursor(1, 52);
  342.         display.print(displaySleepStr);
  343.  
  344.         if (OVERRIDE_DISABLE_HEATER || USER_DISABLE_HEATER)
  345.                 display.invertDisplay(true);
  346.         else
  347.                 display.invertDisplay(false);
  348. }
  349.  
  350. void drawSetTempPage()
  351. {
  352.         display.setFont(&FONT_BIG);
  353.  
  354.         dtostrf(userTemp, 5, 1, displayCurrTempStr);
  355.  
  356.         display.setCursor(25, 36);
  357.         display.print(displayCurrTempStr);
  358.  
  359.         display.setFont(&FONT_SMALL);
  360.  
  361.         display.setCursor(110, 24);
  362.         display.print("F");
  363.  
  364.         display.setCursor(48, 60);
  365.         display.print("SET");
  366. }
  367.  
  368. void zeroCrossingInterrupt()
  369. {
  370.         if (!SLEEP)
  371.         {
  372.                 if (millis() - lastInterrupt > 1)
  373.                 {
  374.                         lastInterrupt = millis();
  375.  
  376.                         doPulse = true;
  377.  
  378.                         scheduledPulse = micros() + wait;
  379.                 }
  380.         }
  381. }
  382.  
  383. double getUserTemp()
  384. {
  385.         return mapdouble(analogRead(A0), 0, 1023, 300, 700);
  386. }
  387.  
  388. double readTemp()
  389. {
  390.         return 122.5438816 + 5.66934596 * temperature->readThermocoupleVoltage();
  391. }
  392.  
  393. double mapdouble(double x, double in_min, double in_max, double out_min, double out_max)
  394. {
  395.         return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  396. }
(#) sector99 válasza tbarath hozzászólására (») Márc 9, 2019 /
 
Ó, köszönöm ! Már lassan 50 éve a hobbim az elektronika - anno még a germánium tranyó is nagy kincs volt....Csak volt cirka 30 év kihagyás - család munka stb.
Nekem is "csak" 6675 van, azzal már kísérletezgettem. Úgy néztem, hogy teljesen kompatibilis módon kommunikál mint a 31856.
Nagyon köszönöm, hogy ilyen sokat foglalkozol vele(m) ! Sokat tanulok egy ilyen módosításból, mert szeretném azért meg is érteni az utasításokat - a program működésének a lényegét.
Ma már késő, túl fáradt vagyok, de majd legközelebb belevetem magam...
Köszi !
(#) tbarath válasza sector99 hozzászólására (») Márc 9, 2019 /
 
Nagy különbség a 2 MAX chip között, hogy a 31856 adatlapja tartalmazza ezt: "The thermocouple inputs are protected against overvoltage conditions up to ±45V". A 6675 nem tudom mit szólna ahhoz, ha megjelenne a bemenetén 24V...

A módosítás egyébként csak jelképes volt, az eredeti kódban szinte mindenhol benne hagyta kikommentezve az arduino utasításokat, amiket "direkt" regiszter, port, stb. írással/olvasással oldott meg. Lefordítva az adott arduino utasítás is pont ugyanezt csinálja, csak sokszor még mást is, és lassabban, szóval néha szükség van ilyesmire. De itt szerintem pont nem, a setup() blokkban pont semmi jelentősége nincs ennek. Illetve később 2 helyen olvasott még direktben pin értéket, de szerintem se a thermocouple "data ready" pin-jének olvasása, se a sleep gomb állapotának vizsgálata nem indokolja ezt.
(#) AutoKobot hozzászólása Márc 10, 2019 /
 
Üdv Mindenkinek!

Természetesen az előző hozzászólásomban lévő ajánlat díjazás ellenében értendő. Azért is bátorkodtam kiírni, hogy szakit keressek, mert nincs időm kísérletezni. A feladatokat igyekszem minden esetben előre pontosan meghatározni. Amennyiben sikerült egy projektet pontosan megfogalmazni, hogy mindkettőnk számára érthető, akkor egy árajánlatot kérek. Így a projektbe be tudom építeni az ajánlatba foglalt árat és minden a helyén van. Az eszköz (arduino) kiegészítő alkalmazás vezérlés, mint pozicionáló, lengető egység, biztonsági felügyelet, stb. Talán így érthetőbb: https://www.facebook.com/autocobot/

Üdv!
(#) KoblogPerGyok válasza AutoKobot hozzászólására (») Márc 10, 2019 / 1
 
Nem semmi. Nagyon érdekelne a dolog de nem vallalnam. Azonban szívesen beszallnek megfigyelőként. Mechatronikai mérnök suliba járok éppen. Első éves vagyok ugyan de programozgattam már. A mátrix műveletek, koordináta transzformaciok az előző végzettsegemhez közel állnak. Szívesen csatlakoznek.
(#) Andralin hozzászólása Márc 10, 2019 /
 
Sziasztok!

I2C címzéssel kapcsolatban kérnék segítséget.

Arduioval szeretnék leszimulálni egy PCF8574 IC-t, ehhez a beépített Wire könyvtárat használom slave módban kommunikálva.

Ennél az IC-nél más a cím amikor írnak bele és más amikor olvasnak belőle.
Esetemben íráskor a 0x40-es címre kell írni, olvasáskor pedig a 0x41-ről kell olvasni. Szóval a nulladik bit állítja az R/W irányát.

A gondom az, hogy a függvénykönyvtárban elvileg csak a setup részben tudok egyszer címet definiálni a Wire.begin() használatával. Egyes írás/olvasási műveletenként úgy látom, nem nagyon lehet egyedi címeket megadni.

Viszont azt olvastam, hogy a megadott cím elvileg 7 bites, így arra gondoltam, nem lehetséges, hogy a függvény automatikusan, magától kezeli a nulladik bitet az R/W irányától függően?

Vajon jól sejtem-e, tényleg így van-e?
Ha így van, akkor a Wire.begin() utasításnál csak a cím legfelső 7 bitjét kell megadjám? Tehát esetemben 0x20-at? És akkor elvileg minden jó lesz majd, a nulladik bitet automatikusan hozzácsapja ő és akkor lesz belőle 0x40 / 0x41?
A hozzászólás módosítva: Márc 10, 2019
(#) sargarigo válasza Andralin hozzászólására (») Márc 10, 2019 /
 
Esetleg ezt itt próbáltad már?

Éppen nem a szimulálással foglalkozik, de hátha segít.
A hozzászólás módosítva: Márc 10, 2019
(#) bbb válasza Andralin hozzászólására (») Márc 10, 2019 /
 
Amikor az I2C 7 bites címzést használ, a hozzácsapott 8. bit mondja meg, hogy írsz, vagy olvasol. Emiatt van, hogy más a címed íráskor és más olvasáskor. A wiki cikk kivételesen egész jól leírja ezt...
(#) Andralin válasza bbb hozzászólására (») Márc 11, 2019 /
 
Köszönöm a válaszokat, akkor jól gondoltam.
Elvileg így a 0x20-at kell megadjam 7 bites címként, ami a felső 7 bitje a valós címnek.
(#) andyka hozzászólása Márc 11, 2019 /
 
Sziasztok
Lehtséges hogy a kimeneteknek és a bemeneteknek a kivezetes számát epromból olvassa be amikor indul.
Vagyis, hagyomány szerint a setup előtt hatarozzuk meg kivezetéseket - const int ledPin = 2;.
Azt szeretném elérni hogy azt a 2 -öst csak a setup -ba rendeljem hozzá epromból kiolvasva.
(mi haszna ? ugyanaz a kód de más hardwer kivitelezés)
Köszönom
A hozzászólás módosítva: Márc 11, 2019
(#) tbarath válasza andyka hozzászólására (») Márc 11, 2019 / 1
 
Ha felveszel egy konstanst, akkor fordításkor a fordító azt kicseréli az értékére. Tehát a kódodban ahol ledPin-t használsz, ott mindenhik 2-es lesz, nem egy változó értékét fogja oda betenni.

Amit akarsz azt konstanssal nem tudod megcsinálni (mert az már fordítási időben konstans), de változóval simán. Elöl a setup blokk előtt felveszel egy "int ledPin = -1;" változót, aztán a setup blokkodban olvasol epromból és valós értéket adsz neki.
(#) andyka válasza tbarath hozzászólására (») Márc 11, 2019 /
 
Köszi
Egyelőre csak a beépített leddel (ESP8266) probáltam ki és annál bevált. Próba, próba,
Müködik, köszönöm
(#) elektroncso hozzászólása Márc 11, 2019 /
 
Sziasztok!
Egy kis segítségre volna szükségem. A számítógépemen fut egy DDE Client nevű program ami az Orbitron műholdpálya elemző program és a számítógép soros portja (esetemben USB) képez hidat. A DDE az Orbitrontól kapott aktuális pályaadatokat küldi ki soros porton. Két adat van, az azimut szög ("konstans" változónév: AZ) ill. az elevációs szög ("konstans" változónév:EL). Ezek a következő négy formában érkezhetnek:
1. - AZ:xx.x,EL:xx.x
2. - AZ:xxx.x,EL:xx.x
3. - AZ:xx.x,EL:xxx.x
4. - AZ:xxx.x,EL:xxx.x
Számszerűen például lehet "AZ:13.5,EL:36.7".
Az USB porthoz egy UNO van csatlakoztatva ezzel kéne tovább feldolgoznom a kapott szögadatokat. Azt nem tudom, hogy a kapott üzenetből (pl. AZ:xx.x,EL:xx.x) hogyan tudom külön két változóba (AZ ill. EL névű változók) szétválasztani a szögeket. Ebben kéne segítség, a további feldolgozás már megoldott.
Előre is köszönöm!
(#) tbarath válasza elektroncso hozzászólására (») Márc 11, 2019 /
 
String osztály lesz a barátod, már ha van elég memóriád és futásidőd.
Az indexOf() megmondja, hogy hol a vessző: Bővebben: Link.
Az azimut a 4. karaktertől (amelyik itt sanszosan a 3. lesz, mert C string, de majd kideríted) a vessző előtti karakterig tart, ezt substring()-gel kiszeded: Bővebben: Link

Az EL érték az a vessző utáni 4. karaktertől kezdődik és a string végéig tart amit a length() fv. ad meg.

Ha ezt konvertálnod kell lebegőpontos számmá, akkor a toFloat() vagy a toDouble() metódust kell használnod.
(#) Andralin válasza elektroncso hozzászólására (») Márc 11, 2019 /
 
Én úgy csinálnám, hogy megkeresem az üzenetben a vessző helyét az indexOf() fügyvénnyel, majd ebből már ki tudom számolni a első és a második szám legelső és legutolsó karaterének helyét. Utána pedig a substring segítségével kiszedem az üzenetből a két számot két külön változóba.
A hozzászólás módosítva: Márc 11, 2019
(#) proba válasza elektroncso hozzászólására (») Márc 11, 2019 /
 
A szöveget, mint karakteres tömböt is lehet értelmezni. Hirtelen ezt találtam róla:Bővebben: Link
(#) tbarath válasza proba hozzászólására (») Márc 11, 2019 /
 
Lehet így is csinálni, de a String osztály magasabb szintű, egyszerűbb, nem kell rajta algoritmizálni - cserébe megzabál egy csomó erőforrást. Ha ez belefér, akkor inkább ezt javasolnám egy kezdőnek. (Ezzel nem lebecsülni akarom elektroncso fórumtársat, de ha egy ilyen kérdést feltesz, akkor szerintem programozásban kezdő szinten lehet.)
Egyébként én is igyekszem String osztály nélkül megoldani a dolgokat.
(#) elektroncso válasza tbarath hozzászólására (») Márc 12, 2019 /
 
Teljesen kezdő vagyok programozásban, semmi tapasztalatom nincs. Annyit tudok, hogy már megírt programokból, kódrészletekből képes vagyok összefaragni egy olyan öszvért ami azt csinálja amit szeretnék, de önállóan nem tudok (még) programot írni.
Jelenleg egy műholdkövető antennán dolgozom és valójában annyi volna a feladat, hogy van két motor aminek a tengelye kényszerkapcsolatba van hozva egy-egy potival. A poti jelzi vissza a motrok (ezzel együtt az antenna) állását. A potikról érkező jelet és a DDE által küldött szögadatot összehasonlítom. Ha eltérés van akkor úgy kell a motrokat állítani, hogy ne legyen eltérés. A potikról érkező jelet egy egyszerű matematikai számítással átalakítom 0-360 közötti számmá (ami értelemszerűen a szög) amit közvetlenül összehasonlíthatok AZ ill. EL változókban tárolt szöggel. Plusz annyi van még, hogy egy LCD-re kiíratom az antenna aktuális azimut és elevációs szögét.
Bár buta vagyok az ilyen számításokhoz szerintem ezt bőven kéne tudnia az UNO-nak. Az Orbitron 5 másodpercenként küld új adatot.
Köszönöm az ötleteket, tanácsokat elkezdek utánaolvasni ennek a String osztálynak.
(#) Mercurion99 hozzászólása Márc 12, 2019 /
 
Üdv,

Arduinozásban és elektronikában teljesen kezdő vagyok.
Egy olyan problémába ütköztem,amire nem találtam a google segítségével sem megoldást.
Egy mezei filléres DS18B20 végére forrasztottam egy TRS apa jack csatlakozót és azt egy anya csatlakozó segítségével kötöttem össze az Arduinoval.Addig minden rendben megy,ameddig nem húzom ki és dugom vissza az apát az anyába.Ilyenkor valami nagyon nem volt kóser.Végül rájöttem,hogy ilyenkor rövid zár keletkezik,mert a jack végén lévő pin VCC érintkezik a GND-vel.
Hogyan küszöbölik ki ezt a problémát?Elég sok helyen láttam gyárilag így összerakott szenzorokat.Ott mivel oldják meg ezt?Van valakinek ebben a tapasztalata?
Következő: »»   514 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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