|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
(#) |
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!
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.
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: /*
File: main.cpp
Version: 1.0 - first version
Date: April 7, 2015
License: GPL v2
Digital Bench Power supply
http://www.pocketmagic.net/digital-bench-power-supply/
****************************************************************************
Copyright (C) 2015 Radu Motisan <radu.motisan@gmail.com>
http://www.pocketmagic.net
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
****************************************************************************
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <string.h>
#include <stdlib.h>
#include "timeout.h"
#include "io/DigitalIn.h"
#include "io/DigitalOut.h"
#include "lcd/hd44780.h"
#include "misc/aux.h"
#include "misc/pwm.h"
/************************************************************************************************************************************************/
/* Main entry point */
/************************************************************************************************************************************************/
HD44780 lcd;
PWM pwm;
DigitalOut relay,
speaker,
fan;
but2, // v-
but3, // i+
but4; // i-
float tempval = 0;
float vref = 5.0;
/* power control modes */
#define MODE_MEASURE_CURRENT 0
#define MODE_MEASURE_VOLTAGE 1
volatile bool adc_mode = MODE_MEASURE_CURRENT;
volatile float current = 0, voltage = 0;
/* my power supply after rectifier shows 16.1V on the center tap and 33.8V on full secondary
* opamp will introduce some upper voltage limitations. Currently using TL082 and we can reach close to 26V maximum
*/
#define VOLTAGE_LIMIT 26
#define CURRENT_LIMIT 5
#define TEMPERATURE_STARTFAN 50 // if 40degrees celsius are reached, we will start the fan
#define TEMPERATURE_SHUTDOWN 70 // if 80degrees celsius are reached, we will reduce the power until the unit cools down
/* set default values: later save/load them to/from EEPROM */
volatile float targetVol = 5.0, targetCur = 1;
volatile bool alarm = false;
uint16_t cycles = 0;
// Interrupt service routine for the ADC completion
// we measure the current (PC5) and the voltage (PC4) alternatively
ISR(ADC_vect){
uint16_t analogVal = ADCL | (ADCH << 8);
if (adc_mode == MODE_MEASURE_CURRENT) {
current = (analogVal / 1024.0 * vref) / 0.186666; // the output power resistor measures 0.55Ohm
// alternate mode
adc_mode = MODE_MEASURE_VOLTAGE;
ADMUX = PC4; // next time we will do ADC on PC4, to get the voltage
} else if (adc_mode == MODE_MEASURE_VOLTAGE) {
// the actual R13 and R14 resistors can be measured using a multimeter for better accuracy
float R14 = 9.87, /*10k*/ R13 = 98.2; /*100K */
voltage = analogVal / 1024.0 * (R13 + R14) / R14 * vref;
// alternate mode
adc_mode = MODE_MEASURE_CURRENT;
ADMUX = PC5; // next time we will do ADC on PC5, to get the current
}
// If free-running mode is enabled (ADFR), we don't need to restart conversion
// But we can't use ADFR as we want to monitor two separate ADC channels alternatively
// start another ADC conversion
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADIF) /* | (1<<ADFR) */ | (1<<ADSC) |
(1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // set prescaler to 128 (16M/128=125kHz, above 200KHz 10bit results are not reliable)
// control operations, in order
// 1. act on short circuit
// decrease quickly on current spike
if (current > targetCur + targetCur / 2) {
pwm.setDuty(pwm.getDuty() / 2);
alarm = true; // will sound alarm in main thread
}
// 2.act on over current
// decrease slowly on higher current
else if (current > targetCur) {
pwm.setDuty(pwm.getDuty() - 1);
}
// 3.act on over temperature
else if (tempval > TEMPERATURE_SHUTDOWN) {
pwm.setDuty(pwm.getDuty() - 1);
alarm = true;
}
// 4. act on over voltage
// take care of voltage with lower priority
else if (voltage > targetVol) pwm.setDuty(pwm.getDuty() - 1);
// 5. act on under voltage
else if (voltage < targetVol) pwm.setDuty(pwm.getDuty() + 1);
}
int main(void) {
// setup everything
relay.init(&PORTD, PD5);
fan.init(&PORTD, PD6);
speaker.init(&PORTB, PB0);
pwm.initPWM();
but2.init(&PORTC, PC1);
but3.init(&PORTC, PC2);
but4.init(&PORTC, PC3);
lcd.init(&PORTD, PD4, &PORTB, PB3, &PORTD, PD3, &PORTB, PB4, &PORTD, PD2, &PORTB, PB5); //RS, E, D4, D5, D6, D7
// setup ADC to measure as interrupt: go for current first
adc_mode = MODE_MEASURE_CURRENT;
ADMUX = PC5;
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADIF) | (1<<ADSC) |
(1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // set prescaler to 128 (16M/128=125kHz, above 200KHz 10bit results are not reliable)
sei();
// show welcome screen
lcd.sendstring("********************\n"\
"*Digital Pwr Supply*\n"\
"*pocketmagic.net'15*\n"\
"********************\n");
// keep screen then clear
//_delay_ms(500);
// main loop
while (1) {
// engage relay if we're at 12V or more. use measured voltage or configured voltage?
relay.set(targetVol > 12);
// engage fan is temperature is above threshold
fan.set(tempval > TEMPERATURE_STARTFAN);
// limit the frequency for some ops including display and temperature reading
if (cycles == 0) {
float temp = 0;
cli();
if (ds18b20. readTemperature(&temp ) == THERM_OK )
tempval = temp;
sei();
lcd.cursorhome();
lcd.sendstringformat(
" +SET: %5.2fV %5.2fA\n"\
"%5.1fC %5.2fV %5.2fA\n"\
"%s PWM:%4d\n"
"2015 pocketmagic.net",
targetVol, targetCur,
tempval, voltage, current,
fan.get()?" +FAN":" ",
pwm.getDuty()
);
}
cycles ++;
if (cycles > 10000) cycles = 0;
// sound alarm
if (alarm) {
speaker.set(1);
_delay_ms(30);
speaker.set(0);
// stop alarm
alarm = false;
}
// act on buttons
if (targetVol < VOLTAGE_LIMIT) targetVol += 0.1;
cycles = 0; // force lcd refresh
}
if (but2.get() == 0) {
if (targetVol > 0.1) targetVol -= 0.1;
cycles = 0; // force lcd refresh
}
if (but3.get() == 0) {
if (targetCur < CURRENT_LIMIT) targetCur += 0.1;
cycles = 0; // force lcd refresh
}
if (but4.get() == 0) {
if (targetCur > 0.1) targetCur -= 0.1;
cycles = 0; // force lcd refresh
}
}
}
Köszönöm előre is ha valaki tudna ebbe segélni.
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:
-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.
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!
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.
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:
Building target: DigitalPowerSupply-1.elf
Invoking: AVR C++ Linker
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
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
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?
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.
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.
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.
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
Oké köszönöm megnézem ezt majd.
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 vagy szavakra.
Lehet board specifikusan is allitani pl:
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
Köszönöm ránézünk erre is.
Köszönöm utána nézek a dolognak.
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!
#include "Arduino.h"
#include <ArduinoJson.h>
#include < ESP8266WiFi. h> //ESP8266 Core WiFi Library (you most likely already have this in your sketch)
WiFiClient client;
int day, month, year, dayOfWeek;
int summerTime = 1;
String date;
#define NUM_MAX 4
// for NodeMCU 1.0
#define DIN_PIN 13 // D7
#define CS_PIN 0 // D3
#define CLK_PIN 14 // D5
#include "fonts.h"
#define HOSTNAME "ESP-Clock"
// =======================================================================
// CHANGE YOUR CONFIG HERE:
// =======================================================================
const char* ssid = "UPC177AF56"; // SSID of local network
const char* password = "kxmkkfCxps4m"; // Password on network
void setup()
{
Serial.begin(115200);
initMAX7219();
sendCmdAll(CMD_SHUTDOWN,1);
sendCmdAll(CMD_INTENSITY,5);
Serial.print("Connecting WiFi ");
WiFi.begin(ssid, password);
printStringWithShift("Connecting",15);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("MyIP: "); Serial.println(WiFi.localIP());
printStringWithShift((String(" MyIP: ")+WiFi.localIP().toString()).c_str(), 15);
delay(1500);
}
// =============================DEFINE VARS==============================
#define MAX_DIGITS 20
byte dig[MAX_DIGITS]={0};
byte digold[MAX_DIGITS]={0};
byte digtrans[MAX_DIGITS]={0};
int updCnt = 0;
int dots = 0;
long dotTime = 0;
long clkTime = 0;
int dx=0;
int dy=0;
byte del=0;
int h,m,s;
float utcOffset = +2;
long localEpoc = 0;
long localMillisAtUpdate = 0;
// =======================================================================
void loop()
{
if(updCnt<=0) { // every 10 scrolls, ~450s=7.5m
updCnt = 60;
Serial.println("Getting data ...");
printStringWithShift(" Setting Time...",15);
getTime();
Serial.println("Data loaded");
clkTime = millis();
}
if(millis()-clkTime > 60000 && !del && dots) { // clock for 30s, then scrolls for about 30s
// printStringWithShift(date.c_str(),40);
// delay(2000);
updCnt--;
clkTime = millis();
}
if(millis()-dotTime > 500) {
dotTime = millis();
dots = !dots;
}
updateTime();
showAnimClock();
}
// =======================================================================
void showSimpleClock()
{
dx=dy=0;
clr();
showDigit(h/10, 0, dig6x8);
showDigit(h%10, 8, dig6x8);
showDigit(m/10, 17, dig6x8);
showDigit(m%10, 25, dig6x8);
showDigit(s/10, 34, dig6x8);
showDigit(s%10, 42, dig6x8);
setCol(15,dots ? B00100100 : 0);
setCol(32,dots ? B00100100 : 0);
refreshAll();
}
// =======================================================================
void showAnimClock()
{
byte digPos[6]={0,8,17,25,34,42};
int digHt = 12;
int num = 6;
int i;
if(del==0) {
del = digHt;
for(i=0; i<num; i++) digold[i] = dig[i];
dig[0] = h/10 ? h/10 : 10;
dig[1] = h%10;
dig[2] = m/10;
dig[3] = m%10;
dig[4] = s/10;
dig[5] = s%10;
for(i=0; i<num; i++) digtrans[i] = (dig[i]==digold[i]) ? 0 : digHt;
} else
del--;
clr();
for(i=0; i<num; i++) {
if(digtrans[i]==0) {
dy=0;
showDigit(dig[i], digPos[i], dig6x8);
} else {
dy = digHt-digtrans[i];
showDigit(digold[i], digPos[i], dig6x8);
dy = -digtrans[i];
showDigit(dig[i], digPos[i], dig6x8);
digtrans[i]--;
}
}
dy=0;
setCol(15,dots ? B00100100 : 0);
setCol(32,dots ? B00100100 : 0);
refreshAll();
delay(30);
}
// =======================================================================
void showDigit(char ch, int col, const uint8_t *data)
{
if(dy<-8 | dy>8) return;
int len = pgm_read_byte(data);
int w = pgm_read_byte(data + 1 + ch * len);
col += dx;
for (int i = 0; i < w; i++)
if(col+i>=0 && col+i<8*NUM_MAX) {
byte v = pgm_read_byte(data + 1 + ch * len + 1 + i);
if(!dy) scr[col + i] = v; else scr[col + i] |= dy>0 ? v>>dy : v<<-dy;
}
}
// =======================================================================
void setCol(int col, byte v)
{
if(dy<-8 | dy>8) return;
col += dx;
if(col>=0 && col<8*NUM_MAX)
if(!dy) scr[col] = v; else scr[col] |= dy>0 ? v>>dy : v<<-dy;
}
// =======================================================================
int showChar(char ch, const uint8_t *data)
{
int len = pgm_read_byte(data);
int i,w = pgm_read_byte(data + 1 + ch * len);
for (i = 0; i < w; i++)
scr[NUM_MAX*8 + i] = pgm_read_byte(data + 1 + ch * len + 1 + i);
scr[NUM_MAX*8 + i] = 0;
return w;
}
// =======================================================================
int dualChar = 0;
unsigned char convertPolish(unsigned char _c)
{
unsigned char c = _c;
if(c==196 || c==197 || c==195) {
dualChar = c;
return 0;
}
if(dualChar) {
switch(_c) {
case 133: c = 1+'~'; break; // 'ą'
case 135: c = 2+'~'; break; // 'ć'
case 153: c = 3+'~'; break; // 'ę'
case 130: c = 4+'~'; break; // 'ł'
case 132: c = dualChar==197 ? 5+'~' : 10+'~'; break; // 'ń' and 'Ą'
case 179: c = 6+'~'; break; // 'ó'
case 155: c = 7+'~'; break; // 'ś'
case 186: c = 8+'~'; break; // 'ź'
case 188: c = 9+'~'; break; // 'ż'
//case 132: c = 10+'~'; break; // 'Ą'
case 134: c = 11+'~'; break; // 'Ć'
case 152: c = 12+'~'; break; // 'Ę'
case 129: c = 13+'~'; break; // 'Ł'
case 131: c = 14+'~'; break; // 'Ń'
case 147: c = 15+'~'; break; // 'Ó'
case 154: c = 16+'~'; break; // 'Ś'
case 185: c = 17+'~'; break; // 'Ź'
case 187: c = 18+'~'; break; // 'Ż'
default: break;
}
dualChar = 0;
return c;
}
switch(_c) {
case 185: c = 1+'~'; break;
case 230: c = 2+'~'; break;
case 234: c = 3+'~'; break;
case 179: c = 4+'~'; break;
case 241: c = 5+'~'; break;
case 243: c = 6+'~'; break;
case 156: c = 7+'~'; break;
case 159: c = 8+'~'; break;
case 191: c = 9+'~'; break;
case 165: c = 10+'~'; break;
case 198: c = 11+'~'; break;
case 202: c = 12+'~'; break;
case 163: c = 13+'~'; break;
case 209: c = 14+'~'; break;
case 211: c = 15+'~'; break;
case 140: c = 16+'~'; break;
case 143: c = 17+'~'; break;
case 175: c = 18+'~'; break;
default: break;
}
return c;
}
// =======================================================================
void printCharWithShift(unsigned char c, int shiftDelay) {
c = convertPolish(c);
if (c < ' ' || c > '~'+25) return;
c -= 32;
int w = showChar(c, font);
for (int i=0; i<w+1; i++) {
delay(shiftDelay);
scrollLeft();
refreshAll();
}
}
// =======================================================================
void printStringWithShift(const char* s, int shiftDelay){
while (*s) {
printCharWithShift(*s, shiftDelay);
s++;
}
}
// =======================================================================
void getTime()
{
WiFiClient client;
if (!client.connect("www.google.com", 80)) {
Serial.println("connection to google failed");
return;
}
client.print(String("GET / HTTP/1.1\r\n") +
String("Host: www.google.com\r\n") +
String("Connection: close\r\n\r\n"));
int repeatCounter = 0;
while (!client.available() && repeatCounter < 10) {
delay(500);
//Serial.println(".");
repeatCounter++;
}
String line;
client.setNoDelay(false);
while(client.connected() && client.available()) {
line = client.readStringUntil('\n');
line.toUpperCase();
if (line.startsWith("DATE: ")) {
date = " "+line.substring(6, 22);
date.toUpperCase();
// decodeDate(date);
h = line.substring(23, 25).toInt();
m = line.substring(26, 28).toInt();
s = line.substring(29, 31).toInt();
summerTime = checkSummerTime();
if(h+utcOffset+summerTime>23) {
if(++day>31) { day=1; month++; }; // needs better patch
if(++dayOfWeek>7) dayOfWeek=1;
}
localMillisAtUpdate = millis();
localEpoc = (h * 60 * 60 + m * 60 + s);
}
}
client.stop();
}
// =======================================================================
int checkSummerTime()
{
if(month>3 && month<10) return 1;
if(month==3 && day>=31-(((5*year/4)+4)%7) ) return 1;
if(month==10 && day<31-(((5*year/4)+1)%7) ) return 1;
return 0;
}
// =======================================================================
// =======================================================================
void updateTime()
{
long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
long epoch = round( curEpoch + 3600 * ( utcOffset + summerTime ) + 86400L ) % 86400L;
h = ((epoch % 86400L) / 3600) % 24;
m = (epoch % 3600) / 60;
s = epoch % 60;
}
// =======================================================================
Ha még egy évet kibírsz okafogyottá válik a dolog 2024 ben lesz az utolsó átállítás ...
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
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.
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.
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?
Milyen rendszeren vagy, Linux, Windows?
Remélem nyárira és úgy marad. Ha nem, elsüllyedünk a sötétségbe.
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.
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:
$ avr-g++
avr-g++: fatal error: no input files
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
|
|