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   201 / 853
(#) Kovidivi válasza speedbump hozzászólására (») Márc 6, 2016 /
 
Fagyás = programozási hiba, ami a felhasználó hibája, program megáll, bármi történhet, kimenetek úgy maradnak, ahogy voltak, esetleg az interrupt dolgozik a háttérben. Pl: várni egy eseményre, ami sosem fog bekövetkezni, és nincs időkorlát (timeout).
Reset = hibás hardver esetén a tápfeszültség túl alacsony értékre csökken, ekkor általában reset történik ( fuse bit figyel erre, de ha ki van kapcsolva az alacsony feszültség védelem, bármi történhet, esetleg próbál indulgatni a proci, de közben leesik a feszültség lemerült akksi esetén, stb.) relé kapcsolásakor zavar keletkezik, ez a kvarcot befolyásolhatja, legrosszabb esetben megáll a program, hogy ezután lesz-e reset, azt nem tudom, de a watchdog pont ezekért felel. Reset esetén minden kimenet lebeg, és újraindul a program az elejéről. Ezen kívül még több lehetőség is létezik.
A hozzászólás módosítva: Márc 6, 2016
(#) speedbump válasza Kovidivi hozzászólására (») Márc 6, 2016 /
 
Köszönöm a válaszod, sokat segített! Főleg a sokak által említett "fagyás" érdekelt, mert azt hittem ez valami bizonytalanság magában az eszközben. A jó programozó a windows-t is le tudja fagyasztani, szóval a programozási hibák annyira nem érdekelnek, azt bármilyen környezetben el lehet követni. Találtam egy jó tutorial-t a watchdog-ról, így már tudom, hogy bármi van tudom reset-elni a kontrollert. Köszi.
(#) pisti hozzászólása Márc 7, 2016 /
 
Tisztelt Fórumozók!
A véleményeteket szeretném kérni, hogy melyik függvénnyel készítsem el a stopperem. A cél az, hogy egy elektromágnes elejt egy golyót (valamelyik kimenet HIGH-ról LOW-ra), ekkor indulna az időmérés és a golyó ráesik egy lapra ahol zár egy érintkezőt. Az időt a serial monitoron íratnám ki.
Köszönöm!
(#) hadhazik válasza dokidoki hozzászólására (») Márc 7, 2016 /
 
A korábban már bemutatott kép szerint építettem ki a vezérlőt, légvezetékeléssel, az eredeti Arduinos sildekkel.
Az optocsatolt relék bemenete kapja a nano megfelelő digitális kimenetét, a kapcsoló 5V-ot a külső tápról, a relék kapcsolják a szivattyúkat, irányváltó motorokat AC 230V-al.
Az AC230 V-os relét a lakástermosztát kapcsolja, ez ad DC 5V-os jelet az Arduino A3 bemenetre a lakás jel figyeléshez.
Lefagyáskor megáll a program futása, a log fájlból látszik, a void loop, a wdt teszteléskor működik, ebben az esetben nem indítja újra a nanot.
A lefagyás általában csak egy-egy szivattyú üzemében jelentkezik, amikor leáll.
A kód:

  1. /*Arduino Uno, ATmega328
  2. YourDuino.com Example: Multiple DS18B20 Temperature Sensors
  3.    Displayed on 4x20 character LCD display
  4.    
  5.    DS18B20 Pinout (Left to Right, pins down, flat side toward you)
  6.   - fekete   = Ground
  7.   - sárga = Signal (Pin 2):  (with 3.3K to 4.7K resistor to +5 or 3.3 )
  8.   - zöld  = +5 or +3.3 V */
  9.  
  10. #include <SPI.h>
  11. #include <SD.h>  
  12. #include <avr/wdt.h>
  13. #include <OneWire.h>
  14. #include <DallasTemperature.h>
  15. #include <DS1624.h>
  16. #include <Wire.h>
  17. #include <LiquidCrystal_I2C.h>
  18. #include <MAX6675.h>
  19. DS1624 temperature1(0x48);
  20. DS1624 temperature2(0x4E);
  21. DS1624 temperature3(0x4D);
  22. DS1624 temperature4(0x4F);
  23. #define DS3231_I2C_ADDRESS 0x68
  24. // Convert normal decimal numbers to binary coded decimal
  25. byte decToBcd(byte val)
  26. {
  27.   return( (val/10*16) + (val%10) );
  28. }
  29. // Convert binary coded decimal to normal decimal numbers
  30. byte bcdToDec(byte val)
  31. {
  32.   return( (val/16*10) + (val%16) );
  33. }
  34. /*-----( Declare Constants and Pin Numbers )-----*/
  35. // Data wire is plugged into port 2 on the Arduino (can be changed)
  36. #define ONE_WIRE_BUS 2    // NOTE: No ";" on #define  
  37. #define SZV1START 3 // relay1
  38. #define LAKAS1 5 // relay2
  39. #define PUFFER 4 // relay3
  40. #define SZV2START 6 // relay4
  41. #define BYPASS 7 // relay5
  42. #define LAKAS2 8 // relay6
  43. /*-----( Declare objects )-----*/
  44. // Setup a oneWire instance to communicate with any OneWire devices
  45. // (not just Maxim/Dallas temperature ICs)
  46. OneWire oneWire(ONE_WIRE_BUS);
  47.  
  48. // Pass address of our oneWire instance to Dallas Temperature.
  49. DallasTemperature sensors(&oneWire);
  50.  
  51. // Start the LCD display library
  52. LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
  53. int LED1 = 13;             // Status LED Pin
  54. int CS = 10;             // CS pin on MAX6675
  55. int SO = 11;              // SO pin of MAX6675
  56. int SCLK = 9;             // SCLK pin of MAX6675
  57. int units = 1;            // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F)
  58. float fusthofok = 0.0;  // Temperature output variable
  59. float lakaskW = 0.0;
  60. float kazankW = 0.0;
  61. // Initialize the MAX6675 Library for our chip
  62. MAX6675 temp(CS,SO,SCLK,units);
  63.  
  64.  
  65. // Setup Serial output and LED Pin  
  66. // MAX6675 Library already sets pin modes for MAX6675 chip!
  67. /*-----( Declare Variables )-----*/
  68. // Assign the addresses of your 1-Wire temp sensors.
  69. // See the tutorial on how to obtain these addresses:
  70. // http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#Read%20individual
  71.  
  72.  // WP 1
  73. DeviceAddress pufferfent = { 0x28, 0xAC, 0xFA, 0x26, 0x06, 0x00, 0x00, 0x8C }; // "T1"
  74. DeviceAddress puffer1_3  = { 0x28, 0x61, 0xBB, 0x26, 0x06, 0x00, 0x00, 0x7D }; // "T2"
  75. DeviceAddress puffer2_3  = { 0x28, 0x99, 0x10, 0x26, 0x06, 0x00, 0x00, 0xED }; // "T3"
  76. DeviceAddress pufferlent = { 0x28, 0x15, 0x1F, 0x28, 0x06, 0x00, 0x00, 0x00 }; // "T4"
  77. float temppufferfent = 0.0;
  78. float temppuffer1_3  = 0.0;
  79. float temppuffer2_3  = 0.0;
  80. float temppufferlent = 0.0;
  81.  
  82. void setup()   /****** SETUP: RUNS ONCE ******/
  83. {
  84.  
  85.   wdt_disable();
  86.         lcd.init();                      // initialize the lcd
  87.   lcd.backlight();
  88.   Serial.begin(9600);
  89.     // set the initial time here:
  90.    //DS3231 seconds, minutes, hours, day, date, month, year
  91.    //setDS3231time(30,10,14,3,16,12,15);
  92.  
  93.                                 //------- Initialize the Temperature measurement library--------------
  94.   sensors.begin();
  95.   // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
  96.   sensors.setResolution(pufferfent, 10); //T1
  97.   sensors.setResolution(puffer1_3,  10); //T2
  98.   sensors.setResolution(puffer2_3,  10); //T3
  99.   sensors.setResolution(pufferlent, 10); //T4
  100.   temperature1.start();  
  101.   temperature2.start();
  102.   temperature3.start();
  103.   temperature4.start();
  104.   pinMode(LED1, OUTPUT);
  105.   pinMode(SZV1START, OUTPUT);
  106.   pinMode(LAKAS1, OUTPUT);  
  107.   pinMode(PUFFER, OUTPUT);
  108.   pinMode(SZV2START,OUTPUT);
  109.   pinMode(LAKAS2,OUTPUT);
  110.   pinMode(BYPASS,OUTPUT);
  111.   digitalWrite(SZV1START, HIGH); // szv1 áll
  112.   digitalWrite(LAKAS1, HIGH);
  113.   digitalWrite(PUFFER, HIGH); // pufferre állítja az irányváltó1-et
  114.   digitalWrite(SZV2START,HIGH); // szv2 áll
  115.   digitalWrite(LAKAS2, HIGH);
  116.   digitalWrite(BYPASS,HIGH); // bypassra állítja irányváltó2-őt
  117.    
  118.   pinMode(A0, OUTPUT);
  119.   SD.begin(A0);
  120. if (!SD.begin(A0)) {
  121.    
  122.     Serial.println("initialization failed!");
  123.     return;
  124.   }
  125.   Serial.println("initialization done.");
  126.  
  127.   if (SD.exists("datalog.csv")) {
  128.     Serial.println("datalog.csv exists.");
  129.   }
  130. else {
  131.     Serial.println("datalog.csv doesn't exist.");
  132.   }
  133.   wdt_enable(WDTO_8S);
  134. }//--(end setup )---
  135. void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
  136. dayOfMonth, byte month, byte year)
  137. {
  138.   // sets time and date data to DS3231
  139.   Wire.beginTransmission(DS3231_I2C_ADDRESS);
  140.   Wire.write(0); // set next input to start at the seconds register
  141.   Wire.write(decToBcd(second)); // set seconds
  142.   Wire.write(decToBcd(minute)); // set minutes
  143.   Wire.write(decToBcd(hour)); // set hours
  144.   Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  145.   Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  146.   Wire.write(decToBcd(month)); // set month
  147.   Wire.write(decToBcd(year)); // set year (0 to 99)
  148.   Wire.endTransmission();
  149. }
  150. void readDS3231time(byte *second,
  151. byte *minute,
  152. byte *hour,
  153. byte *dayOfWeek,
  154. byte *dayOfMonth,
  155. byte *month,
  156. byte *year)
  157. {
  158.   Wire.beginTransmission(DS3231_I2C_ADDRESS);
  159.   Wire.write(0); // set DS3231 register pointer to 00h
  160.   Wire.endTransmission();
  161.   Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  162.   // request seven bytes of data from DS3231 starting from register 00h
  163.   *second = bcdToDec(Wire.read() & 0x7f);
  164.   *minute = bcdToDec(Wire.read());
  165.   *hour = bcdToDec(Wire.read() & 0x3f);
  166.   *dayOfWeek = bcdToDec(Wire.read());
  167.   *dayOfMonth = bcdToDec(Wire.read());
  168.   *month = bcdToDec(Wire.read());
  169.   *year = bcdToDec(Wire.read());
  170. }
  171. /*void displayTime()
  172. {
  173.   byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  174.   // retrieve data from DS3231
  175.   readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  176.   &year);
  177.   // send it to the serial monitor
  178.   Serial.print(hour, DEC);
  179.   // convert the byte variable to a decimal number when displayed
  180.   Serial.print(":");
  181.   if (minute<10)
  182.   {
  183.     Serial.print("0");
  184.   }
  185.   Serial.print(minute, DEC);
  186.   Serial.print(":");
  187.   if (second<10)
  188.   {
  189.     Serial.print("0");
  190.   }
  191.   Serial.print(second, DEC);
  192.   Serial.print(" ");
  193.   Serial.print(dayOfMonth, DEC);
  194.   Serial.print("/");
  195.   Serial.print(month, DEC);
  196.   Serial.print("/");
  197.   Serial.print(year, DEC);
  198.   Serial.print(" Day of week: ");
  199.   switch(dayOfWeek){
  200.   case 1:
  201.     Serial.println("Sunday");
  202.     break;
  203.   case 2:
  204.     Serial.println("Monday");
  205.     break;
  206.   case 3:
  207.     Serial.println("Tuesday");
  208.     break;
  209.   case 4:
  210.     Serial.println("Wednesday");
  211.     break;
  212.   case 5:
  213.     Serial.println("Thursday");
  214.     break;
  215.   case 6:
  216.     Serial.println("Friday");
  217.     break;
  218.   case 7:
  219.     Serial.println("Saturday");
  220.     break;
  221.   }
  222. }*/
  223.  
  224. void loop()   /****** LOOP: RUNS CONSTANTLY ******/
  225.  
  226. {
  227.  
  228.   SD.begin(A0);
  229.    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  230.   // retrieve data from DS3231
  231.   readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  232.   &year);
  233.   digitalWrite(LED1, HIGH);   // turn the LED on (HIGH is the voltage level)
  234.   delay(100);              // wait for a second
  235.   digitalWrite(LED1, LOW);    // turn the LED off by making the voltage LOW
  236.   delay(100);              // wait for a second
  237.  
  238.          // Lakástermosztát fűtésre kapcsol= A3=5V
  239.        int sensorValue = analogRead(A3);
  240.        float LAKASFUTES = sensorValue * (5.0 / 1023.0);
  241.        delay(100);
  242.        sensors.requestTemperatures(); // Send the command to get temperatures
  243.    // Kiolvassuk Ds18B20 szenzorokat.
  244.        temppufferfent    = sensors.getTempC(pufferfent);
  245.        temppuffer1_3     = sensors.getTempC(puffer1_3);
  246.        temppuffer2_3     = sensors.getTempC(puffer2_3);
  247.        temppufferlent    = sensors.getTempC(pufferlent);
  248.        float T1 = sensors.getTempC(pufferfent);
  249.        float T2 = sensors.getTempC(puffer1_3);
  250.        float T3 = sensors.getTempC(puffer2_3);
  251.        float T4 = sensors.getTempC(pufferlent);
  252.        float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
  253.        float kW = kW1*1.2771 ;
  254.        float szazalek = kW/64*100;
  255.         delay(700);
  256.        
  257.         // Read the temp from the MAX6675
  258.            fusthofok = temp.read_temp();
  259.  
  260.         // Read the temp from the DS1624
  261.              float T5 = temperature1.getTemp();
  262.        float T6 = temperature2.getTemp();
  263.        float T7 = temperature3.getTemp();
  264.        float T8 = temperature4.getTemp();
  265.        float lakaskW1 = (T5-T6)*0.001161*12.5*60;
  266.        float kazankW1 = (T7-T8)*0.001161*22*60;      
  267.      
  268.      if (LAKASFUTES > 0)
  269.      {
  270.        lakaskW = lakaskW1;
  271.       }
  272.     else
  273.      {
  274.        lakaskW = 0;
  275.       }
  276.      if(T7 > 45)
  277.      {
  278.        kazankW = kazankW1;
  279.       }
  280.      else
  281.      {
  282.        kazankW = 0;
  283.       }
  284.      delay(500);
  285.      
  286.           Serial.println(LAKASFUTES);
  287.           Serial.println(fusthofok);
  288.           Serial.println(T1);
  289.           Serial.println(T2);
  290.           Serial.println(T3);
  291.           Serial.println(T4);
  292.           Serial.println(T5);
  293.           Serial.println(T6);
  294.           Serial.println(T7);
  295.           Serial.println(T8);
  296.           Serial.println(kW);
  297.           Serial.println(szazalek);
  298.            
  299.  String dataString = "";
  300.         dataString += String(dayOfMonth, DEC);
  301.         dataString += ";";
  302.         dataString += String(hour, DEC);
  303.         dataString += ";";
  304.         dataString += String(minute, DEC);
  305.         dataString += ";";
  306.         dataString += String(second, DEC);
  307.         dataString += ";";
  308.         dataString += String(LAKASFUTES);
  309.         dataString += ";";
  310.         dataString += String(fusthofok);
  311.         dataString += ";";
  312.         dataString += String(T1);
  313.         dataString += ";";
  314.         dataString += String(T2);
  315.         dataString += ";";
  316.         dataString += String(T3);
  317.         dataString += ";";
  318.         dataString += String(T4);
  319.         dataString += ";";
  320.         dataString += String(T5);
  321.         dataString += ";";
  322.         dataString += String(T6);
  323.         dataString += ";";
  324.         dataString += String(T7);
  325.         dataString += ";";
  326.         dataString += String(T8);
  327.         dataString += ";";
  328.          dataString += String(kazankW);
  329.         dataString += ";";
  330.         dataString += String(lakaskW);
  331.         dataString += ";";      
  332.         dataString += String(kW);
  333.         dataString += ";";
  334.         dataString += String(szazalek);
  335.         dataString += ";";
  336.   dataString.replace('.',',');                    
  337.   File dataFile = SD.open("datalog.csv", FILE_WRITE);
  338.  
  339.   // if the file is available, write to it:
  340.   if (dataFile) {
  341.     dataFile.println(dataString);
  342.     dataFile.close();
  343.   }  
  344.   // if the file isn't open, pop up an error:
  345.   else
  346.   {
  347.     //Serial.println("error opening datalog.txt");
  348.   }
  349.  delay (500);
  350.      
  351.       if(T7 > 58 && fusthofok > 130)
  352.    {
  353.          
  354.        digitalWrite(LAKAS1,HIGH );
  355.        digitalWrite(SZV1START,LOW);
  356.        digitalWrite(PUFFER, LOW);  
  357.    }
  358.  else
  359.    {
  360.     if(T7 > 45)
  361.     {
  362.           digitalWrite(PUFFER, HIGH);
  363.           digitalWrite(LAKAS1, LOW);
  364.           digitalWrite(SZV1START, LOW);
  365.     }
  366.     else
  367.     {
  368.           digitalWrite(PUFFER, LOW);
  369.           digitalWrite(LAKAS1, HIGH);
  370.           digitalWrite(SZV1START, HIGH);
  371.     }  
  372.    }
  373.              
  374.   if ( LAKASFUTES > 4)
  375.           {
  376.             if(szazalek > 1)
  377.             {
  378.             digitalWrite(BYPASS, HIGH);
  379.             digitalWrite(LAKAS2, LOW); // 6. RELÉ
  380.             digitalWrite(SZV2START, LOW); // 4. RELÉ
  381.             }
  382.            else
  383.             {
  384.             digitalWrite(LAKAS2, HIGH);  
  385.             digitalWrite(BYPASS, LOW); // 5. RELÉ
  386.             digitalWrite(SZV2START, HIGH); // 4. RELÉ
  387.             }
  388.           }
  389.           else
  390.           {
  391.             digitalWrite(LAKAS2, HIGH);  
  392.             digitalWrite(BYPASS, LOW); // 5. RELÉ
  393.             digitalWrite(SZV2START, HIGH); // 4. RELÉ
  394.           }
  395.          
  396.     // clear the screen
  397.     lcd.clear();
  398.     lcd.home();
  399.     lcd.backlight();
  400.     lcd.setCursor(5,0);
  401.     lcd.print("20");
  402.     lcd.setCursor(7,0);
  403.     lcd.print(year, DEC);
  404.     lcd.setCursor(9,0);  
  405.     lcd.print(".");
  406.     lcd.setCursor(10,0);
  407.     lcd.print(month, DEC);
  408.     lcd.setCursor(12,0);
  409.     lcd.print(".");
  410.     lcd.setCursor(13,0);
  411.     lcd.print(dayOfMonth, DEC);
  412.     lcd.setCursor(15,0);
  413.     lcd.print(".");
  414.     lcd.setCursor(5,1);
  415.     lcd.print(hour, DEC);
  416.     lcd.setCursor(7,1);
  417.     lcd.print(":");
  418.     lcd.setCursor(8,1);
  419.     lcd.print(minute, DEC);
  420.     lcd.setCursor(10,1);
  421.     lcd.print(":");
  422.     lcd.setCursor(11,1);
  423.     lcd.print(second,DEC);
  424.     lcd.setCursor(1,3);
  425.     lcd.print(dayOfWeek);
  426.     lcd.setCursor(2,3);
  427.     lcd.print(".");
  428.     lcd.setCursor(5,3);
  429.     lcd.print("nap a heten");
  430.   delay(4000);
  431.     lcd.clear();
  432.     lcd.home();    lcd.backlight();
  433.     lcd.setCursor(8,0);
  434.     lcd.print("PUFFER");
  435.     lcd.setCursor(0,1);  
  436.     lcd.print("T1=");
  437.     lcd.setCursor(4,1);
  438.     lcd.print(T1);
  439.     lcd.setCursor(11,1);
  440.     lcd.print("T2=");
  441.     lcd.setCursor(14,1);
  442.     lcd.print(T2);
  443.     lcd.setCursor(0,2);
  444.     lcd.print("T3=");
  445.     lcd.setCursor(4,2);
  446.     lcd.print(T3);
  447.     lcd.setCursor(11,2);
  448.     lcd.print("T4=");
  449.     lcd.setCursor(14,2);
  450.     lcd.print(T4);
  451.     lcd.setCursor(0,3);
  452.     lcd.print("kW=");
  453.     lcd.setCursor(4,3);
  454.     lcd.print(kW);
  455.     lcd.setCursor(11,3);
  456.     lcd.print("%=");
  457.     lcd.setCursor(14,3);
  458.     lcd.print(szazalek);
  459.  wdt_reset();
  460.  delay(4000);
  461.       // clear the screen
  462.     lcd.clear();
  463.     lcd.home();
  464.     lcd.backlight();
  465.     lcd.setCursor(4,0);
  466.     lcd.print("LAKAS:");
  467.     lcd.setCursor(11,0);
  468.     lcd.print(lakaskW);
  469.     lcd.setCursor(0,1);  
  470.     lcd.print("T5=");
  471.     lcd.setCursor(4,1);
  472.     lcd.print(T5);
  473.     lcd.setCursor(11,1);
  474.     lcd.print("T6=");
  475.     lcd.setCursor(14,1);
  476.     lcd.print(T6);
  477.     lcd.setCursor(4,2);
  478.     lcd.print("KAZAN:");
  479.     lcd.setCursor(11,2);
  480.     lcd.print(kazankW);
  481.     lcd.setCursor(0,3);
  482.     lcd.print("T7=");
  483.     lcd.setCursor(4,3);
  484.     lcd.print(T7);
  485.     lcd.setCursor(11,3);
  486.     lcd.print("T8=");
  487.     lcd.setCursor(14,3);
  488.     lcd.print(T8);
  489.  delay(4000);
  490.        // clear the screen
  491.     lcd.clear();
  492.     lcd.home();
  493.     lcd.backlight();
  494.     lcd.setCursor(8,0);
  495.     lcd.print("FUSTHOFOK");
  496.     lcd.setCursor(0,1);  
  497.     lcd.print("fusthofok=");
  498.     lcd.setCursor(11,1);
  499.     lcd.print(fusthofok);
  500. wdt_reset();
  501.  } // End
A hozzászólás módosítva: Márc 7, 2016

fűtés.jpg
    
(#) dokidoki válasza hadhazik hozzászólására (») Márc 7, 2016 /
 
Pedig nincs mese, ki kellene derítened és kizárnod, hogy nem -e a tápfeszültség megrogyása kever be. Lehet egy pici induktív lökés. A nano 5 voltos tápját, ott ahol megkapja, és a GND-t már ne vidd tovább , ne is ágaztasd el. Ezek direktbe jöjjenek a táptól. Meg kellene nézned a fuse biteknél, hogy nincs e bekapcsolva a tápfeszfigyelés annak a resetje. Lépésről lépésre kellene haladni, hogy pontosan kiderüljön hol a hiba, mert akkor mi is tanulunk belőle. Jó lenne egy tárolós szkópal elkapni a jelenséget...
(hozzászólás ablaka alatt ott a LINK gomb, a kódot azzal illenék beszúrni)
(#) kapu48 válasza hadhazik hozzászólására (») Márc 7, 2016 / 1
 
Szerintem itt csak egyszerűen elfogy a memória, a rossz szervezés miatt!
??? „SD.begin(A0);” A setup-ban van a helye, nem a loop-ban!

Az arduino IDE memória felszabadítása hibás! ezt már többen is megállapították és leírták.

Ezért az Ilyen loop-ba rakott változó területfoglalásokat is kerüljük:
  1. int sensorValue = analogRead(A3);
  2. float LAKASFUTES = sensorValue * (5.0 / 1023.0);
  3. // Kiolvassuk Ds18B20 szenzorokat.
  4. temppufferfent = sensors.getTempC(pufferfent);
  5. float T1 = sensors.getTempC(pufferfent);
  6. float T2 = sensors.getTempC(puffer1_3);
  7. float T3 = sensors.getTempC(puffer2_3);
  8. float T4 = sensors.getTempC(pufferlent);
  9. float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
  10. float kW = kW1*1.2771 ;
  11. float szazalek = kW/64*100;
  12. // Read the temp from the DS1624
  13. float T5 = temperature1.getTemp();
  14. float T6 = temperature2.getTemp();
  15. float T7 = temperature3.getTemp();
  16. float T8 = temperature4.getTemp();
  17. float lakaskW1 = (T5-T6)*0.001161*12.5*60;
  18. float kazankW1 = (T7-T8)*0.001161*22*60;

A változókat a setup rész előtt hozzuk létre, a loop-ban már csak felhasználjuk!

Így elkerülhetjük a többszörös helyfoglalás okozta túlcsordulást.
Ami egy igen nehezen megtalálható hibaforrás.
A hozzászólás módosítva: Márc 7, 2016
(#) szitko válasza hadhazik hozzászólására (») Márc 7, 2016 /
 
A képen, én csak egy táp bemenetet látok. Ha optocsatolt reléket használsz, akkor két táp kellene. Egy az aduinonak és egy az optonak. Hisz az optonak az a lényege, hogy leválaszd a tápot az arduino-ról. Ha ez nem így van, akkor ne csodálkozz ha "lefagy" a rendszer.
(#) pisti válasza pisti hozzászólására (») Márc 7, 2016 /
 
A millis() függvénnyel nem működik.
A kezdés és a megállítás nem sikerül e két érték különbsége kellett volna kiírni. HELP!
(#) mikrokapcsolo válasza pisti hozzászólására (») Márc 7, 2016 1 /
 
Amikor elejteted a golyót, egy változóba (legyen most "kezd" ) letárolod a millis() értékét, majd egy interrupt lábbal pedig eltárolod egy másik változóba (legyen "veg" ) a millis() értékét.
Ezek után egy harmadik változónak ( legyen "ido" ) megmondod, hogy ido = veg - kezd. Ezután az ido változó értéke a golyó földetérésének idelye lesz. Ezt már kiírhatod lcd-re, szegmenskijelzőre, vagy a soros ablakba is.
(#) arduinoforever válasza mikrokapcsolo hozzászólására (») Márc 7, 2016 /
 
Kiegészíteném, hogy a millis() értékeket lehetőleg "long" vagy "unsigned long" változóba tárold! Gyakori hiba, hogy "int"-be akarják tárolni!
(#) pisti válasza mikrokapcsolo hozzászólására (») Márc 8, 2016 /
 
Köszönöm!
A "majd egy interrupt lábbal" részt nem értem. Kérlek egy picit részletezd! Mit kell itt csinálni?
(#) Tetye hozzászólása Márc 8, 2016 /
 
Sziasztok!
Arduino-ban hogy tudok formázni változót? Mint Bascom-ban a fusing:
  1. Temp = Fusing(T, "+00.0")

Ezt szeretném Arduino-ban is valahogy elérni ezzel:
  1. float tempC = 0;
  2.  
  3. void takeReading()
  4. {
  5.   sensors.requestTemperatures();
  6.   delay(750);  
  7.   tempC = sensors.getTempCByIndex(0);
  8.   if (tempC == -127.00) {
  9.     Serial.print("Error getting temperature.");
  10.   }
  11. //tempC=tempC formázva....
  12. }

És ha meg van formázva 1 tizedes bőven elég lenne akkor használnám fel két helyen:
  1. //Webre          
  2. client.print(tempC,DEC);
  3. //És átadni modbus-nak:
  4. Mb.R[8] = tempC*10;

Tudna valaki segíteni ?
(#) hadhazik válasza szitko hozzászólására (») Márc 8, 2016 /
 
Már külön DC 5V-ot kapnak a relék, külön az Arduino VIN bemenete DC 9V-ot.
Ma reggelre is lefagyott a rendszer, a log fájl szerint tegnap 20 órától, csak mérés módban.
(#) Kera_Will válasza pisti hozzászólására (») Márc 8, 2016 /
 
Utána kellene nézni az interupt vagy megszakítás fogalmának.
Ebből van többféle, külső és belső.
Ezen felül ezeknek van prioritása vagy elsőbbségi rendszere.
Arduino interupt / megszakítást kezelő rutinjait megismerni és azokat a portokat amik képesek külső hardveres megszakítás kezelésre.
Ezen kívül nem ártana még a prell fogalmával is tisztában lenni.Mert a lehulló tárgyad érzékelésekor ilyen jelenség is lesz ha mechanikusan kontaktussal fogod érzékelni.
(Debounce kezelése)
Talán optikaival határozottabb lenne.
A hozzászólás módosítva: Márc 8, 2016
(#) szitko válasza hadhazik hozzászólására (») Márc 8, 2016 /
 
Ha egy "kézzel" rajzolt kapcsolást fel tudsz tenni, lehet, hogy többet tudunk segíteni. Addig, csak találgatunk, hogy mi lehet a baj.
(#) icserny válasza Tetye hozzászólására (») Márc 8, 2016 / 1
 
A float típusú változónál így lehet egy tizedesre kiíratni:
  1. Serial.print(tempC,1);


A DEC, vagy HEX csak egész típusú kiíratásnál használható.
(#) Tetye válasza icserny hozzászólására (») Márc 8, 2016 /
 
Köszi!
A
  1. client.print(tempC,1);

-nél bevált így.

  1. //Webre        
  2.     Mb.R[8] = tempC*10;

Résznél pedig így.
Ott azt hiszem int-be kell át adni ami egész szám.
Ezért ha 23,568778... jön ki amit felszorzok 10-el, így lesz 235,68778... ami intben:235 lett.
A túl oldalon ezt vissza osztom 10-el és meg is van a 23,5
Köszi!
(#) hadhazik válasza szitko hozzászólására (») Márc 8, 2016 /
 
A kézi üzem rész és az optocsatolós relék a nano és a busz rész nélkül már korábban meg rajzolva.
A Fritzing-ben hogyan lehet opto csatolt relét bevinni?
A hozzászólás módosítva: Márc 8, 2016
(#) Tetye válasza Tetye hozzászólására (») Márc 9, 2016 /
 
Új falba ütköztem, a textfinder használatával.
Miért van az hogy ha:
  1. if(finder.find("ASD")){
  2. Serial.println("connection has ASD");
  3. }
  4. if(finder.find("ERT")){
  5. Serial.println("connection has ERT");
  6. }

van a programban, akkor csak az elsőt találja meg bármi van?
Ha "ASD" ha "ERT" érkezik tuti hogy a második nem talál semmit.
ha kicserélem a keresendő kifejezést akkor is csak az első talál.
Ez mi lehet ?
(#) Balázs válasza Tetye hozzászólására (») Márc 9, 2016 / 1
 
Bővebben: Link

Idézet:
„The parsing is done without using a buffer so there is no way to go back through data that has already been read.”

Idézet:
„Note that TextFinder takes a single pass through the stream, there is no way to go back to try and find or get something else (see the findUntil method ).”
(#) Tetye válasza Balázs hozzászólására (») Márc 9, 2016 /
 
Ezt én is megtaláltam, azért ennyire nem vagyok láma. Angolul viszont nem beszélek, arra viszont magamtól is rájöttem hogy valamiért kiüríti a buffer-t.
De akkor viszont hogy lehet vizsgálni arduino-ban hogy mi volt a linkben?
Bascom-ban így néz ki és nem egyszer használatos a változó.
  1. If Instr(buffer , "ASD") > 0 Then.....  
  2. If Instr(buffer , "ERT") > 0 Then.....

Itt próbáltam hogy
  1. EthernetClient client = server.available();
  2.   if (client) {
  3.     TextFinder  finder(client );
  4.     TextFinder  finder2(client );
  5.     while (client.connected()) {      
  6.       if (client.available()) {  
  7.          
  8. if(finder.find("ASD")){
  9. Serial.println("connection has ASD");
  10. }
  11. if(finder2.find("ERT")){
  12. Serial.println("connection has ERT");
  13. }

De ez se jött be.
Hogy lehet ezt megcsinálni?
(#) Balázs válasza Tetye hozzászólására (») Márc 9, 2016 / 1
 
Az a gond, hogy ez nem bufferelt olvasás, tehát ha egyszer végigolvas az adatfolyamon, utána nem tud visszamenni. Képzeld úgy, hogy van egy "kurzor", ami jelzi, hogy hol tart éppen az olvasás. Ez a kurzor csak előrefelé haladhat. A find következő hívása onnan folytatja az olvasást, ahol előzőleg abbamaradt, tehát ahol a kurzor éppen áll. Ha nem talált ASD-t, akkor az azt jelenti, hogy végigment a szövegen, tehát a kurzor a végén áll, nem meglepő, hogy utána már nem talál semmit. És ez a kurzor nem a finderhez tartozik, hanem a clienthez, ezért a második megoldásod is ugyanazt csinálja.

A legegyszerűbb megoldás, ha olyan formátumban küldöd az adatot, hogy pl. adat:ASD vagy adat:ERT. Ezután a finderrel megkeresed az "adat:" szöveget. Ha talált ilyet, akkor odaviszi a kurzort, és neked a következő három karakter kell, ezeket a client.read() függvénnyel be tudod olvasni. Itt láthatsz erre példát, a megkapott JSON struktúrából olvassa ki a "weather" adat "main" mezőjét.
(#) Tetye válasza Balázs hozzászólására (») Márc 10, 2016 /
 
Köszi így menni fog, hogy ez miért nem jutott eszembe..:S Kellemetlen dolog bő 10év bascom után arduino-t tanulni, ami már ott kézre esett és a folyamat ugyan az lenne, igazából eszembe se jut már így 30 fele...
Sikerült, leírom hátha másnak is kellhet.
Még annyi hogy a "result" és a "c" dekralálását kirakom a setup-ba, itt csak értékadás lesz.
  1. while (client.connected()) {      
  2.       if (client.available()) {  
  3.         if( finder.find("GET /") ) {
  4.  
  5.  String result = "";
  6.           if (finder.findUntil("SBM=", "\n\r")){
  7.   char c = client.read();
  8.             while(c != '&'){
  9.     result = result + c;
  10.     c = client.read();
  11.   }
  12.              Serial.println(result);    
  13. if (result == "NET"){
  14.              Serial.println("found a NET");
  15. }
  16. if (result == "DSI"){
  17.              Serial.println("found a DSI");
  18. }

Köszi még egyszer!
A hozzászólás módosítva: Márc 10, 2016
(#) Tetye válasza Tetye hozzászólására (») Márc 10, 2016 /
 
Ismét elakadtam de erre már tényleg nincs ötletem.
Itt adok értéket a tömbnek:
  1. byte DS1 = 0x28;
  2. byte DS2 = 0xAB;
  3. byte DS3 = 0xE3;
  4. byte DS4 = 0xD0;
  5. byte DS5 = 0x04;
  6. byte DS6 = 0x00;
  7. byte DS7 = 0x00;
  8. byte DS8 = 0xB1;
  9. byte dsid1[] = {DS1, DS2, DS3, DS4, DS5, DS6, DS7, DS8};

lejjebb pedig kiolvasnám:
  1. for (int i = 0 ; i < 8; i++)
  2.   {
  3.           client.print(dsid1[i],HEX);
  4.           Serial.print(dsid1[i],HEX);
  5.   }

De az eredmény mind két esetben:
  1. 28ABE3D0400B1

lett,
  1. 28ABE3D0040000B1

helyett.
Ha 0 lenne az érték eleje akkor eldobja.
Próbáltam így is megadni:
  1. byte dsid1[] = {0x28, 0xAB, 0xE3, 0xD0, 0x04, 0x00, 0x00, 0xB1};

Ezt hogy lehetne meg gátolni?
A hozzászólás módosítva: Márc 10, 2016
(#) Kovidivi válasza Tetye hozzászólására (») Márc 10, 2016 / 1
 
A serial.print függvény a bűnös. Meg kell vizsgálnod külön, hogy nulla-e a szám, és akkot duplán kiírni. Egyébként logikus. Miért írna ki két nullát a fv.? 0 az nulla, és nem 00, nem is 000, akár HEX-ben, akár BIN-ben íratod ki.
A hozzászólás módosítva: Márc 10, 2016
(#) icserny válasza Kovidivi hozzászólására (») Márc 10, 2016 / 1
 
Idézet:
„Meg kell vizsgálnod külön, hogy nulla-e a szám...”

Valóban az értéktelen nullák elhagyása okozza a problémát, de nem azt kell vizsgálni, hogy nulla-e a kiírandó, hanem hogy 0x10-nél kisebb-e.
(#) Tetye válasza icserny hozzászólására (») Márc 11, 2016 /
 
0x10-nél kisebb-e? Azt hogy tudom vizsgálni?
  1. for (int i = 0 ; i < 8; i++)
  2.       {
  3.               client.print(dsid1[i],HEX);
  4. if((dsid1[i],HEX) < 0x10){
  5.               client.print(dsid1[i],HEX);
  6. }
  7.       }

Ezt próbáltam a HEX-et elhagyva, 1 zárójelet elhagyva, de nem fordul le.
Ezekben az arduino-s szintaktikákban még nem vagyok túl jó.
Köszi
(#) Balázs válasza Tetye hozzászólására (») Márc 11, 2016 / 1
 
  1. if((dsid1[i],HEX) < 0x10)

Ilyen nincs. Kiírásnál a HEX a print függvény második argumentuma, az if hasában nem csoda, hogy nem tudja értelmezni a fordító. De haszna sem lenne, mert ugyan kiíratásnál meg lehet adni, hogy milyen formában szeretnéd látni a számot, de összehasonlításnál ez tökmindegy (ezek számok, nem sztringek!).

De egyébként sem lenne jó, mert nem kétszer akarod kiírni a számot, hanem egy nullát akarsz elé írni. Ez a kód 0x04 esetén azt fogja kiírni, hogy 44.

Egyébként ez nem "Arduino szintaktika", hanem C++ szintaktika, úgyhogy esetleg javaslom, hogy C++ tutorialokat nézegess meg. Pláne ha Arduinón kívül is érdekel a programozás, mert a C++ a belépő a modern objektumorientált nyelvek, mint pl. a Java felé.
A hozzászólás módosítva: Márc 11, 2016
(#) Tetye válasza Balázs hozzászólására (») Márc 11, 2016 /
 
Na igen és a sorrend sem lenne jó, akkor mert nem a végén hanem az elején vágja le a nullát.
  1. for (int i = 0 ; i < 8; i++)
  2.           {
  3.     if(dsid1[i] < 0x10){
  4.                   client.print("0");
  5.     }
  6.                   client.print(dsid1[i],HEX);
  7.           }

De az van hogy így sem túl nyerő, már előbb is lehagytam a HEX-et ezt írtam, de hiába.
A dsid1[i] egy hex és a 0x10 is hex. akkor miért nem tudja összehasonlítani?
(#) Balázs válasza Tetye hozzászólására (») Márc 11, 2016 / 1
 
Ennek pedig működnie kellene, de legalábbis lefordulnia mindenképp. Mi a hiba?

Idézet:
„A dsid1[i] egy hex”


Nem! Az egy szám, sima bináris kódban tárolva a memóriában. Hogy te azt 16-os, 10-es, vagy éppen 37-es számrendszerben, esetleg ASCII kódként vagy memóriacímként kezeled/íród ki, az csak tőled függ.
Következő: »»   201 / 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