EEPROM version
This commit is contained in:
parent
8c79fce887
commit
4f4bba55f1
@ -8,14 +8,15 @@
|
||||
GPRS modem(Serial1, MOD_PWR);
|
||||
bool modemOK = false;
|
||||
byte modemErrCount = 0;
|
||||
DHT dht(T_PIN, DHT11);
|
||||
DHT11 tSensor(T_PIN);
|
||||
|
||||
char command[CMD_SIZE];
|
||||
char message[SMS_SIZE];
|
||||
char phone[PHONE_SIZE];
|
||||
char datetime[DATE_SIZE];
|
||||
char s_buffer[BUFFER_SIZE];
|
||||
char s_buffer[SHORT_BUFFER_SIZE];
|
||||
char l_buffer[LONG_BUFFER_SIZE];
|
||||
char vl_buffer[SMS_SIZE + 80];
|
||||
|
||||
bool cmdFromModem = false;
|
||||
|
||||
@ -28,22 +29,22 @@ byte btnCount = 0;
|
||||
bool btnTrigger = false;
|
||||
byte event;
|
||||
|
||||
const float r12_1 = 20000; // 20K
|
||||
const float r12_2 = 10000; // 10K
|
||||
const float r5_1 = 10000; // 20K
|
||||
const float r5_2 = 10000; // 10K
|
||||
const float rbat_1 = 10000; // 10K
|
||||
const float rbat_2 = 10000; // 10K
|
||||
const float rout_1 = 10000; // 10K
|
||||
const float rout_2 = 10000; // 10K
|
||||
const float rin_1 = 200000; // 200K
|
||||
const float rin_2 = 100000; // 100K
|
||||
const float rbat_1 = 100000; // 100K
|
||||
const float rbat_2 = 100000; // 100K
|
||||
const float rusb_1 = 100000; // 100K
|
||||
const float rusb_2 = 100000; // 100K
|
||||
|
||||
float vcc = 0.0;
|
||||
float k12, k5, kbat, kout;
|
||||
float v12, v5, vbat, vout;
|
||||
float kin, kbat, kusb;
|
||||
float vin, vbat, vusb;
|
||||
|
||||
// эту константу (typVbg) необходимо откалибровать индивидуально
|
||||
const float typVbg = 1.08; // 1.0 -- 1.2
|
||||
|
||||
#ifdef MAIN
|
||||
|
||||
void setup() {
|
||||
Serial.begin(COM_BR);
|
||||
Serial1.begin(MOD_BR);
|
||||
@ -52,23 +53,22 @@ void setup() {
|
||||
|
||||
// Конфигурируем пины
|
||||
pinMode(A_PIN, INPUT);
|
||||
pinMode(V5_PIN, INPUT);
|
||||
pinMode(V12_PIN, INPUT);
|
||||
pinMode(BAT_T_PIN, INPUT);
|
||||
pinMode(VIN_PIN, INPUT);
|
||||
pinMode(VBAT_PIN, INPUT);
|
||||
pinMode(VOUT_PIN, INPUT);
|
||||
pinMode(VUSB_PIN, INPUT);
|
||||
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
pinMode(BTN_PIN, INPUT);
|
||||
pinMode(FAN_PIN, OUTPUT);
|
||||
|
||||
// Инициализируем климатический сенсор
|
||||
dht.begin();
|
||||
tSensor.begin();
|
||||
|
||||
// Коэффициенты делителей напряжений
|
||||
k12 = r12_2 / (r12_1 + r12_2);
|
||||
k5 = r5_2 / (r5_1 + r5_2);
|
||||
kin = rin_2 / (rin_1 + rin_2);
|
||||
kbat = rbat_2 / (rbat_1 + rbat_2);
|
||||
kout = rout_2 / (rout_1 + rout_2);
|
||||
kusb = rusb_2 / (rusb_1 + rusb_2);
|
||||
|
||||
modem.controlGPIO(1, 0);
|
||||
modem.controlGPIO(2, 0);
|
||||
@ -77,17 +77,13 @@ void setup() {
|
||||
|
||||
sprint("Init");
|
||||
printParams();
|
||||
sprint_P(str_help);
|
||||
|
||||
initEEPROM();
|
||||
printHelp();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
if (millis() - t > PERIOD) {
|
||||
if (millis() - t < PERIOD) {
|
||||
getStatus();
|
||||
t = millis();
|
||||
//sprint("Status!");
|
||||
}
|
||||
|
||||
checkModem();
|
||||
@ -100,59 +96,60 @@ void loop() {
|
||||
sprint(">", false);
|
||||
sprint(command);
|
||||
|
||||
if (!strcmp_P(command, cmd_status)) {
|
||||
if (isCommandMatchIndex(command, CMD_INDEX_STATUS)) {
|
||||
//printAll();
|
||||
getStatusMessage(message);
|
||||
returnAnswer(message);
|
||||
} else if (!strcmp_P(command, cmd_help)) {
|
||||
sprint_P(str_help);
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_HELP)) {
|
||||
printHelp();
|
||||
sendHelp();
|
||||
} else if (!strcmp_P(command, cmd_sms_on)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_SMS_ON)) {
|
||||
smsOn(true);
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_sms_off)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_SMS_OFF)) {
|
||||
smsOn(false);
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_auth_on)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_AUTH_ON)) {
|
||||
authOn(true);
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_auth_off)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_AUTH_OFF)) {
|
||||
authOn(false);
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_fwd_on)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_FWD_ON)) {
|
||||
fwdOn(true);
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_fwd_off)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_FWD_OFF)) {
|
||||
fwdOn(false);
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_on)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_ON)) {
|
||||
mainPowerOn();
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_off)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_OFF)) {
|
||||
mainPowerOff();
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_reset)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_RESET)) {
|
||||
mainReset();
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_a)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_A)) {
|
||||
a_PowerBreak();
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_b)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_B)) {
|
||||
b_PowerBreak();
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_forward)) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_FORWARD)) {
|
||||
forwardLastSMS();
|
||||
} else if (!strcmp_P(command, cmd_modem_reset) && !cmdFromModem) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_MODEM_RESET) && !cmdFromModem) {
|
||||
modem.reset();
|
||||
modem.init();
|
||||
returnAnswer();
|
||||
} else if (!strcmp_P(command, cmd_modem_console) && !cmdFromModem) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_MODEM_CONSOLE) && !cmdFromModem) {
|
||||
modemConsole();
|
||||
} else if (!strcmp_P(command, cmd_edit_ab) && !cmdFromModem) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_EDIT_AB) && !cmdFromModem) {
|
||||
editAddressBook();
|
||||
} else if (!strcmp_P(command, cmd_show_ab) && !cmdFromModem) {
|
||||
} else if (isCommandMatchIndex(command, CMD_INDEX_SHOW_AB) && !cmdFromModem) {
|
||||
printAddressBook();
|
||||
} else {
|
||||
sprint_P(str_help);
|
||||
printHelp();
|
||||
sendHelp();
|
||||
}
|
||||
}
|
||||
@ -178,7 +175,7 @@ void loop() {
|
||||
sprint("Out call: ", phone);
|
||||
while (true) {
|
||||
ledOn();
|
||||
event = modem.getEvent(message, phone, datetime, l_buffer, LONG_BUFFER_SIZE, NO_CHECK);
|
||||
event = modem.getEvent(message, phone, datetime, vl_buffer, VLONG_BUFFER_SIZE, NO_CHECK);
|
||||
ledOff();
|
||||
delay(150);
|
||||
|
||||
@ -200,6 +197,8 @@ void loop() {
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Запрос статуса
|
||||
word getStatus() {
|
||||
unsigned int stat = 0;
|
||||
@ -213,8 +212,8 @@ word getStatus() {
|
||||
if (loud > 250) stat |= LOUD_WARN;
|
||||
|
||||
getVs();
|
||||
if (v12 < 10) stat |= POWER_WARN;
|
||||
if (vbat < 6.4) stat |= BAT_WARN;
|
||||
if (vin < 10) stat |= POWER_WARN;
|
||||
if (vbat < 3.7) stat |= BAT_WARN;
|
||||
|
||||
return stat;
|
||||
}
|
||||
@ -237,10 +236,9 @@ void printAll() {
|
||||
sprint("fwd: ", fwdOn(), true);
|
||||
|
||||
sprint("Vcc: ", vcc);
|
||||
sprint("V12: ", v12);
|
||||
sprint("V5: ", v5);
|
||||
sprint("Vin: ", vin);
|
||||
sprint("Vbat: ", vbat);
|
||||
sprint("Vout: ", vout);
|
||||
sprint("Vusb: ", vusb);
|
||||
}
|
||||
|
||||
// Формируем читабельную строку со статусом
|
||||
@ -278,13 +276,8 @@ void getStatusMessage(char *message) {
|
||||
strcat(message, s);
|
||||
strcat(message, "V");
|
||||
|
||||
strcat(message, "\nV12: ");
|
||||
ftoa(v12, s);
|
||||
strcat(message, s);
|
||||
strcat(message, "V");
|
||||
|
||||
strcat(message, " V5: ");
|
||||
ftoa(v5, s);
|
||||
strcat(message, " Vin: ");
|
||||
ftoa(vin, s);
|
||||
strcat(message, s);
|
||||
strcat(message, "V");
|
||||
|
||||
@ -293,8 +286,8 @@ void getStatusMessage(char *message) {
|
||||
strcat(message, s);
|
||||
strcat(message, "V");
|
||||
|
||||
strcat(message, " Vout: ");
|
||||
ftoa(vout, s);
|
||||
strcat(message, " Vusb: ");
|
||||
ftoa(vusb, s);
|
||||
strcat(message, s);
|
||||
strcat(message, "V");
|
||||
|
||||
@ -319,12 +312,20 @@ void getStatusMessage(char *message) {
|
||||
else strcat(message, "Off");
|
||||
}
|
||||
|
||||
// Обработка событий модема
|
||||
bool isCommandMatchIndex(const char *command, byte index) {
|
||||
char t_command[CMD_SIZE];
|
||||
|
||||
if (!getCommand(index, t_command)) return false;
|
||||
|
||||
return !strcmp(command, t_command);
|
||||
}
|
||||
|
||||
// Консоль модема
|
||||
void checkModem() {
|
||||
cmdFromModem = false;
|
||||
command[0] = '\0';
|
||||
|
||||
switch (modem.getEvent(message, phone, datetime, l_buffer, LONG_BUFFER_SIZE)) {
|
||||
switch (modem.getEvent(message, phone, datetime, vl_buffer, VLONG_BUFFER_SIZE)) {
|
||||
case ERR:
|
||||
sprint("Mdm err!");
|
||||
modemOK = false;
|
||||
@ -345,7 +346,7 @@ void checkModem() {
|
||||
flash(3);
|
||||
|
||||
if (authOn() && !authOK(phone)) {
|
||||
strcpy_P(command, cmd_forward);
|
||||
getCommand(CMD_INDEX_FORWARD, command);
|
||||
} else {
|
||||
strncpy(command, message, CMD_SIZE);
|
||||
}
|
||||
@ -385,9 +386,8 @@ void checkModem() {
|
||||
modemOK = true;
|
||||
}
|
||||
|
||||
// Консоль модема
|
||||
void modemConsole() {
|
||||
sprint_P(str_modem_cons_on);
|
||||
printShortString(S_STRING_INDEX_MODEM_CONS_ON);
|
||||
sprint("Timeout is ", TIMEOUT, false);
|
||||
sprint(" ms after last command");
|
||||
|
||||
@ -397,7 +397,7 @@ void modemConsole() {
|
||||
if (Serial1.available()) {
|
||||
while(Serial1.available()) {
|
||||
s_buffer[i++] = Serial1.read();
|
||||
if(i == BUFFER_SIZE) break;
|
||||
if(i == SHORT_BUFFER_SIZE) break;
|
||||
}
|
||||
|
||||
Serial.write(s_buffer, i);
|
||||
@ -409,7 +409,46 @@ void modemConsole() {
|
||||
t = millis();
|
||||
}
|
||||
}
|
||||
sprint_P(str_modem_cons_off);
|
||||
printShortString(S_STRING_INDEX_MODEM_CONS_OFF);
|
||||
}
|
||||
|
||||
// Обработка звонков
|
||||
void incomingCall() {
|
||||
//if (!modem.ifcallNow()) return;
|
||||
|
||||
if (!modem.isCallActive(phone, l_buffer)) return;
|
||||
sprint("Call from: ", false);
|
||||
sprint(phone);
|
||||
|
||||
if (authOn() && !authOK(phone)) {
|
||||
modem.callEnd();
|
||||
sprint("Call unauth");
|
||||
return;
|
||||
} else modem.answer();
|
||||
|
||||
while (!modem.ifcallEnd()) {
|
||||
|
||||
}
|
||||
sprint("Call over");
|
||||
}
|
||||
|
||||
// Читаем команды с GSM-модема
|
||||
void readModem(char* msg, byte msg_size) {
|
||||
msg[0] = '\0';
|
||||
message[0] = '\0';
|
||||
|
||||
if (!modemOK) return;
|
||||
|
||||
if (modem.getSMS(message, phone, datetime, vl_buffer, VLONG_BUFFER_SIZE)) {
|
||||
// sprint("Msg: ", message);
|
||||
// sprint("Phn: ", phone);
|
||||
// sprint("Dtm: ", datetime);
|
||||
if (authOn() && !authOK(phone)) {
|
||||
getCommand(CMD_INDEX_FORWARD, msg);
|
||||
return;
|
||||
}
|
||||
strncpy(msg, message, msg_size);
|
||||
}
|
||||
}
|
||||
|
||||
// Читаем команды с COM-порта
|
||||
@ -442,7 +481,14 @@ void returnAnswer(const char * answer) {
|
||||
void sendHelp() {
|
||||
if (modemOK && smsOn() && cmdFromModem) {
|
||||
if (authOn() && !authOK(phone)) return;
|
||||
modem.sendSMS(phone, str_help);
|
||||
|
||||
message[0] = '\0';
|
||||
getLongString(L_STRING_INDEX_HELP_1, l_buffer);
|
||||
strcat(message, l_buffer);
|
||||
getLongString(L_STRING_INDEX_HELP_2, l_buffer);
|
||||
strcat(message, l_buffer);
|
||||
|
||||
modem.sendSMS(phone, message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -457,12 +503,12 @@ void forwardLastSMS() {
|
||||
|
||||
if (fwdOn() && entryNotEmpty(0)) {
|
||||
loadPhoneNumber(0, main_phone);
|
||||
s_buffer[0] = '\0';
|
||||
strcat(s_buffer, "SMS from ");
|
||||
strcat(s_buffer, phone);
|
||||
strcat(s_buffer, " at ");
|
||||
strcat(s_buffer, datetime);
|
||||
modem.sendSMS(main_phone, s_buffer);
|
||||
l_buffer[0] = '\0';
|
||||
strcat(l_buffer, "SMS from ");
|
||||
strcat(l_buffer, phone);
|
||||
strcat(l_buffer, " at ");
|
||||
strcat(l_buffer, datetime);
|
||||
modem.sendSMS(main_phone, l_buffer);
|
||||
modem.sendSMS(main_phone, message);
|
||||
}
|
||||
}
|
||||
@ -478,7 +524,7 @@ void mainPowerOn() {
|
||||
|
||||
void mainPowerOff() {
|
||||
modem.controlGPIO(1, 1);
|
||||
delay(6000);
|
||||
delay(5000);
|
||||
modem.controlGPIO(1, 0);
|
||||
}
|
||||
|
||||
@ -502,7 +548,7 @@ void b_PowerBreak() {
|
||||
|
||||
bool isPowerOn() {
|
||||
getVs();
|
||||
if (v12 > 10) return true;
|
||||
if (vin > 10) return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
@ -574,30 +620,30 @@ void editAddressBook() {
|
||||
char indexString[4];
|
||||
byte index, i = 0;
|
||||
|
||||
sprint_P(str_eab);
|
||||
sprint_P(str_help_ab);
|
||||
sprint_P(str_format_ab);
|
||||
printShortString(S_STRING_INDEX_EAB_MODE);
|
||||
printLongString(L_STRING_INDEX_HELP_AB);
|
||||
printLongString(L_STRING_INDEX_FORMAT_AB);
|
||||
|
||||
t = millis();
|
||||
while (millis() - t < TIMEOUT) {
|
||||
readSerial(s_buffer, BUFFER_SIZE);
|
||||
readSerial(s_buffer, SHORT_BUFFER_SIZE);
|
||||
|
||||
if (s_buffer[0] != '\0') {
|
||||
t = millis();
|
||||
|
||||
if (!strcmp_P(s_buffer, cmd_exit)) {
|
||||
if (isCommandMatchIndex(s_buffer, CMD_INDEX_EXIT)) {
|
||||
break;
|
||||
} else if (!strcmp_P(s_buffer, cmd_show)) {
|
||||
} else if (isCommandMatchIndex(s_buffer, CMD_INDEX_SHOW)) {
|
||||
printAddressBook();
|
||||
} else if (!strcmp_P(s_buffer, cmd_clear)) {
|
||||
} else if (isCommandMatchIndex(s_buffer, CMD_INDEX_CLEAR)) {
|
||||
clearAddressBook();
|
||||
} else {
|
||||
p = strstr(s_buffer, ":");
|
||||
i = 0;
|
||||
while(s_buffer[i] != ':' && i < BUFFER_SIZE) i++;
|
||||
while(s_buffer[i] != ':' && i < SHORT_BUFFER_SIZE) i++;
|
||||
|
||||
if (p == NULL || i == 0 || i > 1) {
|
||||
sprint_P(str_format_ab);
|
||||
printLongString(L_STRING_INDEX_FORMAT_AB);
|
||||
} else {
|
||||
// Get index
|
||||
clearBuffer(indexString, 4);
|
||||
@ -621,7 +667,7 @@ void editAddressBook() {
|
||||
}
|
||||
}
|
||||
}
|
||||
sprint_P(str_help);
|
||||
printHelp();
|
||||
}
|
||||
|
||||
// Утилиты
|
||||
@ -629,6 +675,23 @@ void clearBuffer(char *in_buffer, byte in_size) {
|
||||
for(byte i = 0; i < in_size - 1; i++) in_buffer[i] = '\0';
|
||||
}
|
||||
|
||||
void printShortString(byte index, bool ln) {
|
||||
getShortString(index, s_buffer);
|
||||
Serial.print(s_buffer);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void printLongString(byte index, bool ln) {
|
||||
getLongString(index, l_buffer);
|
||||
Serial.print(l_buffer);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void printHelp() {
|
||||
printLongString(L_STRING_INDEX_HELP_1, false);
|
||||
printLongString(L_STRING_INDEX_HELP_2);
|
||||
}
|
||||
|
||||
void printParams() {
|
||||
if(smsOn()) sprint("SMS on | ", false); else sprint("SMS off | ", false);
|
||||
if(authOn()) sprint("Auth on | ", false); else sprint("Auth off | ", false);
|
||||
@ -645,62 +708,118 @@ bool authOK(char *phone) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void sprint(const char *description, const byte data, const bool ln) {
|
||||
void sprint(const char * description, const byte data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const char *data, const bool ln) {
|
||||
void sprint(const char * description, const char * data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const int data, const bool ln) {
|
||||
void sprint(const char * description, const int data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const unsigned int data, const bool ln) {
|
||||
void sprint(const char * description, const unsigned int data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const long int data, const bool ln) {
|
||||
void sprint(const char * description, const long int data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const long unsigned int data, const bool ln) {
|
||||
void sprint(const char * description, const long unsigned int data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const float data, const bool ln) {
|
||||
void sprint(const char * description, const float data, const bool ln) {
|
||||
Serial.print(description);
|
||||
Serial.print(data);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint(const char *description, const bool ln) {
|
||||
void sprint(const char * description, const bool ln) {
|
||||
Serial.print(description);
|
||||
if (ln) Serial.println();
|
||||
}
|
||||
|
||||
void sprint_P(const char *description, const bool ln) {
|
||||
int len = strlen_P(description);
|
||||
char c;
|
||||
// EEPROM utils
|
||||
bool setCommand(byte index, const char *command) {
|
||||
if (index > CMD_MAX_INDEX) return false;
|
||||
|
||||
for (byte i = 0; i < len; i++) {
|
||||
c = pgm_read_byte_near(description + i);
|
||||
Serial.print(c);
|
||||
}
|
||||
if (ln) Serial.println();
|
||||
addr = CMD_ADDR + index * CMD_SIZE;
|
||||
|
||||
for (byte i = 0; i < CMD_SIZE; i++)
|
||||
EEPROM.update(addr + i, command[i]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool getCommand(byte index, char *command) {
|
||||
if (index > CMD_MAX_INDEX) return false;
|
||||
|
||||
addr = CMD_ADDR + index * CMD_SIZE;
|
||||
|
||||
for (byte i = 0; i < CMD_SIZE; i++)
|
||||
command[i] = EEPROM.read(addr + i);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool setShortString(byte index, const char *s_buffer) {
|
||||
if (index > S_STRING_MAX_INDEX) return false;
|
||||
|
||||
addr = S_STRING_ADDR + index * SHORT_BUFFER_SIZE;
|
||||
|
||||
for (byte i = 0; i < SHORT_BUFFER_SIZE; i++)
|
||||
EEPROM.update(addr + i, s_buffer[i]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool getShortString(byte index, char *s_buffer) {
|
||||
if (index > S_STRING_MAX_INDEX) return false;
|
||||
|
||||
addr = S_STRING_ADDR + index * SHORT_BUFFER_SIZE;
|
||||
|
||||
for (byte i = 0; i < SHORT_BUFFER_SIZE; i++)
|
||||
s_buffer[i] = EEPROM.read(addr + i);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool setLongString(byte index, const char *l_buffer) {
|
||||
if (index > L_STRING_MAX_INDEX) return false;
|
||||
|
||||
addr = L_STRING_ADDR + index * LONG_BUFFER_SIZE;
|
||||
|
||||
for (byte i = 0; i < LONG_BUFFER_SIZE; i++)
|
||||
EEPROM.update(addr + i, l_buffer[i]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool getLongString(byte index, char *l_buffer) {
|
||||
if (index > L_STRING_MAX_INDEX) return false;
|
||||
|
||||
addr = L_STRING_ADDR + index * LONG_BUFFER_SIZE;
|
||||
|
||||
for (byte i = 0; i < LONG_BUFFER_SIZE; i++)
|
||||
l_buffer[i] = EEPROM.read(addr + i);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool smsOn() {
|
||||
@ -803,39 +922,35 @@ float readvcc() {
|
||||
}
|
||||
|
||||
void getVs() {
|
||||
v12 = 0.0;
|
||||
v5 = 0.0;
|
||||
vin = 0.0;
|
||||
vbat = 0.0;
|
||||
vout = 0.0;
|
||||
vusb = 0.0;
|
||||
|
||||
v12 += readvcc() * analogRead(V12_PIN);
|
||||
v5 += readvcc() * analogRead(V5_PIN);
|
||||
vin += readvcc() * analogRead(VIN_PIN);
|
||||
vbat += readvcc() * analogRead(VBAT_PIN);
|
||||
vout += readvcc() * analogRead(VOUT_PIN);
|
||||
vusb += readvcc() * analogRead(VUSB_PIN);
|
||||
|
||||
vcc = readvcc();
|
||||
v12 = v12 / 1024.0 / k12;
|
||||
v5 = v5 / 1024.0 / k5;
|
||||
vin = vin / 1024.0 / kin;
|
||||
vbat = vbat / 1024.0 / kbat;
|
||||
vout = vout / 1024.0 / kout;
|
||||
vusb = vusb / 1024.0 / kusb;
|
||||
}
|
||||
|
||||
void printVs() {
|
||||
sprint("Vcc: ", vcc);
|
||||
sprint("V12: ", v12);
|
||||
sprint("V5: ", v5);
|
||||
sprint("Vin: ", vin);
|
||||
sprint("Vbat: ", vbat);
|
||||
sprint("Vout: ", vout);
|
||||
sprint("Vusb: ", vusb);
|
||||
}
|
||||
|
||||
void getTH() {
|
||||
int check;
|
||||
|
||||
check = dht.read();
|
||||
check = tSensor.read();
|
||||
switch (check) {
|
||||
case DHT_OK:
|
||||
temp = dht.getTemperatureC();
|
||||
hum = dht.getHumidity();
|
||||
temp = tSensor.getTemperatureC();
|
||||
hum = tSensor.getHumidity();
|
||||
break;
|
||||
case DHT_ERROR_TIMEOUT:
|
||||
temp = 253;
|
||||
@ -864,14 +979,135 @@ void ftoa(float f, char *s) {
|
||||
strcat(s, t);
|
||||
}
|
||||
|
||||
void initEEPROM() {
|
||||
int flag_addr = PARAM_ADDR + EEPROM_INIT_INDEX;
|
||||
#ifdef INIT
|
||||
|
||||
#define HELP_INIT "Usage: help | fill | print cmd | print short | print long"
|
||||
|
||||
void fillEEPROM() {
|
||||
// ClearParams
|
||||
smsOn(false);
|
||||
authOn(true);
|
||||
fwdOn(true);
|
||||
|
||||
if (EEPROM.read(flag_addr) != INIT_FLAG) {
|
||||
clearAddressBook();
|
||||
smsOn(false);
|
||||
authOn(true);
|
||||
fwdOn(true);
|
||||
EEPROM.write(flag_addr, INIT_FLAG);
|
||||
// Fill commands
|
||||
// -- 123456789012345
|
||||
// 0 status
|
||||
setCommand(CMD_INDEX_STATUS, "status");
|
||||
// 1 help
|
||||
setCommand(CMD_INDEX_HELP, "help");
|
||||
// 2 sms on
|
||||
setCommand(CMD_INDEX_SMS_ON, "sms on");
|
||||
// 3 sms off
|
||||
setCommand(CMD_INDEX_SMS_OFF, "sms off");
|
||||
// 4 on
|
||||
setCommand(CMD_INDEX_ON, "on");
|
||||
// 5 off
|
||||
setCommand(CMD_INDEX_OFF, "off");
|
||||
// 6 reset
|
||||
setCommand(CMD_INDEX_RESET, "reset");
|
||||
// 7 a
|
||||
setCommand(CMD_INDEX_A, "a");
|
||||
// 8 b
|
||||
setCommand(CMD_INDEX_B, "b");
|
||||
// 9 forward
|
||||
setCommand(CMD_INDEX_FORWARD, "forward");
|
||||
// 10
|
||||
setCommand(CMD_INDEX_10, "<NONE>");
|
||||
// 11 modem reset
|
||||
setCommand(CMD_INDEX_MODEM_RESET, "modem reset");
|
||||
// 12 modem console
|
||||
setCommand(CMD_INDEX_MODEM_CONSOLE, "modem console");
|
||||
// 13 edit ab
|
||||
setCommand(CMD_INDEX_EDIT_AB, "edit ab");
|
||||
// 14 show ab
|
||||
setCommand(CMD_INDEX_SHOW_AB, "show ab");
|
||||
// 15 show
|
||||
setCommand(CMD_INDEX_SHOW, "show");
|
||||
// 16 clear
|
||||
setCommand(CMD_INDEX_CLEAR, "clear");
|
||||
// 17 exit
|
||||
setCommand(CMD_INDEX_EXIT, "exit");
|
||||
// 18 auth on
|
||||
setCommand(CMD_INDEX_AUTH_ON, "auth on");
|
||||
// 19 auth off
|
||||
setCommand(CMD_INDEX_AUTH_OFF, "auth off");
|
||||
// 20 forward on
|
||||
setCommand(CMD_INDEX_FWD_ON, "forward on");
|
||||
// 21 forward off
|
||||
setCommand(CMD_INDEX_FWD_OFF, "forward off");
|
||||
// 22
|
||||
setCommand(CMD_INDEX_22, "<NONE>");
|
||||
// 23
|
||||
setCommand(CMD_INDEX_23, "<NONE>");
|
||||
|
||||
//Fill short strings
|
||||
// -- 1234567890123456789012345678901
|
||||
// 0 edit ab|show ab
|
||||
setShortString(S_STRING_INDEX_1, "<NONE>");
|
||||
// 1 Edit address book mode
|
||||
setShortString(S_STRING_INDEX_EAB_MODE, "Edit address book mode");
|
||||
// 2 Modem console mode on
|
||||
setShortString(S_STRING_INDEX_MODEM_CONS_ON, "Modem console mode on");
|
||||
// 3 Modem console mode off
|
||||
setShortString(S_STRING_INDEX_MODEM_CONS_OFF, "Modem console mode off");
|
||||
|
||||
//Fill long strings
|
||||
// -- 123456789012345678901234567890123456789012345678901234567890123
|
||||
// 0 Usage: help/status/on/off/reset/a/b/modem reset|console/edit ab
|
||||
setLongString(L_STRING_INDEX_HELP_1, "Usage: help/status/on/off/reset/a/b/modem reset|console/edit ab");
|
||||
// 1 Type \"show\" to view, \"clear\" to erase, \"exit\" to return
|
||||
setLongString(L_STRING_INDEX_HELP_AB, "Type \"show\" to view, \"clear\" to erase, \"exit\" to return");
|
||||
// 2 Format: \"i:+xxxxxxxxxxx\" to update or \"i:delete\" to delete
|
||||
setLongString(L_STRING_INDEX_FORMAT_AB, "Format: \"i:+xxxxxxxxxxx\" to update or \"i:delete\" to delete");
|
||||
// 3 /show ab/sms on|off/auth on|off/fwd on|off
|
||||
setLongString(L_STRING_INDEX_HELP_2, "/show ab/sms on|off/auth on|off/fwd on|off");
|
||||
}
|
||||
|
||||
void setup() {
|
||||
delay(5000);
|
||||
Serial.println("Watchdog EEPROM init program");
|
||||
Serial.println(HELP_INIT);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
readSerial(command, CMD_SIZE);
|
||||
|
||||
if (command[0] != '\0') {
|
||||
Serial.println(command);
|
||||
|
||||
if (!strcmp(command, "fill")) {
|
||||
fillEEPROM();
|
||||
Serial.println("EEPROM init complete");
|
||||
} else if (!strcmp(command, "print cmd")) {
|
||||
Serial.println("cmd: ");
|
||||
for(byte i = 0; i <= CMD_MAX_INDEX; i++) {
|
||||
getCommand(i, command);
|
||||
Serial.print(i);
|
||||
Serial.print(": ");
|
||||
Serial.println(command);
|
||||
}
|
||||
} else if (!strcmp(command, "print short")) {
|
||||
Serial.println("short: ");
|
||||
for(byte i = 0; i <= S_STRING_MAX_INDEX; i++) {
|
||||
getShortString(i, s_buffer);
|
||||
Serial.print(i);
|
||||
Serial.print(": ");
|
||||
Serial.println(s_buffer);
|
||||
}
|
||||
} else if (!strcmp(command, "print long")) {
|
||||
Serial.println("long: ");
|
||||
for(byte i = 0; i <= L_STRING_MAX_INDEX; i++) {
|
||||
getLongString(i, l_buffer);
|
||||
Serial.print(i);
|
||||
Serial.print(": ");
|
||||
Serial.println(l_buffer);
|
||||
}
|
||||
} else if (!strcmp(command, "help")) {
|
||||
Serial.println(HELP_INIT);
|
||||
} else {
|
||||
Serial.println(HELP_INIT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
123
watchdog_3.h
123
watchdog_3.h
@ -5,18 +5,23 @@
|
||||
// ----------------------------------------------------------------------------------------------------
|
||||
|
||||
#include <EEPROM.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "GPRS_Shield_Arduino.h"
|
||||
#include <TroykaDHT.h>
|
||||
#include <TroykaDHT11.h>
|
||||
|
||||
//#define INIT
|
||||
#define MAIN
|
||||
|
||||
/*
|
||||
* EEPROM mapping
|
||||
* 1024 Kb
|
||||
* 1024 B
|
||||
* 10 x 16 = 160 - address book | first addr 0
|
||||
* 16 x 1 = 16 - parameters | first addr 160
|
||||
* 24 x 16 = 384 - commands | first addr 176
|
||||
* 4 x 32 = 128 - short strings | first addr 560
|
||||
* 4 x 64 = 256 - long strings | first addr 688
|
||||
* -------------
|
||||
* 176 bytes
|
||||
* 848 bytes free
|
||||
* 944 bytes
|
||||
* 80 bytes free
|
||||
*/
|
||||
|
||||
#define AB_ADDR 0
|
||||
@ -27,40 +32,51 @@
|
||||
#define SMS_ON_INDEX 0
|
||||
#define AUTH_ON_INDEX 1
|
||||
#define FWD_ON_INDEX 2
|
||||
#define EEPROM_INIT_INDEX 15
|
||||
|
||||
#define INIT_FLAG 0xAC
|
||||
#define CMD_ADDR 176
|
||||
#define CMD_MAX_INDEX 23
|
||||
|
||||
const char cmd_status[] PROGMEM = {"status"};
|
||||
const char cmd_help[] PROGMEM = {"help"};
|
||||
const char cmd_sms_on[] PROGMEM = {"sms on"};
|
||||
const char cmd_sms_off[] PROGMEM = {"sms off"};
|
||||
const char cmd_on[] PROGMEM = {"on"};
|
||||
const char cmd_off[] PROGMEM = {"off"};
|
||||
const char cmd_reset[] PROGMEM = {"reset"};
|
||||
const char cmd_a[] PROGMEM = {"a"};
|
||||
const char cmd_b[] PROGMEM = {"b"};
|
||||
const char cmd_forward[] PROGMEM = {"forward"};
|
||||
const char cmd_modem_reset[] PROGMEM = {"modem reset"};
|
||||
const char cmd_modem_console[] PROGMEM = {"modem console"};
|
||||
const char cmd_edit_ab[] PROGMEM = {"edit ab"};
|
||||
const char cmd_show_ab[] PROGMEM = {"show ab"};
|
||||
const char cmd_show[] PROGMEM = {"show"};
|
||||
const char cmd_clear[] PROGMEM = {"clear"};
|
||||
const char cmd_exit[] PROGMEM = {"exit"};
|
||||
const char cmd_auth_on[] PROGMEM = {"auth on"};
|
||||
const char cmd_auth_off[] PROGMEM = {"auth off"};
|
||||
const char cmd_fwd_on[] PROGMEM = {"forward on"};
|
||||
const char cmd_fwd_off[] PROGMEM = {"forward off"};
|
||||
#define S_STRING_ADDR 560
|
||||
#define S_STRING_MAX_INDEX 3
|
||||
|
||||
const char str_init_eeprom[] PROGMEM = {"EEPROM init complete"};
|
||||
const char str_eab[] PROGMEM = {"Edit address book mode"};
|
||||
const char str_modem_cons_on[] PROGMEM = {"Modem console mode on"};
|
||||
const char str_modem_cons_off[] PROGMEM = {"Modem console mode off"};
|
||||
#define L_STRING_ADDR 688
|
||||
#define L_STRING_MAX_INDEX 3
|
||||
|
||||
#define CMD_INDEX_STATUS 0
|
||||
#define CMD_INDEX_HELP 1
|
||||
#define CMD_INDEX_SMS_ON 2
|
||||
#define CMD_INDEX_SMS_OFF 3
|
||||
#define CMD_INDEX_ON 4
|
||||
#define CMD_INDEX_OFF 5
|
||||
#define CMD_INDEX_RESET 6
|
||||
#define CMD_INDEX_A 7
|
||||
#define CMD_INDEX_B 8
|
||||
#define CMD_INDEX_FORWARD 9
|
||||
#define CMD_INDEX_10 10
|
||||
#define CMD_INDEX_MODEM_RESET 11
|
||||
#define CMD_INDEX_MODEM_CONSOLE 12
|
||||
#define CMD_INDEX_EDIT_AB 13
|
||||
#define CMD_INDEX_SHOW_AB 14
|
||||
#define CMD_INDEX_SHOW 15
|
||||
#define CMD_INDEX_CLEAR 16
|
||||
#define CMD_INDEX_EXIT 17
|
||||
#define CMD_INDEX_AUTH_ON 18
|
||||
#define CMD_INDEX_AUTH_OFF 19
|
||||
#define CMD_INDEX_FWD_ON 20
|
||||
#define CMD_INDEX_FWD_OFF 21
|
||||
#define CMD_INDEX_22 22
|
||||
#define CMD_INDEX_23 23
|
||||
|
||||
#define S_STRING_INDEX_1 0
|
||||
#define S_STRING_INDEX_EAB_MODE 1
|
||||
#define S_STRING_INDEX_MODEM_CONS_ON 2
|
||||
#define S_STRING_INDEX_MODEM_CONS_OFF 3
|
||||
|
||||
#define L_STRING_INDEX_HELP_1 0
|
||||
#define L_STRING_INDEX_HELP_AB 1
|
||||
#define L_STRING_INDEX_FORMAT_AB 2
|
||||
#define L_STRING_INDEX_HELP_2 3
|
||||
|
||||
const char str_help[] PROGMEM = {"Usage: help/status/on/off/reset/a/b/modem reset|console/edit ab/show ab/sms on|off/auth on|off/fwd on|off"};
|
||||
const char str_help_ab[] PROGMEM = {"Type \"show\" to view, \"clear\" to erase, \"exit\" to return"};
|
||||
const char str_format_ab[] PROGMEM = {"Format: \"i:+xxxxxxxxxxx\" to update or \"i:delete\" to delete"};
|
||||
|
||||
// Всякое
|
||||
#define TIMEOUT 60000
|
||||
@ -72,10 +88,10 @@ const char str_format_ab[] PROGMEM = {"Format: \"i:+xxxxxxxxxxx\" to update or
|
||||
// Сенсоры
|
||||
#define A_PIN A0
|
||||
#define T_PIN A1
|
||||
#define VOUT_PIN A2
|
||||
#define BAT_T_PIN A2
|
||||
#define VBAT_PIN A3
|
||||
#define V5_PIN A4
|
||||
#define V12_PIN A5
|
||||
#define VUSB_PIN A4
|
||||
#define VIN_PIN A5
|
||||
|
||||
#define LED_PIN 13
|
||||
#define BTN_PIN 12
|
||||
@ -92,8 +108,9 @@ const char str_format_ab[] PROGMEM = {"Format: \"i:+xxxxxxxxxxx\" to update or
|
||||
#define SMS_SIZE 160
|
||||
#define PHONE_SIZE 16
|
||||
#define DATE_SIZE 24
|
||||
#define BUFFER_SIZE 64
|
||||
#define LONG_BUFFER_SIZE 240
|
||||
#define SHORT_BUFFER_SIZE 32
|
||||
#define LONG_BUFFER_SIZE 64
|
||||
#define VLONG_BUFFER_SIZE 240
|
||||
|
||||
// Флаги статуса
|
||||
#define TEMP_WARN 0x01
|
||||
@ -137,15 +154,22 @@ void printHelp();
|
||||
void printParams();
|
||||
bool authOK(char *phone);
|
||||
|
||||
void sprint(const char *description, const byte data, const bool ln = true);
|
||||
void sprint(const char *description, const char *data, const bool ln = true);
|
||||
void sprint(const char *description, const int data, const bool ln = true);
|
||||
void sprint(const char *description, const unsigned int data, const bool ln = true);
|
||||
void sprint(const char *description, const long int data, const bool ln = true);
|
||||
void sprint(const char *description, const long unsigned int data, const bool ln = true);
|
||||
void sprint(const char *description, const float data, const bool ln = true);
|
||||
void sprint(const char *description, const bool ln = true);
|
||||
void sprint_P(const char *description, const bool ln = true);
|
||||
void sprint(const char * description, const byte data, const bool ln = true);
|
||||
void sprint(const char * description, const char * data, const bool ln = true);
|
||||
void sprint(const char * description, const int data, const bool ln = true);
|
||||
void sprint(const char * description, const unsigned int data, const bool ln = true);
|
||||
void sprint(const char * description, const long int data, const bool ln = true);
|
||||
void sprint(const char * description, const long unsigned int data, const bool ln = true);
|
||||
void sprint(const char * description, const float data, const bool ln = true);
|
||||
void sprint(const char * description, const bool ln = true);
|
||||
|
||||
// EEPROM utils
|
||||
bool setCommand(byte index, const char *command);
|
||||
bool getCommand(byte index, char *command);
|
||||
bool setShortString(byte index, const char *s_buffer);
|
||||
bool getShortString(byte index, char *s_buffer);
|
||||
bool setLongString(byte index, const char *l_buffer);
|
||||
bool getLongString(byte index, char *l_buffer);
|
||||
|
||||
bool smsOn();
|
||||
void smsOn(bool temp);
|
||||
@ -165,4 +189,3 @@ float readvcc();
|
||||
void getVs();
|
||||
void printVs();
|
||||
void getTH();
|
||||
void initEEPROM();
|
||||
|
Loading…
Reference in New Issue
Block a user