Skip to content

Commit f2f996c

Browse files
committed
Добавлена поддержка EEPROM для сохранения PID-параметров и пример
1 parent 456b2b3 commit f2f996c

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

DallasTemperature.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,4 +806,26 @@ int16_t DallasTemperature::getUserDataByIndex(uint8_t deviceIndex) {
806806
DeviceAddress deviceAddress;
807807
getAddress(deviceAddress, deviceIndex);
808808
return getUserData((uint8_t*)deviceAddress);
809-
}
809+
}
810+
struct PIDParams { float Kp; float Ki; float Kd; uint16_t checksum; };
811+
static uint16_t calcChecksum(const PIDParams &p) {
812+
uint32_t sum = 0;
813+
sum += *((uint32_t*)&p.Kp);
814+
sum += *((uint32_t*)&p.Ki);
815+
sum += *((uint32_t*)&p.Kd);
816+
return (uint16_t)(sum & 0xFFFF);
817+
}
818+
bool PID::saveParameters(int addr) {
819+
PIDParams p{dispKp, dispKi, dispKd, 0};
820+
p.checksum = calcChecksum(p);
821+
for (size_t i = 0; i < sizeof(p); ++i) EEPROM.write(addr + i, *((uint8_t*)&p + i));
822+
EEPROM.commit();
823+
return true;
824+
}
825+
bool PID::loadParameters(int addr) {
826+
PIDParams p;
827+
for (size_t i = 0; i < sizeof(p); ++i) *((uint8_t*)&p + i) = EEPROM.read(addr + i);
828+
if (p.checksum != calcChecksum(p)) return false;
829+
dispKp = p.Kp; dispKi = p.Ki; dispKd = p.Kd;
830+
return true;
831+
}

DallasTemperature.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ class DallasTemperature {
121121
bool recallScratchPad(const uint8_t* = nullptr);
122122
void setAutoSaveScratchPad(bool);
123123
bool getAutoSaveScratchPad(void);
124+
bool saveParameters(int addr = 0);
125+
bool loadParameters(int addr = 0);
126+
124127

125128
#if REQUIRESALARMS
126129
typedef void AlarmHandler(const uint8_t*);

examples/EEPROM_PID/EEPROM_PID.ino

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <EEPROM.h>
2+
#include <PID_v1.h>
3+
4+
#define EEPROM_SIZE 64
5+
6+
double Setpoint, Input, Output;
7+
PID myPID(&Input, &Output, &Setpoint, 2.0, 5.0, 1.0, DIRECT);
8+
9+
void setup() {
10+
Serial.begin(115200);
11+
EEPROM.begin(EEPROM_SIZE);
12+
if (myPID.loadParameters(0)) {
13+
Serial.println("PID params loaded from EEPROM:");
14+
} else {
15+
Serial.println("No valid params in EEPROM, using defaults.");
16+
}
17+
Serial.print("Kp="); Serial.println(myPID.GetKp());
18+
Serial.print("Ki="); Serial.println(myPID.GetKi());
19+
Serial.print("Kd="); Serial.println(myPID.GetKd());
20+
myPID.SetMode(AUTOMATIC);
21+
}
22+
23+
void loop() {
24+
Input = analogRead(A0) * (5.0 / 1023.0);
25+
myPID.Compute();
26+
analogWrite(5, Output);
27+
if (Serial.available()) {
28+
char cmd = Serial.read();
29+
if (cmd == 's') {
30+
double newKp = myPID.GetKp() + 0.5;
31+
myPID.SetTunings(newKp, myPID.GetKi(), myPID.GetKd());
32+
myPID.saveParameters(0);
33+
Serial.print("Saved new Kp="); Serial.println(newKp);
34+
}
35+
}
36+
delay(1000);
37+
}

0 commit comments

Comments
 (0)