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   709 / 848
(#) Elektro.on válasza SzilCsong hozzászólására (») Okt 29, 2021 /
 
Szia!
Nekem is az elmúlt hetekben volt leszakadós gondom ESP-32 -vel. Messze van a routertől.
Adat feltöltés előtt megnézem, hogy van e kapcsolat. ha nincs indítok egy reconnect -et.
de még így is sok szakadás volt de azért vissza csatlakozott.
Ideiglenesen van kirakva a cucc a kocsi mellé, féltető alá. A tuti hiba javítás az volt, hogy 10 fokot billentettem a Wifi modulon. Azóta stabilan fut szakadás nélkül.

Itt egy kis segítség!
A hozzászólás módosítva: Okt 29, 2021
(#) Josi777 válasza SzilCsong hozzászólására (») Okt 29, 2021 /
 
Nekem ESP32-nél az oldotta meg a WiFi leszakadás problémáját, hogy közvetlenül a lapka 3,3V-os kivezetésére forrasztottam egy 1000µF-os kondit. Lehet kisebb is elég lenne, de bőven elfér.
(#) Kera_Will válasza SzilCsong hozzászólására (») Okt 29, 2021 /
 
Minden elektronikus berendezés annyira működőképes mint amennyire a tápellátó rendszere megvan építve
(#) sargarigo válasza Elektro.on hozzászólására (») Okt 29, 2021 /
 
Köszi! Ezeket én is kipróbálom!
(#) GPeti1977 hozzászólása Okt 29, 2021 /
 
Rádiós órát szeretnék építeni arduino segítségével, de nem a szokásos DCF-77 vételével, hanem a lakihegyi 300m adótorony HGA22 jelét felhasználva.
WEB SDR segítségével vettem a jelet, illetve dsPic-kel már van megépített vevő:
Bővebben: HGA22 vevő

Építettem egy vevőt de nem volt elég érzékeny így szétszedtem, készül egy másik.
Az adatok ascii formátumban 200bps ami 200 baudot jelent 8E1 formátumban érkeznek.
Csatolok egy képet ahol az adás vége van, ott a leírások szerint 0x16h a stop byte, de azt sehogy nem tudom kivenni: 1 00010110 1 1
Első a startbit, a következő a 0x16 adat, 1 a paritásbit mivel páratlan volt az adatban. és a stopbit.

hga22bits.JPG
    
(#) Kera_Will válasza SzilCsong hozzászólására (») Okt 29, 2021 /
 
Rendes 5 vagy Voltos táp ami legalább 500-1000 mA leadására képes amit az ESP panel kér.
Lehet kissé túlzásnak érzed ... deee lesz tartalék a rendszerben.
Inkább hagyományos analóg trafó/greatz/ 2200µF puffer / stabilizátor IC , mint kapcsolóüzemű.
Igen persze kevésbé "izzad" a kapcsolóstáp ... mint az analóg áteresztős félvezetője.
De legalább nem pirickál a DC tápon semmiféle kósza négyszög/trapéz(akármiyen) zavarjel.
(#) Kera_Will válasza GPeti1977 hozzászólására (») Okt 29, 2021 /
 
linux alatti dekoder TAR file forrasra hivatkoznakMost akkor mivel is vennéd a 139kHz-es jelet?
Analóg rádióval amiből kapsz egy formázott négyszögjelet amit az Ardu dolgoz fel?
Maga az arduino venné a rádiójelet és dolgozná fel ?
A dsPIC-ek miként kapták a demodulált jelet ? (analóg rádióból formált négyszögjel került ki vagy dsPIC direkt veszi az RF jelet(feltéve ha elég gyors az ADje ?)

Van itt egy külön topic is ebben a témában, több vevő konstrukciót is közzétettek.
ebben a topicban nézelődj TCA440el készült a vevő
A hozzászólás módosítva: Okt 29, 2021
(#) Kera_Will válasza GPeti1977 hozzászólására (») Okt 29, 2021 /
 
Arduinot emlegeti 500 kmről veszi Romániából a lakihgyi adót 1db TCA440el ...
viszább képek az ablalkpárkányba telepített vevőről ...
(#) matyas98 hozzászólása Okt 29, 2021 /
 
Sziasztok!



Idén végzős egyetemistaként írom szakdolgozatomat. Témám egy hőkezelő kemence automatizálásának megvalósítása melyet egy atmega 328p-pu csippel végzek és ehhez terveztem és készítettem egy egyedi áramkört, hogy ne kelljen beleépítenem az egész arduino UNO boardot. Azonban felmerült néhány probléma miután beüzemeltem a rendszert az egyedi nyákkal. A program egy menürendszerrel kezdődik ahol be tudok állítani különböző értékeket és paramétereket 3 gomb segítségével (up/down/). A probléma az, hogy ha lenyomok egy gombot akkor valamilyen oknál fogva a másik gombhoz rendelt funkció reagál. Pl: gomb feladata a továbblépés de valamiért az up gomb funkciója teljesül. A programban input pullup beállítást használtam a bemenetekre. Olvastam, hogy a csipben beépített ellenállások vannak melyeket ezzel a funkcióval tudok aktiválni ezért nem kell külön a nyákra építenem, ebben nem tévedek? Valamint ugyan ilyen problémák vannak az SD kártya olvasóval ami az arduino UNO boardban tökéletesen funkcionált. Nem tudom, hogy elképzelhető-e, hogy az adott bekötő vezetékekhez közel elhaladó hálózati kábel e a probléma? Időnként a MAX31855 K típusú hőszondákhoz való áramkör se olvas ki jelet. Kicsit tanácstalan vagyok és kezdek kifutni az időből ezért számítok a segítségetekre.



Előre is köszönöm!



Ui.: Képként feltöltöm a nyák kapcsolási rajzát illetve a programot (kicsit átláthatatlan mert még nem szerkesztettem de hátha segít).

  1. #include <LiquidCrystal_I2C.h>
  2. #include <LiquidCrystal.h>  // LCD display library
  3. #include <max6675.h>        // Thermocouple card library
  4. #include <PID_v2.h>         // PID temp control library
  5. #include <SPI.h>            // Serial Peripheral Interface library
  6. #include <SD.h>             // SD memory card library (SPI is required)
  7. #include <Wire.h>
  8. LiquidCrystal_I2C lcd(0x27,20,4);
  9. #include "Adafruit_MAX31855.h"
  10. File saveFile;
  11.  
  12. //NE VÁLTOZTASD MEG
  13. const int upPin = 2;
  14. const int downPin = 3;
  15. const int Pin = 4;
  16. int optionNum = 0;
  17. boolean segPhase = 0;
  18. const int lcdRefresh = 2500;           // Refresh rate to update screen when running (ms)
  19. const int maxTemp = 1600;              // Maximum temperature (degrees).  If reached, will shut down.
  20. const int numZones = 1;                // Number of heating element + thermostat zones (max of 3)
  21. const int pidCycle = 2500;             // Time for a complete PID on/off cycle for the heating elements (ms)
  22. double pidInput[1];             // Input array for PID loop (actual temp reading  thermocouple).  Don't change.
  23. double pidOutput[1];            // Output array for PID loop (relay for heater).  Don't change.
  24. double pidSetPoint[1];          // Setpoint array for PID loop (temp you are trying to reach).  Don't change.
  25. PID pidCont[1] = {PID(&pidInput[0], &pidOutput[0], &pidSetPoint[0], 800, 47.37, 4.93, DIRECT)};  // PID controller array for each zone.  Set arguments 4/5/6 to the Kp, Ki, Kd values after tuning.
  26. const long saveCycle = 15000;          // How often to save current temp / setpoint (ms)
  27. const int tempOffset[1] = {0};  // Array to add a temp offset for each zone (degrees).  Use if you have a cold zone in your kiln or if your thermocouple reading is off.  This gets added to the setpoint.
  28. const int tempRange = 2;               // This is how close the temp reading needs to be to the set point to shift to the hold phase (degrees).  Set to zero or a positive integer.
  29. const char tempScale = 'C';  
  30.  
  31. int screenNum = 0; //4 ha vége
  32. int i = 0;
  33. double rampHours;
  34. unsigned long rampStart;
  35. unsigned long saveStart;
  36. unsigned long schedStart;
  37. unsigned long holdStart;
  38. unsigned long lcdStart;
  39. unsigned long pidStart;
  40. int segNum;
  41. int segHold;
  42. int segRamp;
  43. int segTemp;
  44. const int heaterPin = 9;
  45. String schedDesc1;
  46. double calcSetPoint;
  47. int lastTemp;
  48. MAX6675 thermo[1] = {MAX6675(5, 6 ,7)};
  49.  
  50.  
  51. void setup() {
  52.  Serial.begin(9600);
  53.  pinMode(heaterPin, OUTPUT);
  54.  pinMode(Pin, INPUT_PULLUP);
  55.  pinMode(downPin, INPUT_PULLUP);
  56.  pinMode(upPin, INPUT_PULLUP);
  57.  pidInput[0] = 0;
  58.  
  59.  lcd.begin(20, 4);
  60.  lcd.init();
  61.  lcd.backlight();
  62.  
  63.  segRamp = 1000;
  64.  segTemp = 50;
  65.  segHold = 10; //percben!
  66.  
  67.  SD.remove("temps.txt");
  68.  
  69.  lcd.backlight();
  70.   lcd.clear();
  71.   lcd.print(F("Parameter beallit:"));
  72.   lcd.setCursor(0, 1);
  73.   lcd.print(F("Temp: "));
  74.   lcd.print(segTemp);
  75.   lcd.print((char)223);
  76.   lcd.print("C");
  77.   lcd.setCursor(0, 2);
  78.   lcd.print(F("Ramp: "));
  79.   lcd.print(segRamp);
  80.   lcd.print((char)223);
  81.   lcd.print("C/hr");
  82.   lcd.setCursor(0, 3);
  83.   lcd.print(F("Hold: "));
  84.   lcd.print(segHold);
  85.   lcd.print("min");
  86.   delay(100);
  87.  
  88.  
  89. }
  90.  
  91. void loop() {
  92. //Fel gomb
  93. if(digitalRead(upPin) == LOW && screenNum == 0) {
  94.   if (optionNum == 0) {
  95.     segTemp = segTemp + 10;
  96.   }
  97.   if (optionNum == 1) {
  98.     segRamp = segRamp + 10;
  99.   }
  100.   if (optionNum == 2) {
  101.     segHold = segHold + 10;
  102.   }
  103.   updateLCD();
  104.   btnBounce(upPin);
  105. }
  106.  
  107. //Le gomb
  108. if(digitalRead(downPin) == LOW && screenNum == 0) {
  109.   if (optionNum == 0) {
  110.     segTemp = segTemp - 10;
  111.   }
  112.   if (optionNum == 1) {
  113.     segRamp = segRamp - 10;
  114.   }
  115.   if (optionNum == 2) {
  116.     segHold = segHold - 10;
  117.   }
  118.   updateLCD();
  119.   btnBounce(downPin);
  120. }
  121.  
  122. // gomb
  123. if(digitalRead(Pin) == LOW && screenNum == 0) {
  124.   if (optionNum == 0 || optionNum == 1 || optionNum == 2) {
  125.     optionNum = optionNum + 1;
  126.   }
  127.   if (optionNum == 3) {
  128.     setupPIDs();
  129.     segNum = 1;
  130.     screenNum = 1;
  131.     lcdStart = millis();
  132.     pidStart = millis();
  133.     rampStart = millis();
  134.     schedStart = millis();
  135.     updateLCD();
  136.     btnBounce(Pin);
  137.   }
  138.  
  139.   updateLCD();
  140.   btnBounce(Pin);
  141. }
  142.  
  143. //###############
  144. //program elindítása
  145. //###############
  146. //  if (digitalRead(Pin) == LOW) {
  147. //    setupPIDs();
  148. //    segNum = 1;
  149. //    screenNum = 1;
  150. //    lcdStart = millis();
  151. //    pidStart = millis();
  152. //    rampStart = millis();
  153. //    schedStart = millis();
  154. //    updateLCD();
  155. //    btnBounce(Pin);
  156. //  }
  157.  
  158.  
  159. //############
  160. //futás közben
  161. //############
  162. if (segNum >= 1) {
  163.      
  164.     // Update PID's / turn on heaters / update segment info
  165.     if (screenNum < 4) {
  166.       if (millis() - pidStart >= pidCycle) {
  167.         pidStart = millis();
  168.         updatePIDs();
  169.       }
  170.       htrControl();
  171.       updateSeg();
  172.     }
  173.  
  174.     // Refresh the LCD
  175.     if (millis() - lcdStart >= lcdRefresh) {
  176.       updateLCD();
  177.       lcdStart = millis();
  178.     }
  179.  
  180.     // Save the temps to a file on SD card
  181.     if (millis() - saveStart >= saveCycle && pidInput[0] > 0 && screenNum < 4) {
  182.       saveFile = SD.open("temps.txt", FILE_WRITE);
  183.         saveFile.print((millis() - schedStart) / 60000.0); // Save in minutes
  184.         for (i = 0; i < numZones; i++) {
  185.           saveFile.print(",");
  186.           saveFile.print(pidInput[i]);
  187.         }
  188.         saveFile.print(",");
  189.         saveFile.println(pidSetPoint[0]);
  190.       saveFile.close();
  191.  
  192.       saveStart = millis();
  193.     }  
  194.    
  195.   }
  196.  
  197.  
  198.  
  199.  }
  200.  
  201. //################
  202. //LCD frissítése
  203. //################
  204. void updateLCD() {
  205. if (screenNum == 0) {
  206.   lcd.backlight();
  207.   lcd.clear();
  208.   lcd.print(F("Parameter beallit:"));
  209.   lcd.setCursor(0, 1);
  210.   lcd.print(F("Temp: "));
  211.   lcd.print(segTemp);
  212.   lcd.print((char)223);
  213.   lcd.print("C");
  214.   lcd.setCursor(0, 2);
  215.   lcd.print(F("Ramp: "));
  216.   lcd.print(segRamp);
  217.   lcd.print((char)223);
  218.   lcd.print("C/hr");
  219.   lcd.setCursor(0, 3);
  220.   lcd.print(F("Hold: "));
  221.   lcd.print(segHold);
  222.   lcd.print("min");
  223.   delay(100);
  224. }
  225. if (screenNum == 1){
  226.  
  227.  if (segPhase == 0) {
  228.   lcd.backlight();
  229.   lcd.clear();
  230.   lcd.print(F("Felfutes: "));
  231.  
  232.   lcd.setCursor(1, 1);
  233.   lcd.print(F("Sensor1:"));
  234.   lcd.setCursor(1, 2);
  235.   lcd.print(F("Rdg: "));
  236.   lcd.print((int)pidInput[0]);
  237.   lcd.print(char(223));
  238.   lcd.print("C");
  239.   lcd.setCursor(1, 3);
  240.   lcd.print(F("Set: "));
  241.   lcd.print((int)pidSetPoint[0]);
  242.   lcd.print((char)223);
  243.   lcd.print("C");
  244.  }
  245.  if (segPhase == 1) {
  246.   lcd.backlight();
  247.   lcd.clear();
  248.   lcd.print(F("Hontartas: "));
  249.  
  250.   lcd.setCursor(1, 1);
  251.   lcd.print(F("Sensor1:"));
  252.   lcd.setCursor(1, 2);
  253.   lcd.print(F("Rdg: "));
  254.   lcd.print((int)pidInput[0]);
  255.   lcd.print((char)223);
  256.   lcd.print("C");
  257.   lcd.setCursor(1, 3);
  258.   lcd.print(F("Set: "));
  259.   lcd.print((int)pidSetPoint[0]);
  260.   lcd.print((char)223);
  261.   lcd.print("C");
  262.   lcd.setCursor(12, 1);
  263.   lcd.print(F("Hold: "));
  264.   lcd.setCursor(12, 2);
  265.   lcd.print(F("Now: "));
  266.   lcd.print((millis() - holdStart) / 60000);
  267.   lcd.print("m");
  268.   lcd.setCursor(12, 3);
  269.   lcd.print(F("Set: "));
  270.   lcd.print(segHold);
  271.   lcd.print("m");
  272.  }
  273.  }
  274.  if (screenNum == 4)
  275.  {
  276.   readTemps();
  277.   lcd.backlight();
  278.   lcd.clear();
  279.   lcd.print(F("Holepcsok kesz!"));
  280.   lcd.setCursor(0, 1);
  281.   lcd.print(F("Varj a lehulesre!"));
  282.   lcd.setCursor(0, 2);
  283.   lcd.print(F("Sensor1: "));
  284.   lcd.print((int)pidInput[0]);
  285.   lcd.print((char)223);
  286.   lcd.print("C");
  287.  }
  288. }
  289.  
  290. //################
  291. //PID beállítása
  292. //################
  293. void setupPIDs() {
  294.    pidCont[0].SetSampleTime(pidCycle);
  295.    pidCont[0].SetOutputLimits(0, pidCycle);
  296.    pidCont[0].SetMode(AUTOMATIC);
  297. }
  298.  
  299. //################
  300. //duplaklikk elkerülése
  301. //################
  302. void btnBounce (int btnPin) {
  303.   while (digitalRead(btnPin) == LOW);
  304.   delay(40);
  305.  }
  306.  
  307. //################
  308. //szám karakterszámának meghatározása
  309. //################
  310. int intLenght(int myInt) {
  311.  
  312.   myInt = abs(myInt);
  313.  
  314.   if (myInt >= 10000) {
  315.     return 5;
  316.   }
  317.   else if (myInt >= 1000) {
  318.     return 4;
  319.   }
  320.   else if (myInt >= 100) {
  321.     return 3;
  322.   }
  323.   else if (myInt >= 10) {
  324.     return 2;
  325.   }
  326.   else {
  327.     return 1;
  328.   }
  329. }
  330. //##############
  331. //hőmérséklet kiolvasása
  332. //################
  333. void readTemps() {
  334.  
  335.  
  336.     pidInput[0] = thermo[0].readCelsius();
  337.    
  338.  
  339.  
  340. }
  341.  
  342. //#############
  343. //PID frissítés
  344. //##############
  345. void updatePIDs() {
  346.  
  347.   // Get the last target temperature
  348.   if (segNum == 1) {  // Set to room temperature for first segment
  349.    
  350.       lastTemp = 24;
  351.  
  352.   }
  353.  
  354.   // Calculate the new setpoint value.  Don't set above / below target temp  
  355.   if (segPhase == 0) {
  356.     rampHours = (millis() - rampStart) / 3600000.0; //megadja mennyi ideje megy a ramp
  357.     calcSetPoint = lastTemp + (segRamp * rampHours);// kiszámolja a ramp időt és ezt beszorozva a fokot
  358.    
  359.    if (segRamp >= 0 && calcSetPoint >= segTemp) {
  360.        calcSetPoint = segTemp;
  361.       }
  362.    if (segRamp < 0 && calcSetPoint <= segTemp) {
  363.         calcSetPoint = segTemp;
  364.      }
  365.   }
  366.   else {
  367.     calcSetPoint = segTemp;  // Hold
  368.   }
  369.  
  370.   // Read the temperatures
  371.  readTemps();
  372.  
  373.   // Loop thru all PID controllers
  374.  
  375.     // Set the target temp.  Add any offset.
  376.     pidSetPoint[0] = calcSetPoint + tempOffset[0];
  377.     Serial.println(pidSetPoint[0]);
  378.     // Update the PID based on new variables
  379.     pidCont[0].Compute();
  380.  
  381.  
  382.  
  383. }
  384.  
  385. //###########
  386. //fűtés be/ki
  387. //#############
  388. void htrControl() {
  389.        
  390.     if (pidOutput[0] >= millis() - pidStart) {
  391.       digitalWrite(heaterPin, HIGH);
  392.     }
  393.     else {
  394.       digitalWrite(heaterPin, LOW);      
  395.     }
  396.     Serial.println(pidOutput[0]);
  397.   }
  398.  
  399. //felfűtési fázis és szegmens frissítése
  400. void updateSeg() {
  401.  
  402.   // Start the hold phase
  403.   if ((segPhase == 0 && segRamp < 0 && pidInput[0] <= (segTemp + tempRange)) ||
  404.       (segPhase == 0 && segRamp >= 0 && pidInput[0] >= (segTemp - tempRange))) {
  405.     segPhase = 1;
  406.     holdStart = millis();
  407.   }
  408.  
  409.   // Go to the next segment
  410.   if (segPhase == 1 && millis() - holdStart >= segHold * 60000) {
  411.     digitalWrite(heaterPin, LOW);
  412.     screenNum = 4;
  413.   }
  414.  
  415.  
  416.  
  417. }
(#) Kera_Will válasza matyas98 hozzászólására (») Okt 29, 2021 / 1
 
Idézet:
„Olvastam, hogy a csipben beépített ellenállások vannak melyeket ezzel a funkcióval tudok aktiválni ezért nem kell külön a nyákra építenem, ebben nem tévedek?”

DE tévedsz !

A uC belsejében lévő felhuzó ellenállás nagy impedanciás környezet , arra egyéltalán nem kötünk méteres drótokon nyomógombot. Max pár cm a NYÁKon meg a protoboardon.
"Antennaként működik" és összeszed minden féle zajt tüskét.
A külső pár kiloohmos ellenállások sokkal érzéketlenebbé teszik a zavarokra a portot, ennek ellenére se lógatjuk hosszú drótokra.

Ipari környezetben (hőkezelő kemence automatizálás) illene védelemmel illeszteni a uC be/ki portokat.Milyen egyetem az ahol ilyen 0. belépő szintű tudást sem tanítanak meg ?!?!

Optocsatoló ki/be meneneti portokon.
Azután köthető rá a uC -re bármilyen periféria.
Az elvi rajzod kevés nem látjuk a külső perifériában lévő beavatkozó/végrehajtó szerveket.
OK persze a Te "szabadalmi védelemed" alatt áll , de elárulhatnád.
A hozzászólás módosítva: Okt 29, 2021
(#) matyas98 válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
Ezért gondoltam a pullup használatát mivel akkor földre kell húznom az adott bemeneteket ezért nem jönnek képbe az esetleges zavarok. Vagy ilyenkor, hogy kerül alacsony jel a bemenetre?

Nekem ez egy mellékág nem villamosmérnöknek tanulok hanem mechatronikusnak, ott meg inkabb PLC-k és robotok vannak. Ezért kérdezek, hogy tanuljak...

Köszi a gyors választ a mostani felvetésemre van valami ötleted?
(#) Kera_Will válasza matyas98 hozzászólására (») Okt 29, 2021 / 1
 
Idézet:
„Valamint ugyan ilyen problémák vannak az SD kártya olvasóval ami az arduino UNO boardban tökéletesen funkcionált. Nem tudom, hogy elképzelhető-e, hogy az adott bekötő vezetékekhez közel elhaladó hálózati kábel e a probléma?”


A uC-t tartalmazó panelt kis szintű környezetét védett / árnyékolt környezetben helyezzük.
Minél távolabb a nagy feszültségű/áramú energiát szállító vezetékektől.
(#) matyas98 válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
Köszi a hasznos infókat sokat segítesz vele. Ez nyilván csak egy prototípus egyelőre a kevés idő miatt de szeretném majd később tökéletesíteni.
(#) SzilCsong válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
Szinte biztos, hogy valami rázavar az esp-re, mert több esp is van a házba és egyik se működött.
Egy dc szellőztető venti ment, most kikapcsolt és egyből jó minden... jééé
Lehet, hogy annak a dc 12v-os motornak kellene megcsinálnom a szűrését, nemis az esp-vel van a gond
(#) SzilCsong válasza Elektro.on hozzászólására (») Okt 29, 2021 /
 
Köszi, ezek jó tippek
(#) Kera_Will válasza matyas98 hozzászólására (») Okt 29, 2021 / 1
 
OK PLC-t akkor te csak eddig mint "fekete dobozt" láttad. Csak mint sorkapcsot használtad.
A belső lelkivilága elvolt rejtve. Igen most neked a PLC-k belső lelki világát is meg kell tervezned.

A lényeg az , hogy a bemeneti nyomógombok nem a uC portjait rángatják. Hanem egy ledet kapcsolgatnak ki/be ami az optocsatolóban van.Másik oldalon egy fototranzisztort nyit/zár a led.
A fototranzisztor Collektora megy a uC portra a kapcsoló kontaktusa helyett és az emittere a földre.
Ekkor ha áram folyik át a leden oda kell teljesítmény is nem csak potenciál .
Akkor kapcsolni fog a tranzisztor is a uC portján.

Kicsit sántító durva példa:
Csupasz Kézzel meg fogod a ledet és nem történik semmi, de ha a magas impedanciásan felhúzott uC portot kézzel meg fogod billegni fog, letudod húzni föld pontra a nedvesebb / kisebb bőröd ellenállássával a belső felhúzóellenálláshoz képest.

Ugyan ez a helyzet ha a hosszú dróton antennaként több voltos tüske is elő áll és ha éppen negatívabb a tüske iránya a port potenciájához képest akkor leis húzza a portodat függetlenül a gombok állapotától.
A hozzászólás módosítva: Okt 29, 2021
(#) Kera_Will válasza matyas98 hozzászólására (») Okt 29, 2021 / 1
 
Az optocsatoló ledje elé illik egy polaritás független áramgenerátort is bekötni.
Így közel függetlenné válik a külső nyomógombtól érkező feszültség szintektől is.
pl: egy greatz híd után kötött fetből és ellenállásból álló áramgenerátor "műkapcsolás" TTL szinttől váltó 230 Voltig bármit elvisel jól méretezett/megválasztott alkatrészekből építve.
A hozzászólás módosítva: Okt 29, 2021
(#) Skori válasza matyas98 hozzászólására (») Okt 29, 2021 / 1
 
A nyomógombok közvetlen bekötése csak kicsi távolság esetén működik jól, és a gombok prellezését is kezelni kell a szoftverben.

Kicsit hosszabb vezetékek esetén külső felhúzó ellenállás a gombra, majd egy RC aluláteresztőn keresztül mehet az MCU-ra. Ilyenkor az RC tag a zavarok nagy részét ki tudja szűrni, és megfelelő időállandó esetén a prellezést is. A nyomógombra további védelemként mehet még zener dióda is.

Ha ennél komolyabb védelem kell az MCU bemenetére, akkor az előző felállás + optocsatoló, vagy az előző felállás + kis relé. Ilyen esetben az optocsatoló ledjét a stabilizátor előtti valamivel nagyobb feszről szoktam járatni (megfelelő előtét-ellenállással).
(#) GPeti1977 válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
Az elképzelés az hogy lekeverem a jelet az ardu által előállított 133kHz jellel 3,2kHz re, majd ezt négyszögesítem az menne az interrupt pinre. Rendeltem TCA440 IC-t azzal folytatom.
Eddig majdnem jó volt csak a zaj illetve az interrupt jittere miatt zajos volt a jel, illetve más adatokat kaptam mint vártam de ismétlődően.
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. volatile unsigned long sample;
  4. volatile unsigned long lastsample;
  5. int inByte = 0;
  6. #define window_size 4
  7. int index = 0;
  8. int value = 0;
  9. int sum = 0;
  10. int readings[window_size];
  11. volatile int averaged = 0;
  12.  
  13. void setup()
  14. {
  15. //Disable interrupts
  16. cli();
  17. TCCR1A = 0;
  18. TCCR1B = 0;
  19. OCR1A = 30;//30 133,288khz  432 402 2,34khz  
  20. TCCR1A = _BV(WGM10) | _BV(COM1A0);
  21. TCCR1B = _BV(WGM13) | _BV(CS10);
  22. DDRB |= _BV(1);
  23. sei();
  24. pinMode(2, INPUT_PULLUP);
  25. pinMode(13, OUTPUT);
  26. attachInterrupt(digitalPinToInterrupt(2), sign, FALLING);
  27. Serial.begin(115200);
  28. Serial.println("OK");
  29. }
  30. void loop()
  31. {
  32.    
  33. }
  34. //412 427 398
  35. void sign(){
  36.   sample = micros();
  37.   sum = sum - readings[index];
  38.   value = sample - lastsample;
  39.   if(value < 360) value = 360;
  40.   if(value > 500) value = 500;
  41.   readings[index] = value;
  42.   sum = sum + value;
  43.   index = (index + 1) % window_size;
  44.   averaged = sum / window_size;  
  45.   lastsample = sample;  
  46.   if(averaged < 422){
  47.     PORTB = PORTB & B11011111;
  48.   }
  49.   if(averaged > 436){
  50.     PORTB = PORTB | B00100000;
  51.   }
  52.  }
(#) Kera_Will válasza GPeti1977 hozzászólására (») Okt 29, 2021 /
 
Én nembántanám az ardut az RF jel eloallitasaval l, nem lesz eleg tiszta kevero jeled igy a keveresi termek is sokkal rosszab lesz, tehát jel/zaj viszony is romlik , tehat suketebb lesz a vevo is.
Esetleg olyan uC valasztani amiben teljesen fuggetlen tobb "pwm vas van "es nem fugg a hasznalt fuggvenyektol.
Ertem hogy alkatreszt sporolnal az egybol uC erkezo 130KHz pulzaval.
Nem 328al hanem a nagyobb tesoval kellen probalkozni.
(#) mateatek válasza matyas98 hozzászólására (») Okt 29, 2021 /
 
A nyomógombokat a zavarok miatt nem is úgy kell kezelni, hogy a lenyomásra reagáljon a program. Ha körbenézel, mindenhol a gomb felengedésekor teljesül a feltétel a programban.
Lenyomáskor a program észre veszi, hogy lenyomtad. Egy kis időzítés után megint megnézi, hogy még mindig le van-e nyomva. Ha még mindig, akkor vélhetőleg nem zavar. Ezután a programtól függően vagy egy while ciklusban várja a gomb felengedését, vagy ha ez nem lehetséges a program egyéb adottságai miatt, akkor időnként megnézi, hogy föl lett-e engedve a gomb. Ha föl lett engedve, akkor teljesül a feltétel.
(#) GPeti1977 válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
Tiszta jitter mentes a jele, meg rezgőkörrel már leszinuszosítottam, egy DDS modul lett volna ott de nem találom.
Az ardu csak a timer0 használja, timer1, timer2 szabad
A hozzászólás módosítva: Okt 29, 2021
(#) Kera_Will válasza GPeti1977 hozzászólására (») Okt 29, 2021 /
 
DDS ..? . 16MHz elosztod 120al pont 133.3 KHz korul kapsz negyszoget igaz akkor vhogy kikell csalogatni az ardu orajelet az oszto ichez. Avagy 60al majd 2vel a szimmetrikusabb negyszogjelhez.
Keveronek meg cd4066 mint kevero vagy 240el osztasz es polyakov 2 diodas keverot fele frekin hajtod.
Szinusositanod se kell a negyszog jelet a 4066hoz.
PA2OHH mezitlabas vevoit lesd meg ... hasonloak avagy fazistolast is vegeznek jobb veteli jellemzokkel rendelkeznek ugy.
A hozzászólás módosítva: Okt 29, 2021
(#) GPeti1977 válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
Az előző rádióban pont a keverés nem sikerült, a jelet CD4069 CMOS inverterekkel erősítettem analóg üzemben. Csak az IC s meg a dual gate mosfet keverőt ismerem, a cd4066 hoz, meg a diódáshoz tudnál linket mutatni?
(#) Kera_Will válasza GPeti1977 hozzászólására (») Okt 29, 2021 / 1
 
pa2ohh fazistolt szinkrodin vevo 3.5MHz
Ezen az elven fixfrekire 135 kHz kell RC tagokkal alul /felul atereszto szurokkel 45 fokos fazistolas szamolni kevero 4066 ele .
Utana kevero 4066 kimeneten szinten RC tagokkal a hangfrekis savon 45 fokos fazistolast RC tagokra.
Tobb hasonlo konstrukcioja van , erdemes atnezni az oldalat.
(#) dokidoki válasza Kera_Will hozzászólására (») Okt 29, 2021 /
 
uC órajele még leosztva is meglehetősen jitteres lesz. De ki kell próbálni.
(#) kissi válasza mateatek hozzászólására (») Okt 29, 2021 /
 

Szia!
Idézet:
„Ha körbenézel, mindenhol a gomb felengedésekor teljesül a feltétel a programban.”
Nem néztem meg, de egy gombra mindig a lenyomásakor kell reagálni ( persze megbizonyosodhatsz róla, hogy nem zavarjel, kb. 20-30ms!), mert különben "szétnyomják"--> azt érzékelve, hogy nem reagál !
(#) Skori válasza kissi hozzászólására (») Okt 30, 2021 / 1
 
Sőt ügyesebb nyomógomb kezelő megoldások nem csak a prellezést tudják jól kezelni, hanem külön eseményként a lenyomást, a hosszú lenyomást, nyomva tartást és a felengedést is.
Pl. fel-le állító gombok esetén ha lenyomom -> lép egyet, ha nyomva tartom elkezd magától lépegetni, a gomb felengedésekor meg pl. menti a beállított értéket.
Aztán ezt továbbgondolva különféle gombnyomás-kombinációkat, vagy gombnyomás sorozatot is felismerhet a program.
(#) mateatek válasza kissi hozzászólására (») Okt 30, 2021 /
 
Sosem nyomtam még szét az egerem gombját, pedig az is fölengedéskor reagál.
Következő: »»   709 / 848
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