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   808 / 848
(#) KoblogPerGyok válasza gaspa hozzászólására (») Júl 5, 2023 /
 
Nem túl nagy a kártya kapacitása? Tud ekkorát kezelni az Arduino?
(#) bbb válasza gaspa hozzászólására (») Júl 5, 2023 /
 
A "lemezfoglalási egység" egy blokkot jelent. Ekkora méretű blokkokra osztja fel a tárterületet formázáskor a rendszer. A probléma nálad úgy néz ki, hogy nem ugrasz a következő blokkra, hanem mindig a legelsőt írod, ameddig tudod (ezért volt, hogy a 64k-s blokkra formázva 64k ment a kártyára, 32-nél meg annyi).
(#) gaspa válasza KoblogPerGyok hozzászólására (») Júl 6, 2023 /
 
16 Gb a kártya,mint említettem eddig jól működött.
(#) gaspa válasza bbb hozzászólására (») Júl 6, 2023 /
 
Valóban nem megy a következő blokkokra,ez itt a kérdés, miért és hogyan lehetne orvosolni?Ez egy új kártya volt,az első formázás után sokáig jól működött.Ha nem derül ki,kénytelen leszek újat venni,azzal talán előrébb jutok.
(#) GPeti1977 hozzászólása Júl 22, 2023 / 5
 
DS1833 óra IC-ben van 56 byte szabad terület RAM amely az elem segítségével megőrzi a tartalmat a tápfeszültség elvétele után is, az IC-hez találtam példát az órához de a RAM használatához nem, és más óra IC-hez sem.
Készítettem egy kiegészítést hogy tudjunk írni olvasi byte / unsigned char, unsigned integer (2 byte), vagy float (4byte) változókat.
Bővebben: DS1833 RAM
(#) Régi motoros hozzászólása Júl 25, 2023 /
 
Próbáltam frissíteni az ardu boardokat. Na erre varrjatok gombot.
(#) Skori válasza Régi motoros hozzászólására (») Júl 25, 2023 / 2
 
Azt hiszem ez nem az Arduino-t, hanem inkább inkább az Avast-ot minősíti...
A hozzászólás módosítva: Júl 25, 2023
(#) Régi motoros válasza Skori hozzászólására (») Júl 25, 2023 / 1
 
Hát igen.
Mostanában kezdem én is azt hinni, hogy ez az ingyenes vírusírtó egyre több oldalt pakol feketelistára.
(#) pipi válasza Régi motoros hozzászólására (») Júl 25, 2023 /
 
Én is belefutottam, kikapcsolt avast-al felment, aztán indítás után a fordításnál, megint jót szórakozott, aztán béke lett
(#) MATA hozzászólása Júl 30, 2023 /
 
Üdv mesterek!
A következő gondom lenne megépítettem ezt az áramkört működik is csak éppen nem lehet vagy csak véletlen lehet váltani a két kijelzés között a SET gombbal hiába nyomkodom.
https://oshwlab.com/wagiminator/y-attiny85-electronic-load
Itt van a kód is:
  1. // ===================================================================================
  2. // Project:   TinyLoad - Simple Electronic Constant Current Dummy Load (ATtiny45/85)
  3. // Version:   v1.2
  4. // Year:      2020 - 2021
  5. // Author:    Stefan Wagner
  6. // Github:    https://github.com/wagiminator
  7. // ===================================================================================
  8. //
  9. // Description:
  10. // ------------
  11. // The ATtiny measures voltage, current and temperature of the heat sink,
  12. // calculates power, energy and electric charge, controls the fan and displays
  13. // all relevant data on the OLED. The button is used to switch between
  14. // power/resistance and energy/charge display.
  15. //
  16. // References:
  17. // -----------
  18. // The I²C OLED implementation is based on TinyOLEDdemo
  19. //
  20. // OLED font was adapted from Neven Boyanov and Stephen Denne
  21. //
  22. // Wiring:
  23. // -------
  24. //                                   +-\/-+
  25. //     Button/NTC --- RST ADC0 PB5  1|°   |8  Vcc
  26. // Voltage Sensor ------- ADC3 PB3  2|    |7  PB2 ADC1 -------- OLED SCK
  27. // Current Sensor ------- ADC2 PB4  3|    |6  PB1 AIN1 OC0B --- Fan Control
  28. //                             GND  4|    |5  PB0 AIN0 OC0A --- OLED SDA
  29. //                                   +----+
  30. //
  31. // Compilation Settings:
  32. // ---------------------
  33. // Core:    ATtinyCore (https://github.com/SpenceKonde/ATTinyCore)
  34. // Board:   ATtiny25/45/85 (No bootloader)
  35. // Chip:    ATtiny45 or 85 (depending on your chip)
  36. // Clock:   1 MHz (internal)
  37. // B.O.D.:  2.7V
  38. //
  39. // Leave the rest on default settings. Don't forget to "Burn bootloader"!
  40. // No Arduino core functions or libraries are used. Use the makefile if
  41. // you want to compile without Arduino IDE.
  42. //
  43. // Note: RESET pin is used as a weak analog input for the set button and the NTC
  44. //       thermistor. You don't need to disable the RESET pin as the voltage won't
  45. //       go below 40% of Vcc.
  46. //
  47. // Fuse settings: -U lfuse:w:0x62:m -U hfuse:w:0xd5:m -U efuse:w:0xff:m
  48. //
  49. // Operating Instructions:
  50. // -----------------------
  51. // The ADC of the ATtiny does its best to make the tinyLoad a pretty accurate
  52. // tool, but it might need a little calibration.
  53. //
  54. // How to calibrate:
  55. // Set ULCAL and ILCAL to "1" in the sketch, compile and upload.
  56. // Choose a stable input voltage of around 5V and turn the poti until the
  57. // display shows a current of around 0.7A. Measure the voltage and the current
  58. // with a trusty multimeter or a good lab bench power supply.
  59. // Calculate the voltage calibration factor as follows:
  60. // ULCAL = voltage measured with multimeter / voltage shown on OLED.
  61. // Calculate the current calibration factor as follows:
  62. // ILCAL = current measured with multimeter / current shown on OLED.
  63. // Set the ULCAL and ILCAL value in the sketch, compile and upload again.
  64. //
  65. // Notes:
  66. // - Use a good heatsink with a 5V fan for the MOSFET!
  67. // - Be careful with high power loads! This device is called "tinyLoad" for a reason!
  68. // - Always turn the POTI full counter-clockwise before connecting the load!
  69. // - Due to the input offset voltage of the OpAmp the minimum load current is 17mA.
  70. // - The maximum load current is 4.5A, however for small voltages it might be less.
  71. // - Do not exceed the maximum voltage of 26V!
  72.  
  73.  
  74. // ===================================================================================
  75. // Libraries, Definitions and Macros
  76. // ===================================================================================
  77.  
  78. // Libraries
  79. #include <avr/io.h>                             // for GPIO
  80. #include <avr/sleep.h>                          // for sleep functions
  81. #include <avr/pgmspace.h>                       // for data stored in program memory
  82. #include <avr/interrupt.h>                      // for interrupts
  83. #include <util/delay.h>                         // for delays
  84.  
  85. // Pin assignments
  86. #define PIN_SDA       PB0                       // I2C serial data pin, connected to OLED
  87. #define PIN_SCL       PB2                       // I2C serial clock pin, connected to OLED
  88. #define PIN_FAN       PB1                       // pin connected to MOSFET for fan control
  89. #define PIN_VOLTAGE   PB3                       // pin for voltage measurement
  90. #define PIN_CURRENT   PB4                       // pin for current measurement
  91. #define PIN_NTC       PB5                       // pin connected to NTX and button
  92.  
  93. // Calibration values for internal 1.1V reference
  94. #define ULCAL         1                        // linear voltage calibration factor
  95. #define ILCAL         0.921                        // linear current calibration factor
  96.  
  97. // Parameter definitions
  98. #define MAXPOWER      15                        // max power in watt
  99. #define UCONV         11486336                  // voltage conversion = 1000*64*1023*R11/(R10+R11)
  100. #define ICONV         72019200                  // current conversion = 1000*64*1023*R_shunt*(R8+R9)/R9
  101.  
  102. // RESET pin ADC values (tweak a little, if button/NTC do not work correctly)
  103. #define NTCMIN        550                       // lowest ADC value for NTC; below is a button press
  104. #define NTCFAN        625                       // turn on the fan if ADC value is below
  105. #define NTCHOT        560                       // show warning screen if ADC value is below
  106.  
  107. // Pin manipulation macros
  108. #define pinInput(x)   DDRB  &= ~(1<<(x))        // set pin to INPUT
  109. #define pinOutput(x)  DDRB  |=  (1<<(x))        // set pin to OUTPUT
  110. #define pinLow(x)     PORTB &= ~(1<<(x))        // set pin to LOW
  111. #define pinHigh(x)    PORTB |=  (1<<(x))        // set pin to HIGH
  112. #define pinDisable(x) DIDR0 |=  (1<<(x))        // disable digital input buffer
  113. #define pinRead(x)    (PINB &   (1<<(x)))       // READ pin
  114. #define pinADC(x)     ((x)==2?1:((x)==3?3:((x)==4?2:0))) // convert pin to ADC port
  115.  
  116. // Pin to ADC port conversion macros
  117. #define AP_NTC        pinADC(PIN_NTC)           // ADC port of fan pin
  118. #define AP_CURRENT    pinADC(PIN_CURRENT)       // ADC port of current sense pin
  119. #define AP_VOLTAGE    pinADC(PIN_VOLTAGE)       // ADC port of voltage sense pin
  120.  
  121. // ===================================================================================
  122. // I2C Master Implementation (write only)
  123. // ===================================================================================
  124.  
  125. // I2C macros
  126. #define I2C_SDA_HIGH()  pinInput(PIN_SDA)       // release SDA   -> pulled HIGH by resistor
  127. #define I2C_SDA_LOW()   pinOutput(PIN_SDA)      // SDA as output -> pulled LOW  by MCU
  128. #define I2C_SCL_HIGH()  pinInput(PIN_SCL)       // release SCL   -> pulled HIGH by resistor
  129. #define I2C_SCL_LOW()   pinOutput(PIN_SCL)      // SCL as output -> pulled LOW  by MCU
  130.  
  131. // I2C transmit one data byte to the slave, ignore ACK bit, no clock stretching allowed
  132. void I2C_write(uint8_t data) {
  133.   for(uint8_t i=8; i; i--, data<<=1) {          // transmit 8 bits, MSB first
  134.     (data&0x80)?I2C_SDA_HIGH():I2C_SDA_LOW();   // SDA depending on bit
  135.     I2C_SCL_HIGH();                             // clock HIGH -> slave reads the bit
  136.     I2C_SCL_LOW();                              // clock LOW again
  137.   }
  138.   I2C_SDA_HIGH();                               // release SDA for ACK bit of slave
  139.   I2C_SCL_HIGH();                               // 9th clock pulse is for the ACK bit
  140.   I2C_SCL_LOW();                                // but ACK bit is ignored
  141. }
  142.  
  143. // I2C start transmission
  144. void I2C_start(uint8_t addr) {
  145.   I2C_SDA_LOW();                                // start condition: SDA goes LOW first
  146.   I2C_SCL_LOW();                                // start condition: SCL goes LOW second
  147.   I2C_write(addr);                              // send slave address
  148. }
  149.  
  150. // I2C stop transmission
  151. void I2C_stop(void) {
  152.   I2C_SDA_LOW();                                // prepare SDA for LOW to HIGH transition
  153.   I2C_SCL_HIGH();                               // stop condition: SCL goes HIGH first
  154.   I2C_SDA_HIGH();                               // stop condition: SDA goes HIGH second
  155. }
  156.  
  157. // ===================================================================================
  158. // OLED Implementation
  159. // ===================================================================================
  160.  
  161. // OLED definitions
  162. #define OLED_ADDR       0x78                    // OLED write address
  163. #define OLED_CMD_MODE   0x00                    // set command mode
  164. #define OLED_DAT_MODE   0x40                    // set data mode
  165. #define OLED_INIT_LEN   9                       // length of init command array
  166.  
  167. // Standard ASCII 5x8 font (adapted from Neven Boyanov and Stephen Denne)
  168. const uint8_t OLED_FONT[] PROGMEM = {
  169.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00,
  170.   0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62,
  171.   0x36, 0x49, 0x55, 0x22, 0x50, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00,
  172.   0x00, 0x41, 0x22, 0x1C, 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, 0x08, 0x08, 0x3E, 0x08, 0x08,
  173.   0x00, 0x00, 0xA0, 0x60, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x60, 0x60, 0x00, 0x00,
  174.   0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00,
  175.   0x42, 0x61, 0x51, 0x49, 0x46, 0x21, 0x41, 0x45, 0x4B, 0x31, 0x18, 0x14, 0x12, 0x7F, 0x10,
  176.   0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x30, 0x01, 0x71, 0x09, 0x05, 0x03,
  177.   0x36, 0x49, 0x49, 0x49, 0x36, 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x36, 0x36, 0x00, 0x00,
  178.   0x00, 0x56, 0x36, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14,
  179.   0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x51, 0x09, 0x06, 0x32, 0x49, 0x59, 0x51, 0x3E,
  180.   0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22,
  181.   0x7F, 0x41, 0x41, 0x22, 0x1C, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01,
  182.   0x3E, 0x41, 0x49, 0x49, 0x7A, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00,
  183.   0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40,
  184.   0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x4E, 0x71, 0x01, 0x71, 0x4E,
  185.   0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46,
  186.   0x46, 0x49, 0x49, 0x49, 0x31, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x3F, 0x40, 0x40, 0x40, 0x3F,
  187.   0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63,
  188.   0x07, 0x08, 0x70, 0x08, 0x07, 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x00,
  189.   0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 0x7F, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04,
  190.   0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x01, 0x02, 0x04, 0x00, 0x20, 0x54, 0x54, 0x54, 0x78,
  191.   0x7F, 0x48, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x20, 0x38, 0x44, 0x44, 0x48, 0x7F,
  192.   0x38, 0x54, 0x54, 0x54, 0x18, 0x08, 0x7E, 0x09, 0x01, 0x02, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,
  193.   0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,
  194.   0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,
  195.   0x7C, 0x08, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x24, 0x24, 0x24, 0x18,
  196.   0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x20,
  197.   0x04, 0x3F, 0x44, 0x40, 0x20, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C,
  198.   0x3C, 0x40, 0x30, 0x40, 0x3C, 0x44, 0x28, 0x10, 0x28, 0x44, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,
  199.   0x44, 0x64, 0x54, 0x4C, 0x44, 0x08, 0x36, 0x41, 0x41, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00,
  200.   0x00, 0x41, 0x41, 0x36, 0x08, 0x08, 0x04, 0x08, 0x10, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  201. };
  202.  
  203. // OLED init settings
  204. const uint8_t OLED_INIT_CMD[] PROGMEM = {
  205.   0xC8, 0xA1,                                   // flip screen
  206.   0xA8, 0x1F,                                   // set multiplex ratio
  207.   0xDA, 0x02,                                   // set com pins hardware configuration
  208.   0x8D, 0x14,                                   // set DC-DC enable
  209.   0xAF                                          // display on
  210. };
  211.  
  212. // OLED variables
  213. uint8_t OLED_x, OLED_y;                         // current cursor position
  214. const uint16_t DIVIDER[] PROGMEM = {10000, 1000, 100, 10, 1}; // BCD conversion array
  215.  
  216. // OLED init function
  217. void OLED_init(void) {
  218.   I2C_start(OLED_ADDR);                         // start transmission to OLED
  219.   I2C_write(OLED_CMD_MODE);                     // set command mode
  220.   for(uint8_t i = 0; i < OLED_INIT_LEN; i++)
  221.     I2C_write(pgm_read_byte(&OLED_INIT_CMD[i]));// send the command bytes
  222.   I2C_stop();                                   // stop transmission
  223. }
  224.  
  225. // OLED set the cursor
  226. void OLED_setCursor(uint8_t xpos, uint8_t ypos) {
  227.   I2C_start(OLED_ADDR);                         // start transmission to OLED
  228.   I2C_write(OLED_CMD_MODE);                     // set command mode
  229.   I2C_write(xpos & 0x0F);                       // set low nibble of start column
  230.   I2C_write(0x10 | (xpos >> 4));                // set high nibble of start column
  231.   I2C_write(0xB0 | (ypos & 0x07));              // set start page
  232.   I2C_stop();                                   // stop transmission
  233.   OLED_x = xpos; OLED_y = ypos;                 // set the cursor variables
  234. }
  235.  
  236. // OLED clear line
  237. void OLED_clearLine(uint8_t line) {
  238.   OLED_setCursor(0, line);                      // set cursor to line start
  239.   I2C_start(OLED_ADDR);                         // start transmission to OLED
  240.   I2C_write(OLED_DAT_MODE);                     // set data mode
  241.   for(uint8_t i=128; i; i--) I2C_write(0x00);   // clear the line
  242.   I2C_stop();                                   // stop transmission
  243. }
  244.  
  245. // OLED clear screen
  246. void OLED_clearScreen(void) {
  247.   for(uint8_t i=0; i<4; i++)                    // 4 lines
  248.     OLED_clearLine(i);                          // clear line
  249. }
  250.  
  251. // OLED plot a single character
  252. void OLED_plotChar(char c) {
  253.   uint16_t ptr = c - 32;                        // character pointer
  254.   ptr += ptr << 2;                              // -> ptr = (ch - 32) * 5;
  255.   I2C_write(0x00);                              // write space between characters
  256.   for(uint8_t i=5 ; i; i--) I2C_write(pgm_read_byte(&OLED_FONT[ptr++]));
  257.   OLED_x += 6;                                  // update cursor
  258.   if(OLED_x > 122) {                            // line end ?
  259.     I2C_stop();                                 // stop data transmission
  260.     OLED_setCursor(0,++OLED_y);                 // set next line start
  261.     I2C_start(OLED_ADDR);                       // start transmission to OLED
  262.     I2C_write(OLED_DAT_MODE);                   // set data mode
  263.   }
  264. }
  265.  
  266. // OLED print a string from program memory
  267. void OLED_printPrg(const char* p) {
  268.   I2C_start(OLED_ADDR);                         // start transmission to OLED
  269.   I2C_write(OLED_DAT_MODE);                     // set data mode
  270.   char ch = pgm_read_byte(p);                   // read first character from program memory
  271.   while(ch) {                                   // repeat until string terminator
  272.     OLED_plotChar(ch);                          // print character on OLED
  273.     ch = pgm_read_byte(++p);                    // read next character
  274.   }
  275.   I2C_stop();                                   // stop transmission
  276. }
  277.  
  278. // OLED print 8-bit value as 2-digit decimal (BCD conversion by substraction method)
  279. void OLED_printDec8(uint8_t value) {
  280.   uint8_t digitval = 0;                         // start with digit value 0
  281.   while(value >= 10) {                          // if current divider fits into the value
  282.     digitval++;                                 // increase digit value
  283.     value -= 10;                                // decrease value by divider
  284.   }
  285.   OLED_plotChar(digitval + '0');                // print first digit
  286.   OLED_plotChar(value + '0');                   // print second digit
  287. }
  288.  
  289. // OLED print 16-bit value as decimal (BCD conversion by substraction method)
  290. void OLED_printDec16(uint16_t value) {
  291.   uint8_t leadflag = 0;                         // becomes "1" on first digit
  292.   for(uint8_t digit = 0; digit < 5; digit++) {  // 5 digits
  293.     uint8_t digitval = 0;                       // start with digit value 0
  294.     uint16_t divider = pgm_read_word(&DIVIDER[digit]); // current divider
  295.     while(value >= divider) {                   // if current divider fits into the value
  296.       leadflag = 1;                             // end of leading spaces
  297.       digitval++;                               // increase digit value
  298.       value -= divider;                         // decrease value by divider
  299.     }
  300.     if(leadflag || (digit == 4)) OLED_plotChar(digitval + '0'); // print the digit
  301.     else OLED_plotChar(' ');                    // print leading space
  302.   }
  303. }
  304.  
  305. // OLED print float right-aligned
  306. void OLED_printValue(float value) {
  307.   value += 0.005;                               // for rounding
  308.   uint16_t front = value;                       // left side of decimal
  309.   uint8_t back = (value - front) * 100 ;        // right side of decimal
  310.   I2C_start(OLED_ADDR);                         // start transmission to OLED
  311.   I2C_write(OLED_DAT_MODE);                     // set data mode
  312.   OLED_printDec16(front);                       // print left side of decimal
  313.   OLED_plotChar('.');                           // print decimal
  314.   OLED_printDec8(back);                         // print right side of decimal
  315.   I2C_stop();                                   // stop transmission to OLED
  316. }
  317.  
  318. // ===================================================================================
  319. // Millis Counter Implementation for Timer0
  320. // ===================================================================================
  321.  
  322. volatile uint32_t MIL_counter = 0;              // millis counter variable
  323.  
  324. // Init millis counter
  325. void MIL_init(void) {
  326.   OCR0A  = 124;                                 // TOP: 124 = 1000kHz / (8 * 1kHz) - 1
  327.   TCCR0A = (1<<WGM01);                          // timer0 CTC mode
  328.   TCCR0B = (1<<CS01);                           // start timer0 with prescaler 8
  329.   TIMSK  = (1<<OCIE0A);                         // enable output compare match interrupt
  330. }
  331.  
  332. // Read millis counter
  333. uint32_t MIL_read(void) {
  334.   cli();                                        // disable interrupt for atomic read
  335.   uint32_t result = MIL_counter;                // read millis counter
  336.   sei();                                        // enable interrupts
  337.   return result;                                // return millis counter value
  338. }
  339.  
  340. // Timer0 compare match A interrupt service routine (every millisecond)
  341. ISR(TIM0_COMPA_vect) {
  342.   MIL_counter++;                                // increase millis counter
  343. }
  344.  
  345. // ===================================================================================
  346. // ADC Implementation
  347. // ===================================================================================
  348.  
  349. // Voltage references
  350. #define REFVCC    0                             // Vcc as reference
  351. #define REF1V1    (1<<REFS1)                    // internal 1.1V reference
  352. #define REF2V56   ((1<<REFS2) | (1<<REFS1))     // internal 2.56V reference
  353. #define AVBG      ((1<<MUX3)  | (1<<MUX2))      // port of internal bandgap (1.1V reference)
  354.  
  355. // ADC init
  356. void ADC_init(void) {
  357.   ADCSRA = (1<<ADPS1) | (1<<ADPS0)              // set ADC clock prescaler to 8
  358.          | (1<<ADEN)                            // enable ADC
  359.          | (1<<ADIE);                           // enable ADC interrupt
  360. }
  361.  
  362. // ADC add up several readings (oversampling) against choosen reference in sleep mode to denoise
  363. // max samples: 64
  364. uint16_t ADC_read(uint8_t port, uint8_t reference, uint8_t samples) {
  365.   uint16_t result = 0;                          // result
  366.   ADCSRA |= (1<<ADEN) | (1<<ADIF);              // enable ADC, turn off any pending interrupt
  367.   ADMUX   = (port & 0x0f) | reference;          // set input channel and reference
  368.   if(reference || (port==AVBG)) _delay_ms(2);   // wait 2ms to settle if Vref is used  
  369.   set_sleep_mode(SLEEP_MODE_ADC);               // sleep during sample for noise reduction
  370.   for(; samples; samples--) {                   // get several samples
  371.     sleep_mode();                               // go to sleep while taking ADC sample
  372.     while(ADCSRA & (1<<ADSC));                  // make sure sampling is completed
  373.     result += ADC;                              // add them up
  374.   }
  375.   return result;                                // return value
  376. }
  377.  
  378. // ADC interrupt service routine
  379. EMPTY_INTERRUPT(ADC_vect);                      // nothing to be done here
  380.  
  381. // ===================================================================================
  382. // Additional Functions
  383. // ===================================================================================
  384.  
  385. // Check if button is pressed
  386. uint8_t buttonPressed(void) {
  387.   uint16_t value = ADC_read(AP_NTC, REFVCC, 1);
  388.   return(value < NTCMIN);
  389. }
  390.  
  391. // Check if NTC is connected
  392. uint8_t NTCpresent(void) {
  393.   uint16_t value = ADC_read(AP_NTC, REFVCC, 1);
  394.   return( (value >= NTCMIN) && (value < 1020) );
  395. }
  396.  
  397. // ===================================================================================
  398. // Main Function
  399. // ===================================================================================
  400.  
  401. // Text strings stored in program memory
  402. const char StartScreen[] PROGMEM =
  403.   "-- TinyLoad  v1.2  --"
  404.   "Turn poti full CCW,  "
  405.   "connect the load and "
  406.   "press SET button.    ";
  407. const char WarnScreen[] PROGMEM =
  408.   "!!!!!  WARNING  !!!!!"
  409.   "You reached max power"
  410.   "  or temperature !   "
  411.   "!!! DECREASE LOAD !!!";
  412.  
  413. // Main function
  414. int main(void) {
  415.   // Local variables
  416.   uint16_t  vcc, vref2, onevolt, twovolt, rawCheck, temp;
  417.   float     rawVoltage, rawCurrent, voltage, current, power, resistance;
  418.   float     capacity = 0;
  419.   float     energy = 0;
  420.   uint8_t   primescreen = 1;
  421.   uint8_t   warnscreen;
  422.   uint8_t   lastbutton;
  423.   uint32_t  lastmillis, nowmillis, interval;
  424.  
  425.   // Setup
  426.   pinOutput(PIN_FAN);                                   // set output pins
  427.   pinDisable(PIN_NTC);                                  // disable digital input buffer
  428.   pinDisable(PIN_VOLTAGE);                              // disable digital input buffer
  429.   pinDisable(PIN_CURRENT);                              // disable digital input buffer
  430.   MIL_init();                                           // setup millis counter
  431.   ADC_init();                                           // setup ADC
  432.   OLED_init();                                          // prepare and start OLED
  433.   sei();                                                // enable global interrupts
  434.  
  435.   // Calibrate internal 2.56V reference
  436.   vref2 = ADC_read(AVBG, REF2V56, 64);                  // read internal bandgap against 2.56V reference
  437.   vref2 = (uint32_t)72019200 / vref2;                   // calculate Vref2 in mV; 72019200 = 64*1023*1100
  438.  
  439.   // Check if something is connected to the load
  440.   OLED_clearScreen();
  441.   OLED_setCursor(0,0);
  442.   OLED_printPrg(StartScreen);
  443.   while( (!buttonPressed()) && (ADC_read(AP_CURRENT, REF1V1, 1) < 10) );
  444.  
  445.   // Init some variables;
  446.   lastmillis = MIL_read();
  447.   lastbutton = 1;
  448.  
  449.   // Loop
  450.   while(1) {
  451.     vcc     = ADC_read(AVBG, REFVCC, 64);               // read internal bandgap against Vcc with 64 samples
  452.     vcc     = (uint32_t)72019200 / vcc;                 // calculate Vcc in mV; 1125300 = 64*1023*1100
  453.     onevolt = (uint32_t)1125300 / vcc;                  // calculate ADC-value for 1.1V
  454.     twovolt = (uint32_t)vref2 * 1023 / vcc;             // calculate ADC-value for 2.56V (calibrated)
  455.  
  456.     // Read and calculate voltage in V
  457.     rawCheck = ADC_read(AP_VOLTAGE, REFVCC, 1);         // get ADC-value for voltage reading
  458.     if (rawCheck < onevolt) {                           // check possibility of reading against 1.1V reference
  459.       rawVoltage  = ADC_read(AP_VOLTAGE, REF1V1, 64);   // read raw voltage against 1.1V reference
  460.       voltage     = rawVoltage * 1100 / UCONV * ULCAL;  // calculate real voltage value
  461.     }
  462.     else if (rawCheck < twovolt) {                      // check possibility of reading against 2.56V reference
  463.       rawVoltage  = ADC_read(AP_VOLTAGE, REF2V56, 64);  // read raw voltage against 2.56V reference
  464.       voltage     = rawVoltage * vref2 / UCONV * ULCAL; // calculate real voltage value
  465.     }
  466.     else {
  467.       rawVoltage  = ADC_read(AP_VOLTAGE, REFVCC, 64);   // read raw voltage against vcc
  468.       voltage     = rawVoltage * vcc / UCONV * ULCAL;   // calculate real voltage value
  469.     }
  470.  
  471.     // Read and calculate current in A
  472.     rawCheck = ADC_read(AP_CURRENT, REFVCC, 1);         // get ADC-value for current reading
  473.     if(rawCheck < onevolt) {                            // check possibility of reading against 1.1V reference
  474.       rawCurrent  = ADC_read(AP_CURRENT, REF1V1, 64);   // read raw current against 1.1V reference
  475.       current     = rawCurrent * 1100 / ICONV * ILCAL;  // calculate real current value
  476.     }
  477.     else if(rawCheck < twovolt) {                       // check possibility of reading against 2.56V reference
  478.       rawCurrent  = ADC_read(AP_CURRENT, REF2V56, 64);  // read raw current against 2.56V reference
  479.       current     = rawCurrent * vref2 / ICONV * ILCAL; // calculate real current value
  480.     }
  481.     else {
  482.       rawCurrent  = ADC_read(AP_CURRENT, REFVCC, 64);   // read raw current against vcc
  483.       current     = rawCurrent * vcc / ICONV * ILCAL;   // calculate real current value
  484.     }
  485.  
  486.     // Calculate power and resistance
  487.     power = voltage * current;                          // calculate power in W
  488.     if(current > 0) resistance = voltage / current;     // calculate resistance in Ohm
  489.     else resistance = 9999;                             // 9999 if no current
  490.     if(resistance > 9999) resistance = 9999;            // 9999 is max displayed value
  491.  
  492.     // Calculate energy/capacity in mWh and mAh
  493.     nowmillis  = MIL_read();
  494.     interval   = nowmillis - lastmillis;                // calculate time interval
  495.     lastmillis = nowmillis;
  496.     energy    += power   * interval / 3600;             // calculate mWh
  497.     capacity  += current * interval / 3600;             // calculate mAh
  498.  
  499.     // Turn on fan if needed
  500.     temp = ADC_read(AP_NTC, REFVCC, 1);
  501.     if( (power > 8) || ( (temp >= NTCMIN) && (temp < NTCFAN) ) ) pinHigh(PIN_FAN);
  502.     else pinLow(PIN_FAN);
  503.  
  504.     // Check limits
  505.     warnscreen = ( (power > MAXPOWER) || ( (temp >= NTCMIN) && (temp < NTCHOT) ) );
  506.  
  507.     // Check button
  508.     if (!lastbutton && buttonPressed()) primescreen = !primescreen;
  509.     lastbutton = buttonPressed();
  510.    
  511.     // Display values on the oled
  512.     OLED_setCursor(0,0);
  513.  
  514.     if(warnscreen) OLED_printPrg(WarnScreen);
  515.     else {
  516.       OLED_printPrg(PSTR("Voltage:   ")); OLED_printValue(voltage); OLED_printPrg(PSTR(" V"));
  517.       OLED_printPrg(PSTR("Current:   ")); OLED_printValue(current); OLED_printPrg(PSTR(" A"));
  518.  
  519.       if(primescreen) {
  520.         OLED_printPrg(PSTR("Power:     ")); OLED_printValue(power);      OLED_printPrg(PSTR(" W"));
  521.         OLED_printPrg(PSTR("Resistance:")); OLED_printValue(resistance); OLED_printPrg(PSTR(" O"));
  522.       }
  523.       else {
  524.         OLED_printPrg(PSTR("Energy:  ")); OLED_printValue(energy);   OLED_printPrg(PSTR(" mWh"));
  525.         OLED_printPrg(PSTR("Charge:  ")); OLED_printValue(capacity); OLED_printPrg(PSTR(" mAh"));
  526.       }
  527.     }
  528.     _delay_ms(50);
  529.   }
  530. }
(#) robis01 válasza MATA hozzászólására (») Júl 30, 2023 / 1
 
// Note: RESET pin is used as a weak analog input for the set button and the NTC
// thermistor. You don't need to disable the RESET pin as the voltage won't
// go below 40% of Vcc.

Meg kell mérni a RESET lábon a feszültséget, benne kell legyen a határadatokban.

// RESET pin ADC values (tweak a little, if button/NTC do not work correctly)
#define NTCMIN 550 // lowest ADC value for NTC; below is a button press
#define NTCFAN 625 // turn on the fan if ADC value is below
#define NTCHOT 560 // show warning screen if ADC value is below

Ha nem működik jól a gomb akkor állítani kell az értékeken. Érdemes lenne kinyerni a programból az ADC adatokat, vagy ha az egyszerűbb írni kell egy ADC lekérdező programot, és a kapott adatok alapján beállítani a határértékeket.
(#) MATA válasza robis01 hozzászólására (») Júl 31, 2023 /
 
Köszönöm a gyors választ este tudom csak megnézni majd megírom hogy mi a helyzet.
(#) MATA válasza robis01 hozzászólására (») Júl 31, 2023 /
 
Köszönöm itt volt a probléma forrása!
(#) Régi motoros hozzászólása Aug 1, 2023 /
 
Helló!
Ismer valaki olyan oldalt, ahol mondjuk valamilyen választómenüvel, legördülő menüvel csekboxal ki lehet választani bizonyos arduino tulajdonságokat, és kilistázza azoknak megfelelő attiny atmega csipeket? Mondjuk beállítom, hogy hány lábú legyen a tokozás, mennyi FLASH legyen benne vagy ilyesmi.
(#) Bakman válasza Régi motoros hozzászólására (») Aug 2, 2023 / 1
 
Itt: Bővebben: Link. Akár le is töltheted a listát, táblázatkezelők megeszik.
(#) toth1996 válasza Bakman hozzászólására (») Aug 2, 2023 /
 
Sziasztok.
Segítséget szeretnék kérni.
hc-06 vagy hc-05 modult szeretnék rendelni.

Utána néztem a bekötéseknek és mindenki softwareserial-t használ ami ha jól tudom RX feszültség osztó kell. Mondom oké de hardveres serial mondom szerintem ez jobb lesz.
Arról sajnos annyi bekötést nem találtam Ardunio Nano hoz igy segítségeteket kérném hogy kéne.

Párnapja kaptam egy Ardunio megát és egy hc-05 modult.
Mondom összerakom RX --> TX TX--->RX re és nem működött soros kommunikáció(HW-s)
Aztán gondoltam egyet meg fordítom a lábakat: TX---> TX RX--->RX
És igy működött. Akkor kérdem én ezeknek a moduloknál RX TX már meg van fordítva a RX TX láb??
Jó mondom figyelmetlen voltam rá keresek akkor hogy van és a modul és az eszköz között a kábel megcserélik.

PL itt:
Bővebben: Link

Itt mondjuk HW soros portnál feszültség osztott használ miért ??

Elnézést hogy ilyen hosszúra sikerült de nem tudom most hogy mi miként jóó
AT modnál kell lábat fordítani vagy sem ?? DD
Segítségeteket megköszönném ha felvilágosítanátok
A hozzászólás módosítva: Aug 2, 2023
(#) vargham válasza toth1996 hozzászólására (») Aug 2, 2023 /
 
Az ESP GPIOi a specifikációja alapján nem bírja az 5 voltos feszültségszintet. Gyakorlatilag elviselheti. Egy ideig. Szóval 5 voltos Arduinohoz szintillesztő KELL.
(#) Régi motoros válasza Bakman hozzászólására (») Aug 2, 2023 /
 
Kissé szűkösnek érzem, hogy csak három keresési feltételt lehet szűkíteni. Flash méret, Ram méret, meg MIPS sebesség.

Szomorúan veszem tudomásul, hogy 8 lábú procból elég szűkös a választék, gyakorlatilag csak az Attiny85 jön szóba.
(#) Bakman válasza Régi motoros hozzászólására (») Aug 3, 2023 / 1
 
Bekapcsolod az összes tulajdonságot, majd letöltöd a táblázatot. Számítógépen táblázatkezelőbe töltöd és bekapcsolod az adatszűrést.
(#) robis01 válasza Régi motoros hozzászólására (») Aug 3, 2023 / 2
 
Arduino lista
Ha MCU-ra szűrnél MCU lista
(#) Régi motoros hozzászólása Aug 3, 2023 /
 
Közben olyan kérdés merült fel, amire nem igazán tudom a választ. Volna egy projektem, amiben szerepel 10 Attiny85 és a terv, hogy mindegyik mér egy hőmérsékletet, és egy feszültséget. Mindegyik adatát egy kijelzőn kellene megjeleníteni I2C buszon kommunikálva. A kérdés az, hogy megoldható a kijelzőre írás mindegyik CPU-ról, vagy szükséges egy külön CPU ami összegyűjti az adatokat az I2C porton, és ez az egy kezeli a kijelzőt? Magyarul, meg lehet spórolni egy IC-t? Esetleg tudtok mutatni ilyen projektre valami demót?
(#) Bakman válasza Régi motoros hozzászólására (») Aug 3, 2023 / 2
 
Jobban jársz, ha van a rendszerben egy mester, ami kezeli a kijelzőt és kérdezgeti a kicsiket. I2C helyett RS485.
A hozzászólás módosítva: Aug 3, 2023
(#) kissi válasza Régi motoros hozzászólására (») Aug 3, 2023 / 1
 
Szia!

Mindent lehet, csak szervezés és átgondolás kérdése !
Van I2C kijelző, egy rendszerben szerintem működhetnek, csak a protokollt kell jól átgondolni!

Az I2C-re figyelj, hogy az "Inter IC", azaz IC-k között (kis távolságra) kifejlesztett protokoll, adott esetben a Bakman kolléga által javasolt RS485 jobb lehet !
(#) robis01 válasza Régi motoros hozzászólására (») Aug 3, 2023 / 1
 
Erre a célra elég egy MCU is ha ADC modul van használva (feltéve hogy a hőmérés is ADC-s lesz), pl ADS1115. De ha ragaszkodsz a sok MCU-hoz, és nem kell nagy pontosság akkor elég lehet az Attiny család egy kisebb, és olcsóbb tagjának beépített hőmérője is hőmérésre.
A hozzászólás módosítva: Aug 3, 2023
(#) wbt válasza Régi motoros hozzászólására (») Aug 3, 2023 / 1
 
Multi-master mód (ha tudja a beépített I2C vagy van kedved leprogramozni). De ebben az esetben egyszerűbb is lehet: hőmérők címei 1-10, kijelző mondjuk 27... Bekapcsoláskor 1. küld a kijelzőnek, utolsó lélegzetével meg a 2-nak, hogy ő jön. Az küld a kijelzőnek, a végén a 3-nak, hogy ő jön....aztán a 10. az elsőnek köszön. Az első lehet figyelő is, hogy ha mondjuk nincs kommunikáció, akkor újraindítja a buszt. De akkor már az első lehet "mester", aki engedélyezi sorban a többieknek a kommunikációt, tehát van pár lehetőség. Hibát keresni ebben a rendszerben, kicsit agyhalált is okozhat, jobb, ha egy valaki felügyeli a szolgákat.
(#) Régi motoros hozzászólása Aug 3, 2023 /
 
Válasz mindenkinek: Nos kapisgálom, kösz a válaszokat.

Mivel az imént siettem, egy fontos információ kimaradt, szóval összefoglalom. Mindenképp elektromosan leválasztott, optocsatolt kommunikáció szükséges. Nem tudom, azt mennyire szereti az I2C, és azért ez merült fel először, mert az attiny85 támogatja. Valamint az tud kijelzőt is kezelni. A távolság egyáltalán nem kritikus, 20cm max. Amin megbukhat a dolog, hogy a kijelzőnek lehet, hogy távolabb kell lennie, mondjuk 1.5-2m, ott meg az I2C már lehet elhasal. Mindenesetre az adatátvitelhez akár egy sima Rx Tx is megfelelhet, amit szintén támogat a 85. Az RS485 -öt nem tudom, de szerintem ide az lehet túlzás.

A külön MCU vezérelt kijelző felé hajlottam én is először, főleg ha nem találok 3-3.4" -os kijelzőt olcsón ami megy I2C-n. A lényeg, hogy lehetőleg olcsó legyen, azért akarok spórolni az MCU darabszámmal.

A multi master mód jó ötlet, ha lehetne, arra adnék két mancsot is, de csak egyet lehet.

Csak hogy világos legyen, a feladat lítium akku cellánkénti feszültség és hőmérséklet mérése, kijelzése.

Ui.: Tudom, hogy lehet ilyen okos BMS-t kapni, de sajnos csak drága pénzért.
A hozzászólás módosítva: Aug 3, 2023
(#) Massawa válasza Régi motoros hozzászólására (») Aug 3, 2023 /
 
Honnan veszitek azt a badarságit, higy az I2C 1-2 méteren elhasal. (Már többször lett itt terjesztve).
Ha tisztességesen leterhekitek az I2C vezetékeit akkor gond nélkül elmegy akár 10 méterre is. Nekem van egy ilyen berendezésem ami nagyon zajos környezetben 6 méteres kábellel hiba nélkül müködik. Egyébként az I2C leirása is pontosan kitér az ilyen részletekre.
(#) Bakman válasza Régi motoros hozzászólására (») Aug 3, 2023 /
 
A DC leválasztott I2C mellé kelleni fog leválasztott tápfeszültség is, ez alaposan megdobja a költségeket.

Ha tíz cella feszültségét akarod mérni, akkor megteheted úgy is, hogy megméred az első cella feszültségét (amelyik a GND-hez kapcsolódik), a második cella feszültségét is megméred a GND-hez képest, majd kivonod belőle az első cella feszültségét és így tovább.

Ez eddig tíz bemenet. Ha még tíz kell a hőmérsékletszenzorokhoz, akkor is még csak húsznál járunk, egy kontrollerben bőven elfér (természetesen nem az Attiny85-ben), még a kijelző is tud kapcsolódni.

Az RS485 olyan, mint az általad említett TX és RX annyi különbséggel, hogy jóval érzéketlenebb a zavarokra. Igaz, az "adó" és "vevő" oldalon is kíván egy-egy illesztő IC-t (pl. MAX483, MAX485).
(#) Bakman válasza Massawa hozzászólására (») Aug 3, 2023 /
 
Ha nekünk nem hiszel, talán az Analog Devices írásának igen: Bővebben: Link.
(#) Massawa válasza Bakman hozzászólására (») Aug 3, 2023 /
 
Akkor már nem lenne jobb pl a ds18B20-t haszálni a tiny nélkül. Azokat párhuzamosan lehet kapcsolni mindegyiknek egyedi cime van s mindegyik 3 meteres kábellel is szállithato rozsdamentes vizhatlan galvanikusan szigetelt tokban.
Következő: »»   808 / 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