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   819 / 850
(#) Moderátor hozzászólása Okt 15, 2023
 
A topik címe továbbra is Arduino, így sem a homok akkumulátorokról, se a napelem rendszerek telepítéséről nem ebben a topikban kell értekezni!

A célt tévesztett hozzászólások törlésre kerültek. Köszönjük az együttműködéseteket!
(#) proba válasza antikzsolt hozzászólására (») Okt 15, 2023 /
 
AC oldalra én a PZEM004 modult használom. Soros porton galvanikusan leválasztva küld minden adatot:áram, feszültség, teljesítmény, fázisszög szerintem olcsó is, nálam már 3 éve gond nélkül logol.
(#) antikzsolt válasza proba hozzászólására (») Okt 15, 2023 /
 
Köszi. Be is raktam a bevásárló listára.
(#) MATA hozzászólása Okt 26, 2023 /
 
Üdv mesterek!
A következő lenne a gondom van itt ezen az oldalon ez a kapcsolás:
https://www.pocketmagic.net/digital-bench-power-supply/
Nos én letöltöttem a tömörített mappát amiben bent volt a lefordított Hex fálj is meg a forráskód is.
Namármost amikor feltöltöttem a Hex fájlt az AVR-re teljesen jó volt a kijelzés csak éppen az a baj hogy a kódban meg kellene változtatni az ellenállás értékeket azt meg ugye a Hex fájlban nem lehetséges. Ezért elővettem a forráskódot de amikor azt lefordítom és felírom az AVR-re akkor a feszültség és áram értékek helyett csak ?-et ír ki a kijelző és nem tudom ez mitől lehet.
Itt van egy kép az eredti Hex-el és a frissen fordítottal.
És a forráskód:
  1. /*
  2.  File:       main.cpp
  3.  Version:    1.0 - first version
  4.  Date:       April 7, 2015
  5.  License:       GPL v2
  6.  
  7.  Digital Bench Power supply
  8.  http://www.pocketmagic.net/digital-bench-power-supply/
  9.  
  10.  ****************************************************************************
  11.  Copyright (C) 2015 Radu Motisan  <radu.motisan@gmail.com>
  12.  
  13.  http://www.pocketmagic.net
  14.  
  15.  This program is free software; you can redistribute it and/or modify
  16.  it under the terms of the GNU General Public License as published by
  17.  the Free Software Foundation; either version 2 of the License, or
  18.  (at your option) any later version.
  19.  
  20.  This program is distributed in the hope that it will be useful,
  21.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  GNU General Public License for more details.
  24.  
  25.  You should have received a copy of the GNU General Public License
  26.  along with this program; if not, write to the Free Software
  27.  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  28.  ****************************************************************************
  29.  */
  30. #include <avr/io.h>
  31. #include <avr/interrupt.h>
  32. #include <avr/wdt.h>
  33. #include <string.h>
  34. #include <stdlib.h>
  35. #include "timeout.h"
  36. #include "io/DigitalIn.h"
  37. #include "io/DigitalOut.h"
  38. #include "sensors/ds18b20.h"
  39. #include "lcd/hd44780.h"
  40. #include "misc/aux.h"
  41. #include "misc/pwm.h"
  42.  
  43.  
  44. /************************************************************************************************************************************************/
  45. /* Main entry point                                                                                                                                                                                                     */
  46. /************************************************************************************************************************************************/
  47. HD44780         lcd;
  48. DS18B20         ds18b20;
  49. PWM             pwm;
  50. DigitalOut      relay,
  51.                         speaker,
  52.                         fan;
  53. DigitalIn       but1, // v+
  54.                         but2, // v-
  55.                         but3, // i+
  56.                         but4; // i-
  57. float tempval = 0;
  58. float vref = 5.0;
  59.  
  60. /* power control modes */
  61. #define MODE_MEASURE_CURRENT 0
  62. #define MODE_MEASURE_VOLTAGE 1
  63. volatile bool adc_mode = MODE_MEASURE_CURRENT;
  64. volatile float current = 0, voltage = 0;
  65.  
  66. /* my power supply after rectifier shows 16.1V on the center tap and 33.8V on full secondary
  67.  * opamp will introduce some upper voltage limitations. Currently using TL082 and we can reach close to 26V maximum
  68.  */
  69. #define VOLTAGE_LIMIT   26
  70. #define CURRENT_LIMIT   5
  71. #define TEMPERATURE_STARTFAN 50 // if 40degrees celsius are reached, we will start the fan
  72. #define TEMPERATURE_SHUTDOWN 70 // if 80degrees celsius are reached, we will reduce the power until the unit cools down
  73.  
  74.  
  75. /* set default values: later save/load them to/from EEPROM */
  76. volatile float targetVol = 5.0, targetCur = 1;
  77.  
  78. volatile bool alarm = false;
  79. uint16_t cycles = 0;
  80.  
  81.  
  82. // Interrupt service routine for the ADC completion
  83. // we measure the current (PC5) and the voltage (PC4) alternatively
  84. ISR(ADC_vect){
  85.         uint16_t analogVal = ADCL | (ADCH << 8);
  86.         if (adc_mode == MODE_MEASURE_CURRENT) {
  87.                 current = (analogVal / 1024.0 * vref) / 0.186666; // the output power resistor measures 0.55Ohm
  88.                 // alternate mode
  89.                 adc_mode = MODE_MEASURE_VOLTAGE;
  90.                 ADMUX = PC4; // next time we will do ADC on PC4, to get the voltage
  91.         } else if (adc_mode == MODE_MEASURE_VOLTAGE) {
  92.                 // the actual R13 and R14 resistors can be measured using a multimeter for better accuracy
  93.                 float R14 = 9.87, /*10k*/ R13 = 98.2; /*100K */
  94.                 voltage = analogVal / 1024.0 * (R13 + R14) / R14 * vref;
  95.                 // alternate mode
  96.                 adc_mode = MODE_MEASURE_CURRENT;
  97.                 ADMUX = PC5; // next time we will do ADC on PC5, to get the current
  98.         }
  99.  
  100.         // If free-running mode is enabled (ADFR), we don't need to restart conversion
  101.         // But we can't use ADFR as we want to monitor two separate ADC channels alternatively
  102.  
  103.         // start another ADC conversion
  104.         ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADIF) /* | (1<<ADFR) */ | (1<<ADSC) |
  105.                                 (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // set prescaler to 128 (16M/128=125kHz, above 200KHz 10bit results are not reliable)
  106.  
  107.         // control operations, in order
  108.  
  109.         // 1. act on short circuit
  110.         // decrease quickly on current spike
  111.         if (current > targetCur + targetCur / 2) {
  112.                 pwm.setDuty(pwm.getDuty() / 2);
  113.                 alarm = true; // will sound alarm in main thread
  114.         }
  115.         // 2.act on over current
  116.         // decrease slowly on higher current
  117.         else if (current > targetCur) {
  118.                 pwm.setDuty(pwm.getDuty() - 1);
  119.         }
  120.         // 3.act on over temperature
  121.         else if (tempval > TEMPERATURE_SHUTDOWN) {
  122.                 pwm.setDuty(pwm.getDuty() - 1);
  123.                 alarm = true;
  124.         }
  125.         // 4. act on over voltage
  126.         // take care of voltage with lower priority
  127.         else if (voltage > targetVol) pwm.setDuty(pwm.getDuty() - 1);
  128.         // 5. act on under voltage
  129.         else if (voltage < targetVol) pwm.setDuty(pwm.getDuty() + 1);
  130. }
  131.  
  132. int main(void) {
  133.         // setup everything
  134.         relay.init(&PORTD, PD5);
  135.         fan.init(&PORTD, PD6);
  136.         speaker.init(&PORTB, PB0);
  137.         pwm.initPWM();
  138.  
  139.         but1.init(&PORTC, PC0);
  140.         but2.init(&PORTC, PC1);
  141.         but3.init(&PORTC, PC2);
  142.         but4.init(&PORTC, PC3);
  143.  
  144.  
  145.         ds18b20.init(&PORTD, PD7);
  146.         lcd.init(&PORTD, PD4, &PORTB, PB3, &PORTD, PD3, &PORTB, PB4, &PORTD, PD2, &PORTB, PB5); //RS, E, D4, D5, D6, D7
  147.  
  148.         // setup ADC to measure as interrupt: go for current first
  149.         adc_mode = MODE_MEASURE_CURRENT;
  150.         ADMUX = PC5;
  151.         ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADIF) | (1<<ADSC) |
  152.                         (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // set prescaler to 128 (16M/128=125kHz, above 200KHz 10bit results are not reliable)
  153.         sei();
  154.  
  155.         // show welcome screen
  156.         lcd.sendstring("********************\n"\
  157.                                    "*Digital Pwr Supply*\n"\
  158.                                    "*pocketmagic.net'15*\n"\
  159.                                    "********************\n");
  160.  
  161.         // keep screen then clear
  162.         //_delay_ms(500);
  163.  
  164.         // main loop
  165.         while (1) {
  166.  
  167.                 // engage relay if we're at 12V or more. use measured voltage or configured voltage?
  168.                 relay.set(targetVol > 12);
  169.                 // engage fan is temperature is above threshold
  170.                 fan.set(tempval > TEMPERATURE_STARTFAN);
  171.  
  172.                 // limit the frequency for some ops including display and temperature reading
  173.                 if (cycles == 0) {
  174.                         float temp = 0;
  175.                         cli();
  176.                         if (ds18b20.readTemperature(&temp) == THERM_OK)
  177.                                 tempval = temp;
  178.                         sei();
  179.  
  180.                         lcd.cursorhome();
  181.                         lcd.sendstringformat(
  182.                                 " +SET: %5.2fV %5.2fA\n"\
  183.                                 "%5.1fC %5.2fV %5.2fA\n"\
  184.                                 "%s       PWM:%4d\n"
  185.                                 "2015 pocketmagic.net",
  186.                                 targetVol, targetCur,
  187.                                 tempval, voltage, current,
  188.                                 fan.get()?" +FAN":"     ",
  189.                                 pwm.getDuty()
  190.                         );
  191.                 }
  192.                 cycles ++;
  193.                 if (cycles > 10000) cycles = 0;
  194.  
  195.  
  196.                 // sound alarm
  197.                 if (alarm) {
  198.                         speaker.set(1);
  199.                         _delay_ms(30);
  200.                         speaker.set(0);
  201.                         // stop alarm
  202.                         alarm = false;
  203.                 }
  204.  
  205.                 // act on buttons
  206.                 if (but1.get() == 0) {
  207.                         if (targetVol < VOLTAGE_LIMIT) targetVol += 0.1;
  208.                         cycles = 0; // force lcd refresh
  209.                 }
  210.                 if (but2.get() == 0) {
  211.                         if (targetVol > 0.1) targetVol -= 0.1;
  212.                         cycles = 0; // force lcd refresh
  213.                 }
  214.                 if (but3.get() == 0) {
  215.                         if (targetCur < CURRENT_LIMIT) targetCur += 0.1;
  216.                         cycles = 0; // force lcd refresh
  217.                 }
  218.                 if (but4.get() == 0) {
  219.                         if (targetCur > 0.1) targetCur -= 0.1;
  220.                         cycles = 0; // force lcd refresh
  221.                 }
  222.  
  223.  
  224.  
  225.         }
  226.  
  227. }

Köszönöm előre is ha valaki tudna ebbe segélni.
(#) asch válasza MATA hozzászólására (») Okt 26, 2023 / 1
 
Megnéztem a kódot, a fordítókörnyezethez adott vsnprintf hívást használja a kiíráshoz (lásd: https://github.com/radhoo/digital_bench_power_supply/blob/1a3af2e5a...p#L195 )
Rákerestem hasonló problémára, és azt találtam, hogy a float formázást kihagyja a fordító a rendszerből, ha nem kapcsoljuk be. Gondolom azért, hogy spóroljon a kódterülettel. A problémára találat itt: https://stackoverflow.com/questions/37815771/snprintf-not-working-a...vr-gcc

A megoldás onnan kimásolva (nem próbáltam ki): Ezeket a linker opciókat hozzá kell adni a linker híváshoz:

  1. -Wl,-u,vfprintf -lprintf_flt -lm


Eclipse alatt fordítod a kódot, azzal a .project fájllal, amit benn van a git projektben? Vagy csináltál hozzá make fájlt? El tudom képzelni, hogy Eclipse alatt ezt a paramétert az egész workspace-re állította be, vagy valamiért az ő környezetében alapból ki volt kapcsolva ez a méretoptimalizáció, azért működött jól az eredeti kód az eredeti szerzőnél.
(#) MATA válasza asch hozzászólására (») Okt 26, 2023 /
 
Hello!
Először is köszönöm a gyors hozzászólást akkor az lehet a gond itt hogy én Arduino IDE-ben fordítottam a kódot.
Még annyit hogy ezt a sort pontosan hovva kellene hozzá adni mert sajnos még nem vagyok olyan penge ebbe a témában.
Köszönöm!
(#) cua válasza MATA hozzászólására (») Okt 26, 2023 /
 
Ha tobbet is szeretnel vele foglalkozni, akkor erdemes valami jobb, rugalmasabb IDE-ben gondolkodni.
En peldaul vscode-ot hasznalok PlatformIO IDE extension-al, MacOS-en, de linux (Ubuntu) alatt is jol muzsikalt.
(#) asch válasza MATA hozzászólására (») Okt 27, 2023 / 1
 
Kipróbáltam Eclipse CDT-vel, egyből működött, tudtam buildelni a projektet!

Ezt az IDE programot kell telepíteni: https://projects.eclipse.org/projects/tools.cdt
Utána ezt a plug-int kell még telepíteni az Eclipse-be az AVR fejlesztéshez: https://marketplace.eclipse.org/content/avr-eclipse-plugin

Ha ezek megvannak, akkor utána el kell indítani az Eclipse CDT-t és a git-ből kivett foldert kell a File/Import.../General/Existing Projects into workspace menűponttal behúzni a workspace-be.

Ezután pedig a Project/Build Project működött nekem. Nem tudom, hogy hozza-e az avr-gcc-t, vagy pedig a gépre telepítettet használja. Arra tippelek, hogy a telepítettet. Linuxon dolgozom és természetesen telepítve van az avr-g++.

A build logban írja, hogy valóban benne van a paraméter amit fentebb írtam:

  1. Building target: DigitalPowerSupply-1.elf
  2. Invoking: AVR C++ Linker
  3. avr-g++ -Wl,-Map,DigitalPowerSupply-1.map,--cref -mrelax -Wl,--gc-sections -Wl,-u,vfprintf -lprintf_flt -lm -Llibprintf_flt.a -Llibm.a -mmcu=atmega8 -o "DigitalPowerSupply-1.elf" ./sensors/ds18b20.o  ./misc/aux.o ./misc/pwm.o  ./lcd/hd44780.o  ./io/DigitalIn.o ./io/DigitalOut.o  ./main.o  
  4. Finished building target: DigitalPowerSupply-1.elf


Én a helyedben megpróbálnám ezt az IDE-t telepíteni. Java és C fejlesztésre is régóta használom az Eclipse-t, nagyon szeretem, bátran tudom ajánlani. Pont AVR-t eddig nem fejlesztettem Eclipse alatt, de lehet hogy fogok.

Azt, hogy az Arduino alatt meg lehet-e adni ezt a paramétert, azt nem tudom. Melyik verziót használod abból?
A hozzászólás módosítva: Okt 27, 2023
(#) MATA válasza asch hozzászólására (») Okt 27, 2023 /
 
Hello!
Köszönöm a legújabb 2.2.1-et használom az Arduino IDE-ből.
Ezt a Eclipse programot gondolom Linux alatt lenne jó használni?
(#) MATA válasza MATA hozzászólására (») Okt 27, 2023 /
 
Meg még volt olyan probléma is hogy volt egy header fájl is a csomagban aminek a neve aux cpp és aux h fájl ami ugye a windows-nál védett név ezért nem lehet másolni sem csak úgy tudtam használni hogy át kellett neveznem és a kódban is át kellett nevezni.
(#) asch válasza MATA hozzászólására (») Okt 27, 2023 /
 
Az Eclipse tökéletesen működik Windows alatt is. Meg az avr-gcc is. Csak azért írtam, hogy Linuxozom, hogy egzakt legyek, hogy mit csináltam.
(#) MATA válasza asch hozzászólására (») Okt 27, 2023 /
 
Oké köszi megnézzük.
(#) MATA válasza asch hozzászólására (») Okt 27, 2023 /
 
Hello! Sajnos én nem értek ehhez a programhoz be tudtam importálni a kódot viszont nem tudtam programozót beállítani az AVR/AVRDude alatt.
(#) usane válasza MATA hozzászólására (») Okt 27, 2023 / 1
 
Ugy emlekszem az AVR studioban is be lehet ezt allitani valahol. Ha pedig az Arduino IDEnel akarsz maradni akkor a megoldas nagyon egyszeru. Hasznald a dtostrf()-t.

Tovabbmegyek.Olvasd el ezt.
A hozzászólás módosítva: Okt 27, 2023
(#) MATA válasza usane hozzászólására (») Okt 27, 2023 /
 
Oké köszönöm megnézem ezt majd.
(#) cua válasza MATA hozzászólására (») Okt 27, 2023 / 1
 
Ha ragaszkodsz az Arduino IDE-hez, akkor a platform.txt, boards.txt es a platform.local.txt file-okban kell keresned a megoldast.
Ezekben lehet compiler/link/build opciokat beallitani.
Keress ra a
  1. build.flags
vagy
  1. build.extra_flags
szavakra.
Lehet board specifikusan is allitani pl:
  1. mega.build.extra_flags=
(#) asch válasza MATA hozzászólására (») Okt 27, 2023 / 1
 
A build lefutott? Elkészült a hex fájl? Az már fél siker, az égetés utána már egyetlen avrdude paranccsal működni fog.

Az avrdude beállítást az Eclipse-en belül kipróbáltam, nekem sem működött, a hozzáadás gomb teljesen süket. Rákerestem, szerintem ez a hiba lesz az oka: https://stackoverflow.com/questions/20418185/avr-cant-add-programme...clipse Eszerint a 6-os avrdude verziótól felfelé nem kompatibilis és sajnos azóta sem javították meg. Nekem 7.2-es avrdude-om van, biztos ezzel sem kompatibilis.

Ha megnézed a forrásokat, akkor van benne egy shell szkript, amivel a szerző égette a csipjét, ő sem az Eclipse-be épülő eszközt használta: https://github.com/radhoo/digital_bench_power_supply/blob/master/prog.sh

Ebben a szkriptben két érdemi parancs van, két avrdude indítás. Az első parancs a fuse bitek beállítása, a második a program égetése. A két parancsot egy Windows .bat fájlba átírva, az avrdude-ot avrdude.exe-re cserélve, és a DigitalPowerSupply-1.hex fájlnevet a hex fájl elérési útjára cserélve kellene működnie Windowson is.
A hozzászólás módosítva: Okt 27, 2023
(#) MATA válasza cua hozzászólására (») Okt 28, 2023 /
 
Köszönöm ránézünk erre is.
(#) MATA válasza asch hozzászólására (») Okt 28, 2023 /
 
Köszönöm utána nézek a dolognak.
(#) Shance hozzászólása Okt 28, 2023 /
 
Sziasztok!
Pár éve összedobtam ezt az ESP8266-os órát, és az a bajom vele, hogy nem áll át téli, nyári időszámításra. Amikor összeraktam már lógott a levegőben, hogy nem tekergetjük az órát többet, és úgy voltam vele, hogy néhány alkalommal újra programozom a utcOffset állításával, de már kezdem unni az évi 2x programozását. Vetne rá valaki egy pillantást mi lehet a baja? Köszönöm!
  1. #include "Arduino.h"
  2. #include <ArduinoJson.h>
  3. #include <ESP8266WiFi.h> //ESP8266 Core WiFi Library (you most likely already have this in your sketch)
  4.  
  5. WiFiClient client;
  6.  
  7. int day, month, year, dayOfWeek;
  8. int summerTime = 1;
  9. String date;
  10.  
  11. #define NUM_MAX 4
  12.  
  13. // for NodeMCU 1.0
  14. #define DIN_PIN 13  // D7
  15. #define CS_PIN  0  // D3
  16. #define CLK_PIN 14  // D5
  17.  
  18. #include "max7219.h"
  19. #include "fonts.h"
  20. #define HOSTNAME "ESP-Clock"
  21.  
  22. // =======================================================================
  23. // CHANGE YOUR CONFIG HERE:
  24. // =======================================================================
  25. const char* ssid     = "UPC177AF56";     // SSID of local network
  26. const char* password = "kxmkkfCxps4m";   // Password on network
  27.  
  28. void setup()
  29. {
  30.   Serial.begin(115200);
  31.   initMAX7219();
  32.   sendCmdAll(CMD_SHUTDOWN,1);
  33.   sendCmdAll(CMD_INTENSITY,5);
  34.   Serial.print("Connecting WiFi ");
  35.  
  36.   WiFi.begin(ssid, password);
  37.  
  38.   printStringWithShift("Connecting",15);
  39.   while (WiFi.status() != WL_CONNECTED) {
  40.     delay(500);
  41.     Serial.print(".");
  42.   }
  43.  
  44.   Serial.println("");
  45.   Serial.print("MyIP: "); Serial.println(WiFi.localIP());
  46.   printStringWithShift((String("  MyIP: ")+WiFi.localIP().toString()).c_str(), 15);
  47.   delay(1500);
  48. }
  49.  
  50.  
  51. // =============================DEFINE VARS==============================
  52. #define MAX_DIGITS 20
  53. byte dig[MAX_DIGITS]={0};
  54. byte digold[MAX_DIGITS]={0};
  55. byte digtrans[MAX_DIGITS]={0};
  56. int updCnt = 0;
  57. int dots = 0;
  58. long dotTime = 0;
  59. long clkTime = 0;
  60. int dx=0;
  61. int dy=0;
  62. byte del=0;
  63. int h,m,s;
  64. float utcOffset = +2;
  65. long localEpoc = 0;
  66. long localMillisAtUpdate = 0;
  67. // =======================================================================
  68. void loop()
  69. {
  70.   if(updCnt<=0) { // every 10 scrolls, ~450s=7.5m
  71.     updCnt = 60;
  72.     Serial.println("Getting data ...");
  73.     printStringWithShift("   Setting Time...",15);
  74.     getTime();
  75.     Serial.println("Data loaded");
  76.     clkTime = millis();
  77.   }
  78.  
  79.   if(millis()-clkTime > 60000 && !del && dots) { // clock for 30s, then scrolls for about 30s
  80. //    printStringWithShift(date.c_str(),40);
  81. //    delay(2000);
  82.     updCnt--;
  83.     clkTime = millis();
  84.   }
  85.   if(millis()-dotTime > 500) {
  86.     dotTime = millis();
  87.     dots = !dots;
  88.   }
  89.   updateTime();
  90.   showAnimClock();
  91. }
  92.  
  93. // =======================================================================
  94.  
  95. void showSimpleClock()
  96. {
  97.   dx=dy=0;
  98.   clr();
  99.   showDigit(h/10,  0, dig6x8);
  100.   showDigit(h%10,  8, dig6x8);
  101.   showDigit(m/10, 17, dig6x8);
  102.   showDigit(m%10, 25, dig6x8);
  103.   showDigit(s/10, 34, dig6x8);
  104.   showDigit(s%10, 42, dig6x8);
  105.   setCol(15,dots ? B00100100 : 0);
  106.   setCol(32,dots ? B00100100 : 0);
  107.   refreshAll();
  108. }
  109.  
  110. // =======================================================================
  111.  
  112. void showAnimClock()
  113. {
  114.   byte digPos[6]={0,8,17,25,34,42};
  115.   int digHt = 12;
  116.   int num = 6;
  117.   int i;
  118.   if(del==0) {
  119.     del = digHt;
  120.     for(i=0; i<num; i++) digold[i] = dig[i];
  121.     dig[0] = h/10 ? h/10 : 10;
  122.     dig[1] = h%10;
  123.     dig[2] = m/10;
  124.     dig[3] = m%10;
  125.     dig[4] = s/10;
  126.     dig[5] = s%10;
  127.     for(i=0; i<num; i++)  digtrans[i] = (dig[i]==digold[i]) ? 0 : digHt;
  128.   } else
  129.     del--;
  130.  
  131.   clr();
  132.   for(i=0; i<num; i++) {
  133.     if(digtrans[i]==0) {
  134.       dy=0;
  135.       showDigit(dig[i], digPos[i], dig6x8);
  136.     } else {
  137.       dy = digHt-digtrans[i];
  138.       showDigit(digold[i], digPos[i], dig6x8);
  139.       dy = -digtrans[i];
  140.       showDigit(dig[i], digPos[i], dig6x8);
  141.       digtrans[i]--;
  142.     }
  143.   }
  144.   dy=0;
  145.   setCol(15,dots ? B00100100 : 0);
  146.   setCol(32,dots ? B00100100 : 0);
  147.   refreshAll();
  148.   delay(30);
  149. }
  150.  
  151. // =======================================================================
  152.  
  153. void showDigit(char ch, int col, const uint8_t *data)
  154. {
  155.   if(dy<-8 | dy>8) return;
  156.   int len = pgm_read_byte(data);
  157.   int w = pgm_read_byte(data + 1 + ch * len);
  158.   col += dx;
  159.   for (int i = 0; i < w; i++)
  160.     if(col+i>=0 && col+i<8*NUM_MAX) {
  161.       byte v = pgm_read_byte(data + 1 + ch * len + 1 + i);
  162.       if(!dy) scr[col + i] = v; else scr[col + i] |= dy>0 ? v>>dy : v<<-dy;
  163.     }
  164. }
  165.  
  166. // =======================================================================
  167.  
  168. void setCol(int col, byte v)
  169. {
  170.   if(dy<-8 | dy>8) return;
  171.   col += dx;
  172.   if(col>=0 && col<8*NUM_MAX)
  173.     if(!dy) scr[col] = v; else scr[col] |= dy>0 ? v>>dy : v<<-dy;
  174. }
  175.  
  176. // =======================================================================
  177.  
  178. int showChar(char ch, const uint8_t *data)
  179. {
  180.   int len = pgm_read_byte(data);
  181.   int i,w = pgm_read_byte(data + 1 + ch * len);
  182.   for (i = 0; i < w; i++)
  183.     scr[NUM_MAX*8 + i] = pgm_read_byte(data + 1 + ch * len + 1 + i);
  184.   scr[NUM_MAX*8 + i] = 0;
  185.   return w;
  186. }
  187.  
  188. // =======================================================================
  189. int dualChar = 0;
  190.  
  191. unsigned char convertPolish(unsigned char _c)
  192. {
  193.   unsigned char c = _c;
  194.   if(c==196 || c==197 || c==195) {
  195.     dualChar = c;
  196.     return 0;
  197.   }
  198.   if(dualChar) {
  199.     switch(_c) {
  200.       case 133: c = 1+'~'; break; // 'ą'
  201.       case 135: c = 2+'~'; break; // 'ć'
  202.       case 153: c = 3+'~'; break; // 'ę'
  203.       case 130: c = 4+'~'; break; // 'ł'
  204.       case 132: c = dualChar==197 ? 5+'~' : 10+'~'; break; // 'ń' and 'Ą'
  205.       case 179: c = 6+'~'; break; // 'ó'
  206.       case 155: c = 7+'~'; break; // 'ś'
  207.       case 186: c = 8+'~'; break; // 'ź'
  208.       case 188: c = 9+'~'; break; // 'ż'
  209.       //case 132: c = 10+'~'; break; // 'Ą'
  210.       case 134: c = 11+'~'; break; // 'Ć'
  211.       case 152: c = 12+'~'; break; // 'Ę'
  212.       case 129: c = 13+'~'; break; // 'Ł'
  213.       case 131: c = 14+'~'; break; // 'Ń'
  214.       case 147: c = 15+'~'; break; // 'Ó'
  215.       case 154: c = 16+'~'; break; // 'Ś'
  216.       case 185: c = 17+'~'; break; // 'Ź'
  217.       case 187: c = 18+'~'; break; // 'Ż'
  218.       default:  break;
  219.     }
  220.     dualChar = 0;
  221.     return c;
  222.   }    
  223.   switch(_c) {
  224.     case 185: c = 1+'~'; break;
  225.     case 230: c = 2+'~'; break;
  226.     case 234: c = 3+'~'; break;
  227.     case 179: c = 4+'~'; break;
  228.     case 241: c = 5+'~'; break;
  229.     case 243: c = 6+'~'; break;
  230.     case 156: c = 7+'~'; break;
  231.     case 159: c = 8+'~'; break;
  232.     case 191: c = 9+'~'; break;
  233.     case 165: c = 10+'~'; break;
  234.     case 198: c = 11+'~'; break;
  235.     case 202: c = 12+'~'; break;
  236.     case 163: c = 13+'~'; break;
  237.     case 209: c = 14+'~'; break;
  238.     case 211: c = 15+'~'; break;
  239.     case 140: c = 16+'~'; break;
  240.     case 143: c = 17+'~'; break;
  241.     case 175: c = 18+'~'; break;
  242.     default:  break;
  243.   }
  244.   return c;
  245. }
  246.  
  247. // =======================================================================
  248.  
  249. void printCharWithShift(unsigned char c, int shiftDelay) {
  250.   c = convertPolish(c);
  251.   if (c < ' ' || c > '~'+25) return;
  252.   c -= 32;
  253.   int w = showChar(c, font);
  254.   for (int i=0; i<w+1; i++) {
  255.     delay(shiftDelay);
  256.     scrollLeft();
  257.     refreshAll();
  258.   }
  259. }
  260.  
  261. // =======================================================================
  262.  
  263. void printStringWithShift(const char* s, int shiftDelay){
  264.   while (*s) {
  265.     printCharWithShift(*s, shiftDelay);
  266.     s++;
  267.   }
  268. }
  269. // =======================================================================
  270.  
  271. void getTime()
  272. {
  273.   WiFiClient client;
  274.   if (!client.connect("www.google.com", 80)) {
  275.     Serial.println("connection to google failed");
  276.     return;
  277.   }
  278.  
  279.   client.print(String("GET / HTTP/1.1\r\n") +
  280.                String("Host: www.google.com\r\n") +
  281.                String("Connection: close\r\n\r\n"));
  282.   int repeatCounter = 0;
  283.   while (!client.available() && repeatCounter < 10) {
  284.     delay(500);
  285.     //Serial.println(".");
  286.     repeatCounter++;
  287.   }
  288.  
  289.   String line;
  290.   client.setNoDelay(false);
  291.   while(client.connected() && client.available()) {
  292.     line = client.readStringUntil('\n');
  293.     line.toUpperCase();
  294.     if (line.startsWith("DATE: ")) {
  295.       date = "     "+line.substring(6, 22);
  296.       date.toUpperCase();
  297. //      decodeDate(date);
  298.       h = line.substring(23, 25).toInt();
  299.       m = line.substring(26, 28).toInt();
  300.       s = line.substring(29, 31).toInt();
  301.       summerTime = checkSummerTime();
  302.         if(h+utcOffset+summerTime>23) {
  303.           if(++day>31) { day=1; month++; };  // needs better patch
  304.           if(++dayOfWeek>7) dayOfWeek=1;
  305.         }
  306.       localMillisAtUpdate = millis();
  307.       localEpoc = (h * 60 * 60 + m * 60 + s);
  308.     }
  309.   }
  310.   client.stop();
  311. }
  312.  
  313. // =======================================================================
  314.  
  315. int checkSummerTime()
  316. {
  317.   if(month>3 && month<10) return 1;
  318.   if(month==3 && day>=31-(((5*year/4)+4)%7) ) return 1;
  319.   if(month==10 && day<31-(((5*year/4)+1)%7) ) return 1;
  320.   return 0;
  321. }
  322. // =======================================================================
  323.  
  324. // =======================================================================
  325.  
  326. void updateTime()
  327. {
  328.   long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  329.   long epoch = round( curEpoch + 3600 * ( utcOffset + summerTime ) + 86400L ) % 86400L;
  330.   h = ((epoch  % 86400L) / 3600) % 24;
  331.   m = (epoch % 3600) / 60;
  332.   s = epoch % 60;
  333. }
  334.  
  335. // =======================================================================
(#) kaqkk válasza Shance hozzászólására (») Okt 28, 2023 / 1
 
Ha még egy évet kibírsz okafogyottá válik a dolog 2024 ben lesz az utolsó átállítás ...
(#) asch válasza Shance hozzászólására (») Okt 28, 2023 /
 
Nagyon trükkös program! A google szervere a http kérés headerjében megadja a pillanatnyi pontos időt is, és ehhez állítja be magát az óra. Így nem kell NTP-t implementálni, hanem egy sima TCP alapú lekéréssel jön is az idő. Tetszik! Magamtól nem jutott volna eszembe, de használni fogom, ha hasonlóra szükségem lesz. Nyilván helyi http szerverrel is működik, ha nem akarunk egy ilyen egyszerű dolgot google-függővé tenni.
A http Date headerben - könnyen ki lehet próbálni telnet www.google.com 80 paranccsal a kérés 3 sorát begépelve - a válaszként elküldött dátum GMT-ben van megadva, amiben nincsen téli-nyári időszámítás, azaz ez az abszolút Greenich idő. (Nálam ez volt a válasz sor most: "Date: Sat, 28 Oct 2023 12:01:49 GMT" )
A programban több hiba is van: a checkSummerTime a month, year és day értékek szerint elágazik - gondolom helyesen -, de ezek nincsenek beállítva, a kezdeti vélhetően 0 értékükön vannak végig. A decodeDate hívás ki van kommentelve, szerintem ennek kellene kitöltenie ezeket az értékeket ami alapján elágazunk.
A másik hiba, hogy a summertime-ot kétszer is beleszámolja a program: egyszer a getTime, amikor a helyi órát beállítja, és egyszer az updateTime kijelzéskor. Nem gondoltam teljesen végig, de vagy kétszeresen lesz számítva, vagy kioltják egymást, vagy ilyesmi.
A hozzászólás módosítva: Okt 28, 2023
(#) MATA válasza asch hozzászólására (») Okt 28, 2023 /
 
Hello!
Ezt a üzenetet adja állandóan az Eclipse:
15:32:46 **** Incremental Build of configuration Release for project DigitalPowerSupply-1 ****
make all
Building file: ../sensors/ds18b20.cpp
Invoking: AVR C++ Compiler
avr-g++ -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -funsigned-char -funsigned-bitfields -fno-exceptions -mmcu=atmega8 -DF_CPU=16000000UL -MMD -MP -MF"sensors/ds18b20.d" -MT"sensors/ds18b20.o" -c -o "sensors/ds18b20.o" "../sensors/ds18b20.cpp"
make: *** [sensors/ds18b20.o] Error -1073741502
"make all" terminated with exit code 2. Build might be incomplete.

15:32:55 Build Failed. 1 errors, 0 warnings. (took 8s.609ms)
Meg hogy az AVR-G+CC nem tudott elindulni.
(#) Pethical válasza MATA hozzászólására (») Okt 28, 2023 / 1
 
Húha, ezt nem lesz könnyű kideríteni. A -1073741502 hiba azt jelenti, hogy a gcc-t nincs jogosultsága elindítni a makenak, ami nagyon fura, de ránéznék azért a gcc-re, hogy kinek van joga futtatni. Ha ez nem hoz eredményt akkor sajnos semmi más ötletem nincsen.
(#) MATA válasza Pethical hozzászólására (») Okt 28, 2023 /
 
Hello!
Még csak most kezdtem használni az Eclips-et. Ezt hol lehet megnézni hogy kinek van jogosultsàga elindítani a gcc-t?
(#) Pethical válasza MATA hozzászólására (») Okt 28, 2023 /
 
Milyen rendszeren vagy, Linux, Windows?
(#) mnyugger válasza kaqkk hozzászólására (») Okt 28, 2023 /
 
Remélem nyárira és úgy marad. Ha nem, elsüllyedünk a sötétségbe.
(#) MATA válasza Pethical hozzászólására (») Okt 28, 2023 /
 
Windows.
(#) Pethical válasza MATA hozzászólására (») Okt 28, 2023 /
 
Húha, az nehezebb (legalábbis nekem). Szerintem nézzük meg, hogy jó helyen keresi-e a make az avr-gcc-t. Ha jó helyen, akkor lövésem sincsen sajnos.
(#) asch válasza MATA hozzászólására (») Okt 28, 2023 /
 
Nekem gyanús, hogy valójában nem jogosultság probléma lesz. Van egyáltalán több felhasználód Windowson?
Kipróbálni úgy lehet, hogy indítasz egy parancssort. https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt...ws-10/
Utána a paracssorba beírod, hogy "avr-g++" és enter. Erre el kell indulni a programnak. Nekem ezt mondja:
  1. $ avr-g++
  2. avr-g++: fatal error: no input files
  3. compilation terminated.

Ha nem telepítetted, akkor azt fogja mondani, hogy nincs ilyen parancs, és szerintem ezért nem működik a build sem, nem jogosultság baja van. Sajnos nem tudom hogy kell Windowsra telepíteni. Van jópár találat a kérdésre, de egyik válasz mellé sem tudok teljes mellszélességgel odaállni.
Illetve egy ötletem van: az Arduino hoz magával egy avr-gcc-t. Erre rákeresnék, hogy hová tette (intézőből fájl keresővel az avr-g++.exe -t keresve), és azt a könyvtárat hozzáadnám a PATH-hoz. Így nem kell új dolgot telepíteni.
A hozzászólás módosítva: Okt 28, 2023
Következő: »»   819 / 850
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