From e25e9fdcdba4ad4a11d30193bfba2ccbea3b4fe1 Mon Sep 17 00:00:00 2001 From: eKa Date: Fri, 24 Jan 2020 22:32:44 +0500 Subject: [PATCH] Old backup --- GPRS_Shield_Arduino.cpp | 301 ++++--------- GPRS_Shield_Arduino.h | 35 +- sim900.cpp | 72 ++- watchdog_3-leonardo.ino | 960 ++++++++++------------------------------ 4 files changed, 363 insertions(+), 1005 deletions(-) diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index b55f0c8..5b51198 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -35,7 +35,8 @@ GPRS* GPRS::inst; -GPRS::GPRS(Stream& serial, uint8_t pkPin) { +GPRS::GPRS(Stream& serial, uint8_t pkPin) +{ _pkPin = pkPin; inst = this; @@ -44,13 +45,16 @@ GPRS::GPRS(Stream& serial, uint8_t pkPin) { sim900_init(stream); } -bool GPRS::init(void) { +bool GPRS::init(void) +{ if (!sim900_check_with_cmd("AT\r\n","OK\r\n",CMD)) return false; + if (!sim900_check_with_cmd("AT+CFUN=1\r\n","OK\r\n",CMD)) return false; + if (!checkSIMStatus()) return false; @@ -74,7 +78,7 @@ bool GPRS::init(void) { } bool GPRS::checkPowerUp(void) { - return sim900_check_with_cmd("AT\r\n","OK\r\n", CMD); + return sim900_check_with_cmd("AT\r\n","OK\r\n", CMD); } // power Up GPRS Shield @@ -101,7 +105,8 @@ void GPRS::reset() { powerOn(); } -bool GPRS::checkSIMStatus(void) { +bool GPRS::checkSIMStatus(void) +{ char gprsBuffer[32]; byte count = 0; sim900_clean_buffer(gprsBuffer,32); @@ -120,7 +125,8 @@ bool GPRS::checkSIMStatus(void) { return true; } -bool GPRS::sendSMS(const char *number, const char *data) { +bool GPRS::sendSMS(char *number, char *data) +{ // Set message mode to ASCII if(!sim900_check_with_cmd("AT+CMGF=1\r\n", "OK\r\n", CMD)) { return false; @@ -138,11 +144,11 @@ bool GPRS::sendSMS(const char *number, const char *data) { sim900_send_cmd(data); delay(500); sim900_send_End_Mark(); - - return sim900_wait_for_resp("OK\r\n", CMD, 2); + return true; } -char GPRS::isSMSunread() { +char GPRS::isSMSunread() +{ char gprsBuffer[48]; //48 is enough to see +CMGL: char *s; @@ -170,7 +176,7 @@ char GPRS::isSMSunread() { */ sim900_clean_buffer(gprsBuffer,31); - sim900_read_buffer(gprsBuffer, 30, DEFAULT_TIMEOUT); + sim900_read_buffer(gprsBuffer,30,DEFAULT_TIMEOUT); //Serial.print("Buffer isSMSunread: ");Serial.println(gprsBuffer); if(NULL != ( s = strstr(gprsBuffer,"OK"))) { @@ -229,149 +235,23 @@ bool GPRS::readSMS(int messageIndex, char *message, byte length) { return false; } -byte GPRS::getEvent(char *message, char *phone, char *datetime, char *gprsBuffer, byte size, bool check) { - int len; - byte i = 0; - char *s, *p1, *p2; - - // Read buffer - sim900_clean_buffer(gprsBuffer, size); - sim900_read_buffer(gprsBuffer, size - 1); - - len = strlen(gprsBuffer); - - // Get SMS - s = strstr(gprsBuffer,"+CMT: "); - if (s != NULL) { - // Extract phone number string - p1 = strstr(gprsBuffer, "\"+"); - p2 = p1 + 1; //First phone number character - p1 = strstr((char *)(p2), "\""); - if (p1 != NULL) { - i = 0; - while (p2 < p1) { - phone[i++] = *(p2++); - } - phone[i] = '\0'; - } - - // Extract date time string - p1 = strstr((char *)(p2), ","); - p2 = p1 + 1; - p1 = strstr((char *)(p2), ","); - p2 = p1 + 2; //First date time character - p1 = strstr((char *)(p2), "\""); - if (p1 != NULL) { - i = 0; - while (p2 < p1) { - datetime[i++] = *(p2++); - } - datetime[i] = '\0'; - } - - // Extract message - p2 = strstr(gprsBuffer, "\r\n"); - p2 = p2 + 2; - p1 = strstr(p2, "\r\n"); - if (p1 != NULL) { - i = 0; - p1 = p1 + 2; //First message character - while((*p1 != '\r') && (i < len - 1)) { - message[i++] = *(p1++); - } - message[i] = '\0'; - } - - return SMS; - } - - // Get Call - s = strstr(gprsBuffer,"+CLIP: "); - if (s != NULL) { - // Extract phone number string - p1 = strstr(gprsBuffer, "\"+"); - p2 = p1 + 1; //First phone number character - p1 = strstr((char *)(p2), "\""); - if (p1 != NULL) { - i = 0; - while (p2 < p1) { - phone[i++] = *(p2++); - } - phone[i] = '\0'; - } - - return CALL; - } - - // Get outgoing call - s = strstr(gprsBuffer,"+COLP: "); - if (s != NULL) { - // Extract phone number string - p1 = strstr(gprsBuffer, "\"+"); - p2 = p1 + 1; //First phone number character - p1 = strstr((char *)(p2), "\""); - if (p1 != NULL) { - i = 0; - while (p2 < p1) { - phone[i++] = *(p2++); - } - phone[i] = '\0'; - } - - return ANSWER; - } - - // Get BUSY - s = strstr(gprsBuffer,"BUSY"); - if (s != NULL) { - return BUSY; - } - - // Get NO CARRIER - s = strstr(gprsBuffer,"NO CARRIER"); - if (s != NULL) { - return NO_CARRIER; - } - - // Get NO ANSWER - s = strstr(gprsBuffer,"NO ANSWER"); - if (s != NULL) { - return NO_ANSWER; - } - - // Check modem - if (check) { - if (!sim900_check_with_cmd("AT\r\n","OK\r\n", CMD)) return ERR; - } - - return NONE; -} - -bool GPRS::getSMS(char *message, char *phone, char *datetime, char *gprsBuffer, byte size) { +bool GPRS::getSMS(char *message, char *phone, char *datetime) { /* Response is like: +CMT: "+79772941911","","15/12/15,01:51:24+12" SMS text here */ - //if(!sim900_check_with_cmd("","+CMT: ", CMD, 3)) return false; - if(!sim900_wait_for_resp("+CMT: ", CMD, 1)) return false; + if(!sim900_check_with_cmd("","+CMT: ",CMD)) return false; byte i = 0; - //char gprsBuffer[80 + 160]; + char gprsBuffer[80 + 160]; char *p1, *p2; - sim900_clean_buffer(gprsBuffer, size);//sizeof(gprsBuffer)); - sim900_read_buffer(gprsBuffer, size - 1);//sizeof(gprsBuffer)); + sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); + sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer)); int len = strlen(gprsBuffer); - //int len = sizeof(message); - //byte len = 160; -// Serial.print("Buff len: "); -// Serial.println(len); -// Serial.print("Buff: "); -// Serial.println(gprsBuffer); - // Serial.println("----- buffer -----"); // Serial.println(gprsBuffer); // Serial.println("^^^^^ buffer ^^^^^"); @@ -443,9 +323,9 @@ void GPRS::answer(void) sim900_send_cmd("ATA\r\n"); } -bool GPRS::ifcallNow(byte timeout) +bool GPRS::ifcallNow(void) { - return sim900_check_with_cmd("","RING\r\n",CMD, timeout); + return sim900_check_with_cmd("","RING\r\n",CMD); } bool GPRS::ifcallEnd(void) @@ -468,9 +348,9 @@ bool GPRS::disableCLIPring(void) return sim900_check_with_cmd("AT+CLIP=0\r\n","OK\r\n",CMD); } -bool GPRS::isCallActive(char *number, char *gprsBuffer) +bool GPRS::isCallActive(char *number) { - //char gprsBuffer[46]; //46 is enough to see +CPAS: and CLCC: + char gprsBuffer[46]; //46 is enough to see +CPAS: and CLCC: char *p, *s; int i = 0; @@ -490,12 +370,11 @@ bool GPRS::isCallActive(char *number, char *gprsBuffer) OK */ - sim900_clean_buffer(gprsBuffer, 46); - sim900_read_buffer(gprsBuffer, 45); + sim900_clean_buffer(gprsBuffer,29); + sim900_read_buffer(gprsBuffer,27); //HACERR cuando haga lo de esperar a OK no me haría falta esto //We are going to flush serial data until OK is recieved - //Serial.println("Wait OK"); - //sim900_wait_for_resp("OK\r\n", CMD); + sim900_wait_for_resp("OK\r\n", CMD); //Serial.print("Buffer isCallActive 1: ");Serial.println(gprsBuffer); if(NULL != ( s = strstr(gprsBuffer,"+CPAS:"))) { s = s + 7; @@ -513,8 +392,8 @@ bool GPRS::isCallActive(char *number, char *gprsBuffer) OK */ - sim900_clean_buffer(gprsBuffer, 46); - sim900_read_buffer(gprsBuffer, 45); + sim900_clean_buffer(gprsBuffer,46); + sim900_read_buffer(gprsBuffer,45); //Serial.print("Buffer isCallActive 2: ");Serial.println(gprsBuffer); if(NULL != ( s = strstr(gprsBuffer,"+CLCC:"))) { //There is at least one CALL ACTIVE, get number @@ -552,22 +431,22 @@ bool GPRS::getDateTime(char *buffer) { sim900_read_buffer(gprsBuffer,43,DEFAULT_TIMEOUT); if(NULL != ( s = strstr(gprsBuffer,"+CCLK:"))) { s = strstr((char *)(s),"\""); - s = s + 1; //We are in the first phone number character - p = strstr((char *)(s),"\""); //p is last character """ - if (NULL != s) { - i = 0; - while (s < p) { - buffer[i++] = *(s++); + s = s + 1; //We are in the first phone number character + p = strstr((char *)(s),"\""); //p is last character """ + if (NULL != s) { + i = 0; + while (s < p) { + buffer[i++] = *(s++); + } + buffer[i] = '\0'; } - buffer[i] = '\0'; + //We are going to flush serial data until OK is recieved + return sim900_wait_for_resp("OK\r\n", CMD); } - //We are going to flush serial data until OK is recieved - return sim900_wait_for_resp("OK\r\n", CMD); + return false; } - return false; -} -byte GPRS::getSignalStrength() { + byte GPRS::getSignalStrength() { //AT+CSQ: 00,00 --> 13 + CRLF = 15 // --> CRLF = 2 //OK --> 2 + CRLF = 4 @@ -588,10 +467,11 @@ byte GPRS::getSignalStrength() { //Here is where we ask for APN configuration, with F() so we can save MEMORY //bool GPRS::join(const __FlashStringHelper *apn, const __FlashStringHelper *userName, const __FlashStringHelper *passWord) -bool GPRS::join(char* apn, char* userName, char* passWord, int timeout) { - byte i; - char *p, *s; - char ipAddr[32]; + bool GPRS::join(char* apn, char* userName, char* passWord, int timeout) + { + byte i; + char *p, *s; + char ipAddr[32]; /* if(!sim900_check_with_cmd("AT+CIPSHUT\r\n","SHUT OK\r\n", CMD)) { Serial.write("Error = 1\r\n"); return false; @@ -659,40 +539,42 @@ bool GPRS::join(char* apn, char* userName, char* passWord, int timeout) { return false; } -void GPRS::disconnect() { +void GPRS::disconnect() +{ sim900_send_cmd("AT+CIPSHUT\r\n"); } -bool GPRS::connect(Protocol ptl,const char * host, int port, int timeout) { +bool GPRS::connect(Protocol ptl,const char * host, int port, int timeout) +{ //char cmd[64]; - char num[4]; - char resp[96]; + char num[4]; + char resp[96]; //sim900_clean_buffer(cmd,64); - if(ptl == TCP) { - sim900_send_cmd("AT+CIPSTART=\"TCP\",\""); - sim900_send_cmd(host); - sim900_send_cmd("\","); - itoa(port, num, 10); - sim900_send_cmd(num); - sim900_send_cmd("\r\n"); - // sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",host, port); - } else if(ptl == UDP) { - sim900_send_cmd("AT+CIPSTART=\"UDP\",\""); - sim900_send_cmd(host); - sim900_send_cmd("\","); - itoa(port, num, 10); - sim900_send_cmd(num); - sim900_send_cmd("\r\n"); - - // sprintf(cmd, "AT+CIPSTART=\"UDP\",\"%s\",%d\r\n",host, port); - } else { - return false; - } + if(ptl == TCP) { + sim900_send_cmd("AT+CIPSTART=\"TCP\",\""); + sim900_send_cmd(host); + sim900_send_cmd("\","); + itoa(port, num, 10); + sim900_send_cmd(num); + sim900_send_cmd("\r\n"); +// sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",host, port); +} else if(ptl == UDP) { + sim900_send_cmd("AT+CIPSTART=\"UDP\",\""); + sim900_send_cmd(host); + sim900_send_cmd("\","); + itoa(port, num, 10); + sim900_send_cmd(num); + sim900_send_cmd("\r\n"); - delay(2000); +// sprintf(cmd, "AT+CIPSTART=\"UDP\",\"%s\",%d\r\n",host, port); +} else { + return false; +} + +delay(2000); //sim900_send_cmd(cmd); - sim900_read_buffer(resp,96,timeout); +sim900_read_buffer(resp,96,timeout); //Serial.print("Connect resp: "); Serial.println(resp); if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK @@ -702,7 +584,8 @@ bool GPRS::connect(Protocol ptl,const char * host, int port, int timeout) { } //Overload with F() macro to SAVE memory -bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashStringHelper *port, int timeout) { +bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashStringHelper *port, int timeout) +{ //char cmd[64]; char resp[96]; @@ -727,7 +610,8 @@ bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashSt return false; } -bool GPRS::is_connected(void) { +bool GPRS::is_connected(void) +{ char resp[96]; sim900_send_cmd("AT+CIPSTATUS\r\n"); sim900_read_buffer(resp,sizeof(resp),DEFAULT_TIMEOUT); @@ -741,7 +625,8 @@ bool GPRS::is_connected(void) { } } -bool GPRS::close() { +bool GPRS::close() +{ // if not connected, return if (!is_connected()) { return true; @@ -749,19 +634,23 @@ bool GPRS::close() { return sim900_check_with_cmd("AT+CIPCLOSE\r\n", "CLOSE OK\r\n", CMD); } -int GPRS::readable(void) { +int GPRS::readable(void) +{ return sim900_check_readable(); } -int GPRS::wait_readable(int wait_time) { +int GPRS::wait_readable(int wait_time) +{ return sim900_wait_readable(wait_time); } -int GPRS::wait_writeable(int req_size) { +int GPRS::wait_writeable(int req_size) +{ return req_size+1; } -int GPRS::send(const char * str, int len) { +int GPRS::send(const char * str, int len) +{ //char cmd[32]; char num[4]; if(len > 0){ @@ -823,7 +712,8 @@ int GPRS::send(const char * str, int len) { return strlen(buf); } -uint32_t GPRS::str_to_ip(const char* str) { +uint32_t GPRS::str_to_ip(const char* str) +{ uint32_t ip = 0; char* p = (char*)str; for(int i = 0; i < 4; i++) { @@ -839,17 +729,20 @@ uint32_t GPRS::str_to_ip(const char* str) { return ip; } -char* GPRS::getIPAddress() { +char* GPRS::getIPAddress() +{ //I have already a buffer with ip_string: snprintf(ip_string, sizeof(ip_string), "%d.%d.%d.%d", (_ip>>24)&0xff,(_ip>>16)&0xff,(_ip>>8)&0xff,_ip&0xff); return ip_string; } -unsigned long GPRS::getIPnumber() { +unsigned long GPRS::getIPnumber() +{ return _ip; } -bool GPRS::controlGPIO(uint8_t index, uint8_t level) { - char num[4]; +bool GPRS::controlGPIO(uint8_t index, uint8_t level) +{ + char num[1]; sim900_send_cmd("AT+SGPIO=0,"); itoa(index, num, 10); diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index 36f516d..cf37f4f 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -32,18 +32,6 @@ #ifndef __GPRS_SHIELD_ARDUINO_H__ #define __GPRS_SHIELD_ARDUINO_H__ -#define NONE 0 -#define SMS 1 -#define CALL 2 -#define BUSY 3 -#define NO_CARRIER 4 -#define NO_ANSWER 5 -#define ANSWER 6 -#define ERR 7 - -#define CHECK true -#define NO_CHECK false - #include "sim900.h" /** GPRS class. @@ -51,13 +39,14 @@ */ enum Protocol { - CLOSED = 0, - TCP = 1, - UDP = 2, + CLOSED = 0, + TCP = 1, + UDP = 2, }; -class GPRS { - public: +class GPRS +{ +public: /** Create GPRS instance */ @@ -100,7 +89,7 @@ class GPRS { * false on success * true on error */ - bool sendSMS(const char* number, const char* data); + bool sendSMS(char* number, char* data); /** Check if there is any UNREAD SMS: this function DOESN'T change the UNREAD status of the SMS * @returns @@ -121,8 +110,6 @@ class GPRS { */ bool readSMS(int messageIndex, char *message, byte length); - - byte getEvent(char *message, char *phone, char *datetime, char *gprsBuffer, byte size, bool check = true); /** get SMS on the fly, phone and date * @param message buffer used to get SMS message @@ -133,7 +120,7 @@ class GPRS { * false on error */ - bool getSMS(char *message, char *phone, char *datetime, char *gprsBuffer, byte size); + bool getSMS(char *message, char *phone, char *datetime); /** delete SMS message on SIM card * @param index the index number which SMS message will be delete @@ -170,7 +157,7 @@ class GPRS { * true on success * false on error */ - bool ifcallNow(byte timeout = 1); + bool ifcallNow(void); bool ifcallEnd(void); @@ -183,7 +170,7 @@ class GPRS { * true on success * false on error */ - bool isCallActive(char *number, char *gprsBuffer); + bool isCallActive(char *number); /** get DateTime from SIM900 (see AT command: AT+CLTS=1) as string * @param @@ -291,7 +278,7 @@ class GPRS { */ bool controlGPIO(uint8_t num, uint8_t level); - private: +private: bool checkSIMStatus(void); uint8_t _pkPin = 9; diff --git a/sim900.cpp b/sim900.cpp index 16166f3..875bf21 100644 --- a/sim900.cpp +++ b/sim900.cpp @@ -60,43 +60,42 @@ int sim900_wait_readable (int wait_time) return dataLen; } -void sim900_flush_serial() { - while(sim900_check_readable()) { - char c = serialSIM900->read(); - } +void sim900_flush_serial() +{ + while(sim900_check_readable()){ + char c = serialSIM900->read(); + } } void sim900_read_buffer(char *buffer, int count, unsigned int timeout, unsigned int chartimeout) { - //Serial.println("Read buff"); - int i = 0; - unsigned long timerStart, prevChar; - timerStart = millis(); - prevChar = 0; - while(1) { - while (sim900_check_readable()) { - char c = serialSIM900->read(); - //Serial.print(c); - prevChar = millis(); - buffer[i++] = c; - if(i >= count) break; + int i = 0; + unsigned long timerStart, prevChar; + timerStart = millis(); + prevChar = 0; + while(1) { + while (sim900_check_readable()) { + char c = serialSIM900->read(); + prevChar = millis(); + buffer[i++] = c; + if(i >= count)break; + } + if(i >= count)break; + if ((unsigned long) (millis() - timerStart) > timeout * 1000UL) { + break; + } + //If interchar Timeout => return FALSE. So we can return sooner from this function. Not DO it if we dont recieve at least one char (prevChar <> 0) + if (((unsigned long) (millis() - prevChar) > chartimeout) && (prevChar != 0)) { + break; + } } - if(i >= count) break; - if ((unsigned long) (millis() - timerStart) > timeout * 1000UL) { - break; - } - //If interchar Timeout => return FALSE. So we can return sooner from this function. Not DO it if we dont recieve at least one char (prevChar <> 0) - if (((unsigned long) (millis() - prevChar) > chartimeout) && (prevChar != 0)) { - break; - } - } } void sim900_clean_buffer(char *buffer, int count) { - for(int i = 0; i < count; i++) { - buffer[i] = '\0'; - } + for(int i=0; i < count; i++) { + buffer[i] = '\0'; + } } //HACERR quitar esta funcion ? @@ -150,43 +149,30 @@ boolean sim900_wait_for_resp(const char* resp, DataType type, unsigned int timeo int len = strlen(resp); int sum = 0; unsigned long timerStart, prevChar; //prevChar is the time when the previous Char has been read. - -// Serial.println("Wait for resp"); -// Serial.println(resp); -// Serial.print("with length: "); -// Serial.println(len); - timerStart = millis(); prevChar = 0; - //Serial.println("Received: "); while(1) { if(sim900_check_readable()) { char c = serialSIM900->read(); - //Serial.print(c); prevChar = millis(); sum = (c==resp[sum]) ? sum+1 : 0; - if(sum == len - 1) { - //Serial.print("BREAK"); - break; - } + if(sum == len)break; } if ((unsigned long) (millis() - timerStart) > timeout * 1000UL) { - //Serial.println("Timeout"); return false; } //If interchar Timeout => return FALSE. So we can return sooner from this function. if (((unsigned long) (millis() - prevChar) > chartimeout) && (prevChar != 0)) { - //Serial.println("Interchar timeout"); return false; } } - //Serial.println("End wait cycle"); //If is a CMD, we will finish to read buffer. if(type == CMD) sim900_flush_serial(); return true; } + boolean sim900_check_with_cmd(const char* cmd, const char *resp, DataType type, unsigned int timeout, unsigned int chartimeout) { sim900_send_cmd(cmd); diff --git a/watchdog_3-leonardo.ino b/watchdog_3-leonardo.ino index 4ee336e..4ec2102 100644 --- a/watchdog_3-leonardo.ino +++ b/watchdog_3-leonardo.ino @@ -3,405 +3,166 @@ // EoF 2017 // ---------------------------------------------------------------------------------------------------- -#include "watchdog_3.h" +#include +#include "GPRS_Shield_Arduino.h" + +// Консоль +#define TIMEOUT 60000 +#define CONSOLE_BUFFER_SIZE 64 + +// Сенсоры +#define T_PIN A1 +#define A_PIN A0 + +// GSM-модем +#define MOD_PWR 9 +#define MOD_BR 115200 +#define COM_BR 115200 +#define SMS_LEN 160 +#define PHONE1 "+79123801806" +//#define PHONE2 "79129295702" +//#define PHONE3 "79058201819" + +// Размеры буферов; +#define CMD_SIZE 16 +#define SMS_SIZE 160 +#define PHONE_SIZE 16 +#define DATE_SIZE 24 +#define BUFFER_SIZE 30 + +#define MAX_INDEX 9 + +// Help +#define HELP_MSG "Usage: |status|reset modem|help|sms on|sms off|" GPRS modem(Serial1, MOD_PWR); bool modemOK = false; -byte modemErrCount = 0; -DHT dht(T_PIN, DHT11); +bool smsOn = false; char command[CMD_SIZE]; char message[SMS_SIZE]; char phone[PHONE_SIZE]; char datetime[DATE_SIZE]; -char s_buffer[BUFFER_SIZE]; -char l_buffer[LONG_BUFFER_SIZE]; -bool cmdFromModem = false; +bool warning = false; +bool alarm = false; -unsigned long t = 0; -int addr = 0; +byte counter = 0; -byte temp = 0, hum = 0, loud = 0, power = 0, battery = 0; +byte temp = 0, hum = 0, loud = 0, externalPower = 0, powerOn = 0, onBattery = 0, caseOpen = 0; -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 +// ---------------------------------------------------------------------------------------------------- +// setup +// ---------------------------------------------------------------------------------------------------- -float vcc = 0.0; -float k12, k5, kbat, kout; -float v12, v5, vbat, vout; - -// эту константу (typVbg) необходимо откалибровать индивидуально -const float typVbg = 1.08; // 1.0 -- 1.2 - -void setup() { +void setup() +{ Serial.begin(COM_BR); Serial1.begin(MOD_BR); modem.powerOn(); - modemOK = modem.init(); - - // Конфигурируем пины - pinMode(A_PIN, INPUT); - pinMode(V5_PIN, INPUT); - pinMode(V12_PIN, INPUT); - pinMode(VBAT_PIN, INPUT); - pinMode(VOUT_PIN, INPUT); - - pinMode(LED_PIN, OUTPUT); - pinMode(BTN_PIN, INPUT); - pinMode(FAN_PIN, OUTPUT); - - // Инициализируем климатический сенсор - dht.begin(); - - // Коэффициенты делителей напряжений - k12 = r12_2 / (r12_1 + r12_2); - k5 = r5_2 / (r5_1 + r5_2); - kbat = rbat_2 / (rbat_1 + rbat_2); - kout = rout_2 / (rout_1 + rout_2); - - modem.controlGPIO(1, 0); - modem.controlGPIO(2, 0); - modem.controlGPIO(3, 0); - modem.controlGPIO(4, 0); - sprint("Init"); - printParams(); - sprint_P(str_help); - - initEEPROM(); -} - -void loop() { - - if (millis() - t > PERIOD) { - getStatus(); - t = millis(); - //sprint("Status!"); - } - - checkModem(); - - if (!cmdFromModem) { - readSerial(command, CMD_SIZE); - } - - if (command[0] != '\0') { - sprint(">", false); - sprint(command); - - if (!strcmp_P(command, cmd_status)) { - getStatusMessage(message); - returnAnswer(message); - } else if (!strcmp_P(command, cmd_help)) { - sprint_P(str_help); - sendHelp(); - } else if (!strcmp_P(command, cmd_sms_on)) { - smsOn(true); - returnAnswer(); - } else if (!strcmp_P(command, cmd_sms_off)) { - smsOn(false); - returnAnswer(); - } else if (!strcmp_P(command, cmd_auth_on)) { - authOn(true); - returnAnswer(); - } else if (!strcmp_P(command, cmd_auth_off)) { - authOn(false); - returnAnswer(); - } else if (!strcmp_P(command, cmd_fwd_on)) { - fwdOn(true); - returnAnswer(); - } else if (!strcmp_P(command, cmd_fwd_off)) { - fwdOn(false); - returnAnswer(); - } else if (!strcmp_P(command, cmd_on)) { - mainPowerOn(); - returnAnswer(); - } else if (!strcmp_P(command, cmd_off)) { - mainPowerOff(); - returnAnswer(); - } else if (!strcmp_P(command, cmd_reset)) { - mainReset(); - returnAnswer(); - } else if (!strcmp_P(command, cmd_a)) { - a_PowerBreak(); - returnAnswer(); - } else if (!strcmp_P(command, cmd_b)) { - b_PowerBreak(); - returnAnswer(); - } else if (!strcmp_P(command, cmd_forward)) { - forwardLastSMS(); - } else if (!strcmp_P(command, cmd_modem_reset) && !cmdFromModem) { - modem.reset(); - modem.init(); - returnAnswer(); - } else if (!strcmp_P(command, cmd_modem_console) && !cmdFromModem) { - modemConsole(); - } else if (!strcmp_P(command, cmd_edit_ab) && !cmdFromModem) { - editAddressBook(); - } else if (!strcmp_P(command, cmd_show_ab) && !cmdFromModem) { - printAddressBook(); - } else { - sprint_P(str_help); - sendHelp(); - } - } - - ledOn(); - delay(5); - ledOff(); - - if (buttonPressed()) { - ledOn(); - if (btnCount < BTN_COUNT) btnCount++; + if (modem.init()){ + Serial.println("Modem OK"); + modemOK = true; } else { - ledOff(); - btnCount = 0; - btnTrigger = false; - } - - if (btnCount >= BTN_COUNT && !btnTrigger) { - btnTrigger = true; - if (entryNotEmpty(0)) { - loadPhoneNumber(0, phone); - modem.callUp(phone); - sprint("Out call: ", phone); - while (true) { - ledOn(); - event = modem.getEvent(message, phone, datetime, l_buffer, LONG_BUFFER_SIZE, NO_CHECK); - ledOff(); - delay(150); - - if (event == BUSY || event == NO_CARRIER || event == NO_ANSWER) break; - if (event == ANSWER) t = millis(); - - if (!buttonPressed()) btnTrigger = false; - - if (millis() - t > CALL_TIMEOUT || (buttonPressed() && !btnTrigger)) { - btnTrigger = true; - break; - } - } - modem.hangup(); - sprint("Call over"); - } else { - flash(5); - } + Serial.println("Modem DEAD"); + modemOK = false; } } -// Запрос статуса -word getStatus() { - unsigned int stat = 0; - - // Get sensors - getTH(); - if (temp > 28) stat |= TEMP_WARN; - if (hum > 85) stat |= HUM_WARN; - - loud = analogRead(A_PIN); - if (loud > 250) stat |= LOUD_WARN; - - getVs(); - if (v12 < 10) stat |= POWER_WARN; - if (vbat < 6.4) stat |= BAT_WARN; - - return stat; -} +// ---------------------------------------------------------------------------------------------------- +// loop +// ---------------------------------------------------------------------------------------------------- +void loop() +{ +// counter++; +// if (counter == 20) { +// getStatus(); +// counter == 0; +// } // -void printAll() { - sprint("phone: ", phone); - sprint("date: ", datetime); - sprint("msg: ", message); - sprint("msg len: ", strlen(message)); - sprint("cmd: ", command); +// if (!statusOK()) { +// +// } + readSerial(command, CMD_SIZE); + if (command[0] == '\0') readModem(command, CMD_SIZE); +// command = com; +// } else if (mod[0] != '\0') { //&& (!strcmp(sender, PHONE1))) { // || !strcmp(sender, PHONE2) || !strcmp(sender, PHONE3))) { +// command = s,; +// } else command[0] = '\0'; - sprint("t: ", temp); - sprint("h: ", hum); - sprint("l: ", loud); - - sprint("mdm: ", modemOK, true); - sprint("sms: ", smsOn(), true); - sprint("auth: ", authOn(), true); - sprint("fwd: ", fwdOn(), true); - - sprint("Vcc: ", vcc); - sprint("V12: ", v12); - sprint("V5: ", v5); - sprint("Vbat: ", vbat); - sprint("Vout: ", vout); -} - -// Формируем читабельную строку со статусом -void getStatusMessage(char *message) { - word stat = getStatus(); - char s[10]; - - message[0] = '\0'; - if (stat != 0) { - strcat(message, "WARNING"); - } else { - strcat(message, "OK"); + if (command[0] != '\0') { + Serial.print("Received command: "); + Serial.println(command); } - - strcat(message, "\nT: "); - itoa(temp, s, 10); - strcat(message, s); - strcat(message, "C"); - if (stat & TEMP_WARN) strcat(message, " !"); - - strcat(message, " H: "); - itoa(hum, s, 10); - strcat(message, s); - strcat(message, "%"); - if (stat & HUM_WARN) strcat(message, " !"); - - strcat(message, " L: "); - itoa(loud, s, 10); - strcat(message, s); - strcat(message, "UE"); - if (stat & LOUD_WARN) strcat(message, " !"); - - strcat(message, "\nVcc: "); - ftoa(vcc, s); - 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, s); - strcat(message, "V"); - - strcat(message, "\nVbat: "); - ftoa(vbat, s); - strcat(message, s); - strcat(message, "V"); - strcat(message, " Vout: "); - ftoa(vout, s); - strcat(message, s); - strcat(message, "V"); - - strcat(message, "\n\nPower: "); - if (stat & POWER_WARN) strcat(message, "Off"); - else strcat(message, "On"); - - strcat(message, " Battery: "); - if (stat & BAT_WARN) strcat(message, "Low"); - else strcat(message, "Ok"); - - strcat(message, "\nSMS: "); - if (smsOn()) strcat(message, "On"); - else strcat(message, "Off"); - - strcat(message, " Auth: "); - if (authOn()) strcat(message, "On"); - else strcat(message, "Off"); - - strcat(message, " Fwd: "); - if (fwdOn()) strcat(message, "On"); - else strcat(message, "Off"); -} - -// Обработка событий модема -void checkModem() { - cmdFromModem = false; - command[0] = '\0'; - - switch (modem.getEvent(message, phone, datetime, l_buffer, LONG_BUFFER_SIZE)) { - case ERR: - sprint("Mdm err!"); - modemOK = false; - if (modemErrCount < MAX_ERROR) modemErrCount++; - - if (modemErrCount >= MAX_ERROR) { - sprint("Rst mdm..."); - modem.reset(); - if (modem.init()) { - sprint("Mdm OK"); - modemOK = true; - } - } - return; - - case SMS: - sprint("SMS: ", phone); - flash(3); - - if (authOn() && !authOK(phone)) { - strcpy_P(command, cmd_forward); - } else { - strncpy(command, message, CMD_SIZE); - } - cmdFromModem = true; - break; - - case CALL: - sprint("Call: ", phone); - - if (authOn() && !authOK(phone)) { - modem.hangup(); - sprint("Unauth call"); - } else { - modem.answer(); - t = millis(); - while (!modem.ifcallEnd()) { - ledOn(); - delay(1000); - ledOff(); - - if (millis() - t > CALL_TIMEOUT || buttonPressed()) { - modem.hangup(); - break; - } - } - sprint("Call over"); - } - cmdFromModem = true; - break; - - case NONE: - cmdFromModem = false; - break; + if (!strcmp(command, "stat")) { +// getStatusMessage(statMsg); +// sendSMS(statMsg); +// Serial.println(statMsg); + } else if (!strcmp(command, "help")) { +// sendSMS(HELP_MSG); + Serial.println(HELP_MSG); + } else if (!strcmp(command, "sms on")) { + smsOn = true; + Serial.println("Outgoing SMS enabled"); +// Serial.println("SMS on"); + } else if (!strcmp(command, "sms off")) { + smsOn = false; + Serial.println("Outgoing SMS disabled"); +// Serial.println("SMS off"); + } else if (!strcmp(command, "on")) { + mainPowerOn(); + } else if (!strcmp(command, "off")) { + mainPowerOff(); + } else if (!strcmp(command, "rst")) { + mainReset(); + } else if (!strcmp(command, "a")) { + a_PowerBreak(); + } else if (!strcmp(command, "b")) { + b_PowerBreak(); + } else if (!strcmp(command, "modem on")) { + modem.powerOn(); + } else if (!strcmp(command, "modem off")) { + modem.powerOff(); + } else if (!strcmp(command, "modem reset")) { + modem.reset(); + } else if (!strcmp(command, "modem console")) { + modemConsole(); + } else if (!strcmp(command, "pp")) { + printAddressBookFromEEPROM(); + } else if (!strcmp(command, "edit ab")) { + editAddressBook(); + } else if (!strcmp(command, "show ab")) { + printAddressBookFromEEPROM(); + } else if (!strcmp(command, "clear ab")) { + clearAddressBookFromEEPROM(); } - - modemErrCount = 0; - modemOK = true; + } // Консоль модема void modemConsole() { - sprint_P(str_modem_cons_on); - sprint("Timeout is ", TIMEOUT, false); - sprint(" ms after last command"); + unsigned long t = millis(); + unsigned char buffer[CONSOLE_BUFFER_SIZE]; + int count = 0; - t = millis(); - byte i = 0; + Serial.println("Modem console mode on"); + Serial.print("Timeout is "); + Serial.print(TIMEOUT); + Serial.println(" ms after last command"); + while (millis() - t < TIMEOUT) { if (Serial1.available()) { while(Serial1.available()) { - s_buffer[i++] = Serial1.read(); - if(i == BUFFER_SIZE) break; + buffer[count++] = Serial1.read(); + if(count == CONSOLE_BUFFER_SIZE) break; } - Serial.write(s_buffer, i); - i = 0; + Serial.write(buffer, count); + count = 0; } if (Serial.available()) { @@ -409,16 +170,35 @@ void modemConsole() { t = millis(); } } - sprint_P(str_modem_cons_off); + Serial.println("Modem console mode off"); +} + +// Читаем команды с GSM-модема +void readModem(char* msg, byte size) { + msg[0] = '\0'; + message[0] = '\0'; + + if (!modemOK) return; + + if (modem.getSMS(message, phone, datetime)) { +// Serial.print("Msg: "); +// Serial.println(message); +// Serial.print("Phn: "); +// Serial.println(phone); +// Serial.print("Dtm: "); +// Serial.println(datetime); + for (byte i = 0; i < size; i++) + msg[i] = message[i]; + } } // Читаем команды с COM-порта -void readSerial(char *com, byte com_size) { +void readSerial(char* com, byte size) { com[0] = '\0'; - com[com_size - 1] = '\0'; - - byte i = 0; - while (Serial.available() > 0 && i < com_size - 1) { + com[size] = '\0'; + + byte i = 0; + while (Serial.available() > 0 && i < size - 1) { com[i] = Serial.read(); if (com[i] == '\r') { com[i] = '\0'; @@ -430,56 +210,23 @@ void readSerial(char *com, byte com_size) { } } -// Отправляем ответ -void returnAnswer(const char * answer) { - sprint(answer); - - if (modemOK && smsOn() && cmdFromModem) { - modem.sendSMS(phone, answer); - } -} - -void sendHelp() { - if (modemOK && smsOn() && cmdFromModem) { - if (authOn() && !authOK(phone)) return; - modem.sendSMS(phone, str_help); - } -} - -void forwardLastSMS() { - char main_phone[PHONE_SIZE]; - - sprint("Get SMS from: ", false); - sprint(phone); - sprint("at: ", false); - sprint(datetime); - sprint(message); - - 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); - modem.sendSMS(main_phone, message); - } -} - // Управление подключенным оборудованием void mainPowerOn() { - if (!isPowerOn()) { + if (powerOn != 1) { modem.controlGPIO(1, 1); delay(500); modem.controlGPIO(1, 0); } + // !!! + powerOn = 1; } void mainPowerOff() { modem.controlGPIO(1, 1); - delay(6000); + delay(5000); modem.controlGPIO(1, 0); + // !!! + powerOn = 0; } void mainReset() { @@ -500,378 +247,123 @@ void b_PowerBreak() { modem.controlGPIO(4, 0); } -bool isPowerOn() { - getVs(); - if (v12 > 10) return true; - else return false; +// Адресная книга в EEPROM +void savePhoneNumber (int index, char * phone) { + int addr = index * PHONE_SIZE; + + for (byte i = 0; i < PHONE_SIZE; i++) { + EEPROM[addr + i] = phone[i]; + } } -// Адресная книга -bool savePhoneNumber(byte index, char * phone) { - if (index > AB_MAX_INDEX) return false; +void delPhoneNumber (int index) { + char none[PHONE_SIZE]; + clearBuffer(none, PHONE_SIZE); + + strcpy(none, ""); - addr = AB_ADDR + index * PHONE_SIZE; - - for (byte i = 0; i < PHONE_SIZE; i++) - EEPROM.update(addr + i, phone[i]); - - return true; + savePhoneNumber(index, none); } -bool delPhoneNumber(byte index) { - if (index > AB_MAX_INDEX) return false; - - clearBuffer(phone, PHONE_SIZE); - strcpy(phone, ""); +bool loadPhoneNumber (int index, char * phone) { + int addr = index * PHONE_SIZE; - return savePhoneNumber(index, phone); -} - -bool loadPhoneNumber(byte index, char * phone) { - if (index > AB_MAX_INDEX) return false; - - addr = AB_ADDR + index * PHONE_SIZE; - - for (byte i = 0; i < PHONE_SIZE - 1; i++) - phone[i] = EEPROM.read(addr + i); - phone[PHONE_SIZE - 1] = '\0'; + for (byte i = 0; i < PHONE_SIZE - 1; i++) { + phone[i] = EEPROM[addr + i]; + } + phone[PHONE_SIZE] = '\0'; return true; } -bool entryNotEmpty(byte index) { +void printPhoneFromEEPROM(byte index) { char phone[PHONE_SIZE]; + int addr = index * PHONE_SIZE; - loadPhoneNumber(index, phone); - return strcmp(phone, ""); -} - -void printPhoneNumber(byte index) { - if (index > AB_MAX_INDEX) { - sprint("Max index is: ", AB_MAX_INDEX); + if (index > MAX_INDEX) { + Serial.print("Max index is: "); + Serial.println(MAX_INDEX); return; } loadPhoneNumber(index, phone); - sprint("", index, false); - sprint(": ", false); - sprint(phone); + + Serial.print(index); + Serial.print(": "); + Serial.println(phone); } -void printAddressBook() { - sprint("i Phone"); - for (byte i = 0; i <= AB_MAX_INDEX; i++) - printPhoneNumber(i); +void printAddressBookFromEEPROM() { + Serial.println("i Phone"); + for (byte i = 0; i <= MAX_INDEX; i++) { + printPhoneFromEEPROM(i); + } } -void clearAddressBook() { - for (byte i = 0; i <= AB_MAX_INDEX; i++) +void clearAddressBookFromEEPROM() { + for (byte i = 0; i <= MAX_INDEX; i++) { delPhoneNumber(i); + } } void editAddressBook() { + unsigned long t = millis(); + char buffer[BUFFER_SIZE]; + buffer[0] = '\0'; char *p; - char indexString[4]; - byte index, i = 0; + char indexString[3], phone[PHONE_SIZE]; + int index; + byte i = 0; - sprint_P(str_eab); - sprint_P(str_help_ab); - sprint_P(str_format_ab); - - t = millis(); - while (millis() - t < TIMEOUT) { - readSerial(s_buffer, BUFFER_SIZE); + Serial.println("Edit address book mode"); + Serial.println("format: \"i:+xxxxxxxxxxx\""); + Serial.println("Type \"exit\" to return"); + //Serial.println("Type \"show\" to view, \"clear\" to erase, \"exit\" to return"); - if (s_buffer[0] != '\0') { + while (millis() - t < TIMEOUT) { + readSerial(buffer, BUFFER_SIZE); + if (buffer[0] != '\0') { t = millis(); - if (!strcmp_P(s_buffer, cmd_exit)) { + if (!strcmp(buffer, "exit")) { break; - } else if (!strcmp_P(s_buffer, cmd_show)) { - printAddressBook(); - } else if (!strcmp_P(s_buffer, cmd_clear)) { - clearAddressBook(); } else { - p = strstr(s_buffer, ":"); +// } else if (!strcmp(buffer, "show")) { +// printAddressBookFromEEPROM(); +// } else if (!strcmp(buffer, "clear")) { +// clearAddressBookFromEEPROM(); +// } else { + p = strstr(buffer, ":+"); i = 0; - while(s_buffer[i] != ':' && i < BUFFER_SIZE) i++; + while(buffer[i] != ':' && i < BUFFER_SIZE) i++; - if (p == NULL || i == 0 || i > 1) { - sprint_P(str_format_ab); - } else { + if (p == NULL || i == 0 || i > 2) { + Serial.println("ERR: Unknown format!"); + } + else { // Get index - clearBuffer(indexString, 4); - strncpy(indexString, s_buffer, i); + clearBuffer(indexString, 3); + strncpy(indexString, buffer, i); index = atoi(indexString); // Get phone i = 0; - p = strstr(s_buffer, ":") + 1; + p = strstr(buffer, "+"); strcpy(phone, p); - if (strcmp(phone, "delete")) { - // Save - savePhoneNumber(index, phone); - sprint("OK"); - } else { - // Delete - delPhoneNumber(index); - sprint("OK"); - } + // Save + savePhoneNumber(index, phone); + Serial.print(index); + Serial.print(": "); + Serial.print(phone); + Serial.println(" added"); } } } } - sprint_P(str_help); + Serial.println("Bye!"); } -// Утилиты -void clearBuffer(char *in_buffer, byte in_size) { - for(byte i = 0; i < in_size - 1; i++) in_buffer[i] = '\0'; +void clearBuffer(char * buffer, byte size) { + for(byte i = 0; i < size; i++) buffer[i] = '\0'; } -void printParams() { - if(smsOn()) sprint("SMS on | ", false); else sprint("SMS off | ", false); - if(authOn()) sprint("Auth on | ", false); else sprint("Auth off | ", false); - if(smsOn()) sprint("Fwd on"); else sprint("Fwd off"); -} - -bool authOK(char *phone) { - char t_phone[PHONE_SIZE]; - - for(byte i = 0; i <= AB_MAX_INDEX; i++) { - loadPhoneNumber(i, t_phone); - if (!strcmp(phone, t_phone)) return true; - } - return false; -} - -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) { - Serial.print(description); - Serial.print(data); - if (ln) Serial.println(); -} - -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) { - Serial.print(description); - Serial.print(data); - if (ln) Serial.println(); -} - -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) { - Serial.print(description); - Serial.print(data); - if (ln) Serial.println(); -} - -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) { - Serial.print(description); - if (ln) Serial.println(); -} - -void sprint_P(const char *description, const bool ln) { - int len = strlen_P(description); - char c; - - for (byte i = 0; i < len; i++) { - c = pgm_read_byte_near(description + i); - Serial.print(c); - } - if (ln) Serial.println(); -} - -bool smsOn() { - addr = PARAM_ADDR + SMS_ON_INDEX; - return (bool)EEPROM.read(addr); -} - -void smsOn(bool temp) { - addr = PARAM_ADDR + SMS_ON_INDEX; - EEPROM.update(addr, (byte)temp); -} - -bool authOn() { - addr = PARAM_ADDR + AUTH_ON_INDEX; - return (bool)EEPROM.read(addr); -} - -void authOn(bool temp) { - addr = PARAM_ADDR + AUTH_ON_INDEX; - EEPROM.update(addr, (byte)temp); -} - -bool fwdOn() { - addr = PARAM_ADDR + FWD_ON_INDEX; - return (bool)EEPROM.read(addr); -} - -void fwdOn(bool temp) { - addr = PARAM_ADDR + FWD_ON_INDEX; - EEPROM.update(addr, (byte)temp); -} - -void fanPWM(byte power) { - analogWrite(FAN_PIN, power); -} - -void fanOn() { - digitalWrite(FAN_PIN, HIGH); -} - -void fanOff() { - digitalWrite(FAN_PIN, LOW); -} - -void ledPWM(byte power) { - analogWrite(LED_PIN, power); -} - -void ledOn() { - digitalWrite(LED_PIN, HIGH); -} - -void ledOff() { - digitalWrite(LED_PIN, LOW); -} - -void flash(byte count) { - for (byte i = 0; i < count; i++) { - ledOn(); - delay(5); - ledOff(); - delay(150); - } -} - -bool buttonPressed() { - if (digitalRead(BTN_PIN) == LOW) return true; - - return false; -} - -float readvcc() { - byte i; - float tmp = 0.0; - - // Read 1.1V reference against Avcc - // set the reference to vcc and the measurement to the internal 1.1V reference - #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); - #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) - ADMUX = _BV(MUX5) | _BV(MUX0); - #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) - ADMUX = _BV(MUX3) | _BV(MUX2); - #else - // works on an Arduino 168 or 328 - ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); - #endif - - delay(3); // Wait for Vref to settle - ADCSRA |= _BV(ADSC); // Start conversion - while (bit_is_set(ADCSRA,ADSC)); // measuring - - uint8_t low = ADCL; // must read ADCL first - it then locks ADCH - uint8_t high = ADCH; // unlocks both - - tmp = (high<<8) | low; - tmp = (typVbg * 1023.0) / tmp; - - return tmp; -} - -void getVs() { - v12 = 0.0; - v5 = 0.0; - vbat = 0.0; - vout = 0.0; - - v12 += readvcc() * analogRead(V12_PIN); - v5 += readvcc() * analogRead(V5_PIN); - vbat += readvcc() * analogRead(VBAT_PIN); - vout += readvcc() * analogRead(VOUT_PIN); - - vcc = readvcc(); - v12 = v12 / 1024.0 / k12; - v5 = v5 / 1024.0 / k5; - vbat = vbat / 1024.0 / kbat; - vout = vout / 1024.0 / kout; -} - -void printVs() { - sprint("Vcc: ", vcc); - sprint("V12: ", v12); - sprint("V5: ", v5); - sprint("Vbat: ", vbat); - sprint("Vout: ", vout); -} - -void getTH() { - int check; - - check = dht.read(); - switch (check) { - case DHT_OK: - temp = dht.getTemperatureC(); - hum = dht.getHumidity(); - break; - case DHT_ERROR_TIMEOUT: - temp = 253; - break; - case DHT_ERROR_CHECKSUM: - temp = 254; - break; - } -} - -void ftoa(float f, char *s) { - int d1, d2; - char t[10]; - - s[0] = '\0'; - - d1 = (int)f; - f = f - d1; - f = f * 100; - d2 = (int)f; - - itoa(d1, t, 10); - strcat(s, t); - strcat(s, "."); - itoa(d2, t, 10); - strcat(s, t); -} - -void initEEPROM() { - int flag_addr = PARAM_ADDR + EEPROM_INIT_INDEX; - - if (EEPROM.read(flag_addr) != INIT_FLAG) { - clearAddressBook(); - smsOn(false); - authOn(true); - fwdOn(true); - EEPROM.write(flag_addr, INIT_FLAG); - } -}