Отправка файлов на FTP сервер по GPRS
- Войдите на сайт для отправки комментариев
Втр, 29/12/2015 - 09:01
С наступающим ,господа!
Подскажите решение задачи:
Необходимо отправить фото с Ардукам по GPRS каналу на FTP сервер. Задачу решаю частями - в настоящий момент пишу подпрограмму отправки данных на ФТП. Так вот по команде AT+FTPPUT=1 приходит ответ +FTPPUT:1,77 - собственно ошибка 77 - operate error. Что означает данная ошибка, как быть дальше? В каком направлении двигаться.
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
#include "HWSerial.h"
InetGSM inet;
bool isInetAttach = false;
char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
int8_t answer;
int onModulePin = 2;
char aux_str[50];
char pin[]="";
char apn[]="internet";
char user_name[]="gdata";
char password[]="gdata";
char ftp_server[]="nas.radiushost.net";
char ftp_user_name[]="nservice_ftp1";
char ftp_password[]="bd0jlifjncSUKA1C";
char path[]="www/nsccenter.ru/uploads";
char incoming_data[120];
char file_name[ ]="test.txt";
char test_str[ ]= "0000000011111111222222223333333344444444555555556666666677777777000000001111111122222222333333334444";
int data_size, aux;
void setup(){
Serial.begin(9600);
Serial.println("GSM Shield testing.");
if (gsm.begin(9600)){
Serial.println("\nstatus=READY");
started=true;
}
else Serial.println("\nstatus=IDLE");
if(started){
//GPRS attach, put in order APN, username and password.
//If no needed auth let them blank.
isInetAttach = inet.connectedClient();
if (!isInetAttach)
{
for (int i = 0; i < 15; i++)
{
if (inet.attachGPRS("internet", "gdata", "gdata"))
{
Serial.println("Internet status = ATTACHED");
break;
}
else
{
Serial.println("Internet status = ERROR");
}
}
}
else
{
Serial.println("Already attached");
}
delay(1000);
//sets the PIN code
// snprintf(aux_str, sizeof(aux_str), "AT+CPIN=%s", pin);
// sendATcommand(aux_str, "OK", 2000);
Serial.println("get GPRS connection");
// sets the paremeters for the FTP server
gsm.SimpleWriteln("AT+SAPBR=1,1");
delay(5000);
gsm.SimpleWriteln("AT+SAPBR=2,1");
delay(5000);
gsm.WhileSimpleRead();
configure_FTP();
uploadFTP();
downloadFTP();
}
}
void loop(){
}
void configure_FTP(){
Serial.println("profile 1 for FTP");
// sets the paremeters for the FTP server
gsm.SimpleWriteln("AT+FTPCID=1");
delay(2000);
gsm.WhileSimpleRead();
Serial.println("adress of FTP");
snprintf(aux_str, sizeof(aux_str), "AT+FTPSERV=\"%s\"", ftp_server);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
Serial.println("port of FTP...");
gsm.SimpleWriteln("AT+FTPPORT=21");
delay(2000);
gsm.WhileSimpleRead();
Serial.println("login of FTP...");
snprintf(aux_str, sizeof(aux_str), "AT+FTPUN=\"%s\"", ftp_user_name);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
Serial.println("password of FTP...");
snprintf(aux_str, sizeof(aux_str), "AT+FTPPW=\"%s\"", ftp_password);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
}
void uploadFTP(){
Serial.println("show file name...");
snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTNAME=\"%s\"", file_name);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
Serial.println("show path ...");
snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTPATH=\"%s\"", path);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
//* обхожу все IF
Serial.println("begin ftpput=1 ..."); // октрываю запись в FTP
gsm.SimpleWriteln("AT+FTPPUT=1");
delay(5000);
gsm.WhileSimpleRead();
Serial.println("begin ftpput=2,100 ..."); // отпарвляю 100 байт на фтп
gsm.SimpleWriteln("AT+FTPPUT=2,100");
delay(3000);
gsm.WhileSimpleRead();
gsm.SimpleWriteln(test_str);
delay(3000);
gsm.WhileSimpleRead();
Serial.println("end 100 ");
Serial.println("close ftpput=2,0 ..."); // завершаю запись на фтп
gsm.SimpleWriteln("AT+FTPPUT=2,0");
delay(3000);
gsm.WhileSimpleRead();
}
void downloadFTP(){
Serial.println("downloadFTP file-name...");
snprintf(aux_str, sizeof(aux_str), "AT+FTPGETNAME=\"%s\"", file_name);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
Serial.println("downloadFTP path...");
snprintf(aux_str, sizeof(aux_str), "AT+FTPGETPATH=\"%s\"", path);
gsm.SimpleWriteln(aux_str);
delay(2000);
gsm.WhileSimpleRead();
int x = 0;
Serial.println("GET one...");
gsm.SimpleWriteln("AT+FTPGET=1");
delay(2000);
gsm.WhileSimpleRead();
Serial.println("GET two...");
gsm.SimpleWriteln("AT+FTPGET=2,50");
delay(2000);
gsm.WhileSimpleRead();
}
Что означает данная ошибка, как быть дальше?
Гугл подсказывает, что "77 means "operate error" your server doesn't recognize the name or the path that you use with your file."
Вот здесь : https://www.cooking-hacks.com/forum/viewtopic.php?f=20&t=3809
благодарю!
Еще вопрос, как отправить данные больше чем позволяет модуль за один раз?
Мне не приходилось заниматься ни GPRS, ни FTP, но запрос https://www.google.com.ua/?gws_rd=ssl#q=arduino+gprs+ftp+file+transfer даёт немало интересных ссылок. Запрос на русском, кстати, тоже (но меньше).
магия )
Это читал?
https://www.cooking-hacks.com/documentation/tutorials/gprs-gsm-quadband-module-arduino-raspberry-pi-tutorial-sim-900#step6
Тут вот пишут что можно и больше 1300 http://www.edaboard.com/thread277914.html
Именно это читал. ГСМ шилд установлен на Мегу, в библиотеке исправлен RX TX на 10, 11. Что не получилось- адаптировать настройки под представленный по ссылке код. Получилось только вырезать часть кода и отправить не более 1300 байт.
http://brne.narod.ru/ftp-sim900.htm
Отправляй в цикле кусочками - по килобайту например
Подскажешь как этот цикл задать?
пиши что и как ты пытаешься отправить (код)
Конечным результатом должен быть передан файл xxx.jpg на сервер.
#include <UTFT_SPI.h> #include <SD.h> #include <Wire.h> #include <ArduCAM.h> #include <SPI.h> #include "memorysaver.h" #if defined(__arm__) #include <itoa.h> #endif #define SD_CS 4 #define BTN 5 // set pin 10 as the slave select for SPI: const int SPI_CS = 10; ArduCAM myCAM(OV2640,SPI_CS); UTFT myGLCD(SPI_CS); boolean isShowFlag = true; void setup() { pinMode(BTN, INPUT); uint8_t vid,pid; uint8_t temp; #if defined (__AVR__) Wire.begin(); #endif #if defined(__arm__) Wire1.begin(); #endif Serial.begin(115200); Serial.println("ArduCAM Start!"); // set the SPI_CS as an output: pinMode(SPI_CS, OUTPUT); // initialize SPI: SPI.begin(); //Check if the ArduCAM SPI bus is OK myCAM.write_reg(ARDUCHIP_TEST1, 0x55); temp = myCAM.read_reg(ARDUCHIP_TEST1); if(temp != 0x55) { Serial.println("SPI interface Error!"); while(1); } //Change MCU mode myCAM.write_reg(ARDUCHIP_MODE, 0x00); myGLCD.InitLCD(); //Check if the camera module type is OV2640 myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid); myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid); if((vid != 0x26) || (pid != 0x42)) Serial.println("Can't find OV2640 module!"); else Serial.println("OV2640 detected"); //Change to BMP capture mode and initialize the OV2640 module myCAM.set_format(BMP); myCAM.InitCAM(); //Initialize SD Card if (!SD.begin(SD_CS)) { //while (1); //If failed, stop here Serial.println("SD Card Error"); } else Serial.println("SD Card detected!"); } void loop() { bool btnBool = digitalRead(BTN); if(btnBool){ Serial.println("BTN TRUE"); }else{ Serial.println("BTN FALSE"); } char str[8]; File outFile; byte buf[256]; static int i = 0; static int k = 0; static int n = 0; uint8_t temp,temp_last; uint8_t start_capture = 0; int total_time = 0; //Wait trigger from shutter button //if(myCAM.read_reg(ARDUCHIP_TRIG) & SHUTTER_MASK) if(btnBool) { isShowFlag = false; Serial.println("write reg"); myCAM.write_reg(ARDUCHIP_MODE, 0x00); Serial.println("set format"); myCAM.set_format(JPEG); Serial.println("Init cam"); myCAM.InitCAM(); Serial.println("Set size 1600*1200"); myCAM.OV2640_set_JPEG_size(OV2640_1600x1200); //myCAM.OV2640_set_JPEG_size(OV2640_1600x1200); //Wait until buttom released //while(myCAM.read_reg(ARDUCHIP_TRIG) & SHUTTER_MASK); Serial.println("Delay"); delay(1000); Serial.println("Start Capture = 1"); start_capture = 1; } else { if(isShowFlag ) { temp = myCAM.read_reg(ARDUCHIP_TRIG); if(!(temp & VSYNC_MASK)) //New Frame is coming { myCAM.write_reg(ARDUCHIP_MODE, 0x00); //Switch to MCU myGLCD.resetXY(); myCAM.write_reg(ARDUCHIP_MODE, 0x01); //Switch to CAM while(!(myCAM.read_reg(ARDUCHIP_TRIG)&0x01)); //Wait for VSYNC is gone } } } if(start_capture) { //Flush the FIFO Serial.println("flush fifo"); myCAM.flush_fifo(); //Clear the capture done flag Serial.println("clear fifo flag"); myCAM.clear_fifo_flag(); //Start capture Serial.println("Start Capture"); myCAM.start_capture(); } if(myCAM.read_reg(ARDUCHIP_TRIG) & CAP_DONE_MASK) { Serial.println("Capture Done!"); //Construct a file name k = k + 1; itoa(k, str, 10); strcat(str,".jpg"); //Open the new file outFile = SD.open(str,O_WRITE | O_CREAT | O_TRUNC); if (!outFile) { Serial.println("open file failed"); return; } total_time = millis(); i = 0; temp = myCAM.read_fifo(); //Write first image data to buffer buf[i++] = temp; //Read JPEG data from FIFO while( (temp != 0xD9) | (temp_last != 0xFF) ) { temp_last = temp; temp = myCAM.read_fifo(); //Write image data to buffer if not full if(i < 256) buf[i++] = temp; else { //Write 256 bytes image data to file outFile.write(buf,256); i = 0; buf[i++] = temp; } } //Write the remain bytes in the buffer if(i > 0) outFile.write(buf,i); //Close the file outFile.close(); total_time = millis() - total_time; Serial.print("Total time used:"); Serial.print(total_time, DEC); Serial.println(" millisecond"); //Clear the capture done flag myCAM.clear_fifo_flag(); //Clear the start capture flag start_capture = 0; myCAM.set_format(BMP); myCAM.InitCAM(); isShowFlag = true; } }Вот тот жипег хочу отправить на FTP сервер
#include "SIM900.h" #include <SoftwareSerial.h> #include "inetGSM.h" #include "HWSerial.h" InetGSM inet; bool isInetAttach = false; char msg[50]; int numdata; char inSerial[50]; int i=0; boolean started=false; int8_t answer; int onModulePin = 2; char aux_str[50]; char pin[]=""; char apn[]="internet"; char user_name[]="gdata"; char password[]="gdata"; char ftp_server[]="nas.radiushost.net"; char ftp_user_name[]="nservice_ftp1"; char ftp_password[]="bd0jlifjncSUKA1C"; char path[]="/"; char incoming_data[120]; char file_name[ ]="test.txt"; char test_str[ ]= "here can be layed you are photo from arducam"; int data_size, aux; void setup(){ Serial.begin(9600); Serial.println("GSM Shield testing."); if (gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; } else Serial.println("\nstatus=IDLE"); if(started){ //GPRS attach, put in order APN, username and password. //If no needed auth let them blank. isInetAttach = inet.connectedClient(); if (!isInetAttach) { for (int i = 0; i < 15; i++) { if (inet.attachGPRS("internet", "gdata", "gdata")) { Serial.println("Internet status = ATTACHED"); break; } else { Serial.println("Internet status = ERROR"); } } } else { Serial.println("Already attached"); } delay(1000); //sets the PIN code // snprintf(aux_str, sizeof(aux_str), "AT+CPIN=%s", pin); // sendATcommand(aux_str, "OK", 2000); Serial.println("get GPRS connection"); // sets the paremeters for the FTP server gsm.SimpleWriteln("AT+SAPBR=1,1"); delay(5000); gsm.SimpleWriteln("AT+SAPBR=2,1"); delay(5000); gsm.WhileSimpleRead(); configure_FTP(); uploadFTP(); // downloadFTP(); } } void loop(){ serialhwread(); serialswread(); } void configure_FTP(){ Serial.println("profile 1 for FTP"); // sets the paremeters for the FTP server gsm.SimpleWriteln("AT+FTPCID=1"); delay(2000); gsm.WhileSimpleRead(); Serial.println("adress of FTP"); snprintf(aux_str, sizeof(aux_str), "AT+FTPSERV=\"%s\"", ftp_server); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("port of FTP..."); gsm.SimpleWriteln("AT+FTPPORT=21"); delay(2000); gsm.WhileSimpleRead(); Serial.println("login of FTP..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPUN=\"%s\"", ftp_user_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("password of FTP..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPW=\"%s\"", ftp_password); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); } void uploadFTP(){ Serial.println("show file name..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTNAME=\"%s\"", file_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("show path ..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTPATH=\"%s\"", path); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); //* обхожу все IF Serial.println("begin ftpput=1 ..."); // октрываю запись в FTP gsm.SimpleWriteln("AT+FTPPUT=1"); delay(20000); gsm.WhileSimpleRead(); Serial.println("begin ftpput=2,44 ..."); // отпарвляю 100 байт на фтп gsm.SimpleWriteln("AT+FTPPUT=2,44"); delay(3000); gsm.WhileSimpleRead(); gsm.SimpleWriteln(test_str); delay(30000); gsm.WhileSimpleRead(); Serial.println("end 100 "); Serial.println("close ftpput=2,0 ..."); // завершаю запись на фтп gsm.SimpleWriteln("AT+FTPPUT=2,0"); delay(3000); gsm.WhileSimpleRead(); } void serialhwread(){ i=0; if (Serial.available() > 0){ while (Serial.available() > 0) { inSerial[i]=(Serial.read()); delay(10); i++; } inSerial[i]='\0'; if(!strcmp(inSerial,"/END")){ Serial.println("_"); inSerial[0]=0x1a; inSerial[1]='\0'; gsm.SimpleWriteln(inSerial); } //Send a saved AT command using serial port. if(!strcmp(inSerial,"TEST")){ Serial.println("SIGNAL QUALITY"); gsm.SimpleWriteln("AT+CSQ"); } //Read last message saved. if(!strcmp(inSerial,"MSG")){ Serial.println(msg); } else{ Serial.println(inSerial); gsm.SimpleWriteln(inSerial); } inSerial[0]='\0'; } } void serialswread(){ gsm.SimpleRead(); }/*У тебя есть уже buf длинной 256 байт делишь длину файла на 1024 и получаешь целое число Кбайтов, каждый из которых отправляешь этим кодом, или подобным //Serial.println("begin ftpput=2,44 ..."); // отпарвляю 100 байт на фтп*/ gsm.SimpleWriteln("AT+FTPPUT=2,1024"); delay(3000);//это корректировать или конструировать обработчик ситуаций gsm.WhileSimpleRead(); for (k=0; k <= 3; ++k) { //вычитываешь 256 байт // например for (i=0;i<=255; ++i) buf[i] = outFile.read(); //и передаёшь модулю gsm.SimpleWrite(buf); } delay(30000); //это корректировать или конструировать обработчик ситуаций gsm.WhileSimpleRead(); Serial.println("end 1024 "); //и так далее пока не закончатся целые Кбайты в файле, а дальше посчитаешь и отправишь всё остальноена всякий случай доп. материал
http://arduino.ru/forum/programmirovanie/ne-smog-naiti-opisaniemanual-po-biblioteke-sd-pomogite#comment-12204
И так, благодаря помощи вашей и друзей код встроил в программу, теперь выдает ошибку - при преобразовани данных
с камеры получает в байтах а отправлять в чарах, подскажите как быть, чтобы файл с фото отправить по ФТП. Ошибка в строке 489
//* -= Не совместим с датчиками времени //* -= Инверсия датчика наличия напряжения - без подтягивающего резистора //* -= Изменения в алгоритме линеек - с данной программы по 1 линейке на каждую полку //* -= Радиомодуль слушает радиоканал всегда //* #include <UTFT_SPI.h> #include <SD.h> #include <ArduCAM.h> #include "memorysaver.h" #if defined(__arm__) #include <itoa.h> #endif #include "HWSerial.h" #include <SoftwareSerial.h> // подключение библиотеки программного серийного порта #include <TinyGPS.h> // подключение библиотеки ГПС #include "RTClib.h" // библиотека часов реального времени #include "inetGSM.h" // гсм библиотека #include "SIM900.h" // гпрс библиотека #include <Wire.h> #include <SPI.h> // библиотеки для подключения радиомодуля #include "nRF24L01.h" #include "RF24.h" #include <OneWire.h> #include <DallasTemperature.h> // библиотеки датчика температуры #define ONE_WIRE_BUS 2 // подключение датчика ко 2 пин ардуино #define TEMPERATURE_PRECISION 9 // точность 9 бит #define MOV 27 // порт входа под датчик движения #define RELE 42 // порт реле подачи наруги на линейки #define GERCON 26 // порт входа считывания наличия откр ывания дверей #define LED 13 // выход под светодиод считающий проходки #define POWER_PORT 32 // порт входа считывания наличия напряжения #define UGOL_PORT1 38 // порт входа для считывания опрокидывания #define UGOL_PORT2 39 // порт входа для считывания опрокидывания #define SD_CS 4 #define BTN 5 using namespace std; //LiquidCrystal_I2C lcd(0x27,16,2); OneWire oneWire(ONE_WIRE_BUS); // создаю объект DallasTemperature sensors(&oneWire); // связываю с объектом oneWire датчик далласа RF24 radio(53, 48); // CE и CSN подключение пинов RTC_DS1307 rtc; // Подключение объекта часов. const int ID_CONTROLLER = 2; // id контроллера const int SERIAL_NUMBER = 3500; // версия программы //const char VERSION_PO[] = "3500"; const char IMEI[16] = "86677210021053"; //const unsigned char OSS = 0; // Oversampling Setting int radioData[4]; int numberSatellites = 0; char realDateNow[11]; char realTimeNow[6]; char power[5]; char formattedTimeHMS[16]; char latitude[10]; char longitude[10]; int temperatureToServer; int firstFridgeLine = 0; int secondFridgeLine = 0; int thirdFridgeLine = 0; int fourthFridgeLine = 0; unsigned int minutes; unsigned int seconds; unsigned int hour; long time_ms; int day; //*Pak int numBegin[16] = {0, 93, 96, 103, 110, 121, 134, 146, 166, 181, 221, 266, 341, 501, 801, 1024}; int percentBase[15] = {0, 5, 15, 25, 35, 50, 50, 70, 80, 80, 90, 90, 90, 100, 100}; bool isInetAttach = false; //* /////////////////////////////////////////////// для GPRS SHIELD/////// InetGSM inet; char inSerial[50]; int i = 0; boolean started = false; const char UNDERLINE[] = "_" ; int OPROKID = 0; // переменная запоминающая наличие опрокидывания int fpro = 0; // ввожу перекидной флаг для подсчета проходок int peopleCount = 0; // переменная для подсчета кол-ва проходок TinyGPS gps; // привязка имени gps к библиотеке int f1 = 0; // флаг открывания int countDoorOpens = 0; // счетчик открываний двери const char DOOR_CLOSED [] = " door is closed "; const char DOOR_OPEN [] = " door is open "; //const char txt [] = "number of opening is = "; //int FLAG_POWER1 = 0; // задаю флаг пропадания напряжение //int FLAG_POWER2 = 0; const char POWER_ON [] = "POWER_ON"; const char POWER_OFF [] = "POWER_OFF"; const char POWER_RESET [] = "POWER_RESET"; unsigned char buffer[64]; // buffer array for data recieve over serial port int bufferIndex = 0; // counter for buffer array char rFidMark [13]; char key [14] = " 1D0011316A57"; //float massiv_na_peredachu [15]; // задаю массив данных под передачу через GPRS модуль //Переменные для ftp char msg[50]; int numdata; int8_t answer; int onModulePin = 2; char aux_str[50]; char pin[]=""; char apn[]="internet"; char user_name[]="gdata"; char password[]="gdata"; char ftp_server[]="nas.radiushost.net"; char ftp_user_name[]="nservice_ftp1"; char ftp_password[]="bd0jlifjncSUKA1C"; char path[]="/"; char file_name[ ]="test.txt"; char test_str[ ]= "here can be layed your photo from arducam"; //переменные для камеры const int SPI_CS = 10; ArduCAM myCAM(OV2640,SPI_CS); UTFT myGLCD(SPI_CS); boolean isShowFlag = true; ///////////////////////////Начальные данные для подсчета продукции////////////////////////////////////// //long time_ot_nachala = 0; //long previousMillis = 0; //long previousMillis_imp = 0; // идинтификатор передачи "труба" const uint64_t pipeId = 0xF0F1F2F3F4FLL; //прототипы подпрограмм void setupRadio(); void printCountBottlesInfo(); void countBottles(); void printTime(); void countTime(); bool isTilting(); void readVoltage(); void printVoltageData(); void gpsModule(); void readMoveSensor(); void callRFidLabel(); void realTimeClock(); void ifDoorWasOpen(); void printRadioDataInfo(); void sendDataToServerByGet(); void countDoorOpen(); int getTemperatureFromDallas(); void printTemperaturesInfo(int temperature); void getPhoto(); void connectToFtpServer(); void sendDataToFtpServer(); static void smartDelay(unsigned long ms); static void printFloat(float val, float invalid, int len, int prec); static void printInt(unsigned long val, unsigned long invalid, int len); void clearBufferArray(); int countProductPercents(float volt); void floatToInt(float num, int &lat, int &lon); ////Тело программы - установочные значения void setup() { setupRadio(); setupFtp(); setupCamera(); pinMode (RELE, OUTPUT); digitalWrite(RELE, LOW); Serial.begin(9600); // запуск аппаратного последовательного порта delay(2); sensors.begin(); // запуск температурного датчика gsm.begin(9600); delay(500); Wire.begin(); /* rtc.begin(); if (! rtc.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: // rtc.adjust(DateTime(2015, 9, 21, 9, 52, 0)); } */ Serial3.begin(9600); Serial2.begin(9600); // pinMode(RESET_PORT, OUTPUT); // digitalWrite(RESET_PORT,LOW); pinMode (GERCON, INPUT); digitalWrite (GERCON, HIGH); pinMode (LED, OUTPUT); pinMode (MOV, INPUT); digitalWrite (MOV, LOW); pinMode (POWER_PORT, INPUT); digitalWrite (POWER_PORT, HIGH); pinMode (UGOL_PORT1, INPUT); pinMode (UGOL_PORT2, INPUT); Serial.println("Serial number = \n"); // отображение серийного номера метки Serial.println (DOOR_CLOSED); // записываю ДВЕРЬ ЗАКРЫТА delay(100); Serial.println (POWER_ON); // записываю в порт Напряжение присутствует long currentMillis = millis(); // переменные для определения времени с момента начала программмы long currentMillis_imp = millis(); //Serial.println(bufmei); Serial.println("Sats HDOP Latitude Longitude Date Time Alt Course Speed"); Serial.println("------------------------------------------------------------------------"); } void loop() { //подсчет количества бутылок countBottles(); //подсчет времени с начала работы countTime(); //Программа чтения состояния напряжеия 220В readVoltage(); //программа GPS модуля gpsModule(); //чтение датчика движения readMoveSensor(); //вызываю программу р фид метки callRFidLabel(); //Программма работы часов реального времени //realTimeClock(); /////////////////////////////////////////////// программа работы термодатчика Dallas int temperature = getTemperatureFromDallas(); temperatureToServer = temperature * 100; printTemperaturesInfo(temperature); //программа подсчета открывания дверей countDoorOpen(); createAndSendPictureByFtp(); //Отправка данных на ftp-сервер //sendDataToFtpServer(); } //начало подпрограмм void createAndSendPictureByFtp(){ bool btnBool = digitalRead(BTN); if(btnBool) { Serial.println("BTN TRUE"); } else { Serial.println("BTN FALSE"); } char str[8]; File outFile; byte buf[256]; static int i = 0; static int k = 0; static int n = 0; uint8_t temp,temp_last; uint8_t start_capture = 0; int total_time = 0; //Wait trigger from shutter button //if(myCAM.read_reg(ARDUCHIP_TRIG) & SHUTTER_MASK) if(btnBool) { isShowFlag = false; Serial.println("write reg"); myCAM.write_reg(ARDUCHIP_MODE, 0x00); Serial.println("set format"); myCAM.set_format(JPEG); Serial.println("Init cam"); myCAM.InitCAM(); Serial.println("Set size 1600*1200"); myCAM.OV2640_set_JPEG_size(OV2640_1600x1200); //myCAM.OV2640_set_JPEG_size(OV2640_1600x1200); //Wait until buttom released //while(myCAM.read_reg(ARDUCHIP_TRIG) & SHUTTER_MASK); Serial.println("Delay"); delay(1000); Serial.println("Start Capture = 1"); start_capture = 1; } else { if(isShowFlag ) { temp = myCAM.read_reg(ARDUCHIP_TRIG); if(!(temp & VSYNC_MASK)) //New Frame is coming { myCAM.write_reg(ARDUCHIP_MODE, 0x00); //Switch to MCU myGLCD.resetXY(); myCAM.write_reg(ARDUCHIP_MODE, 0x01); //Switch to CAM while(!(myCAM.read_reg(ARDUCHIP_TRIG)&0x01)); //Wait for VSYNC is gone } } } if(start_capture) { //Flush the FIFO Serial.println("flush fifo"); myCAM.flush_fifo(); //Clear the capture done flag Serial.println("clear fifo flag"); myCAM.clear_fifo_flag(); //Start capture Serial.println("Start Capture"); myCAM.start_capture(); } if(myCAM.read_reg(ARDUCHIP_TRIG) & CAP_DONE_MASK) { Serial.println("Capture Done!"); //Construct a file name k = k + 1; itoa(k, str, 10); strcat(str,".jpg"); //Open the new file outFile = SD.open(str,O_WRITE | O_CREAT | O_TRUNC); if (!outFile) { Serial.println("open file failed"); return; } total_time = millis(); i = 0; temp = myCAM.read_fifo(); //Write first image data to buffer buf[i++] = temp; //Read JPEG data from FIFO while( (temp != 0xD9) | (temp_last != 0xFF) ) { temp_last = temp; temp = myCAM.read_fifo(); //Write image data to buffer if not full if(i < 256){ buf[i++] = temp; }else{ //Write 256 bytes image data to file outFile.write(buf,256); i = 0; buf[i++] = temp; } } //Write the remain bytes in the buffer if(i > 0){ uploadFtp(buf); } //Close the file outFile.close(); total_time = millis() - total_time; Serial.print("Total time used:"); Serial.print(total_time, DEC); Serial.println(" millisecond"); //Clear the capture done flag myCAM.clear_fifo_flag(); //Clear the start capture flag start_capture = 0; myCAM.set_format(BMP); myCAM.InitCAM(); isShowFlag = true; } } void configureFtp(){ Serial.println("profile 1 for FTP"); // sets the paremeters for the FTP server gsm.SimpleWriteln("AT+FTPCID=1"); delay(2000); gsm.WhileSimpleRead(); Serial.println("adress of FTP"); snprintf(aux_str, sizeof(aux_str), "AT+FTPSERV=\"%s\"", ftp_server); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("port of FTP..."); gsm.SimpleWriteln("AT+FTPPORT=21"); delay(2000); gsm.WhileSimpleRead(); Serial.println("login of FTP..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPUN=\"%s\"", ftp_user_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("password of FTP..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPW=\"%s\"", ftp_password); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); } void uploadFtp(byte* data){ Serial.println("show file name..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTNAME=\"%s\"", file_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("show path ..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTPATH=\"%s\"", path); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); //* обхожу все IF Serial.println("begin ftpput=1 ..."); // октрываю запись в FTP gsm.SimpleWriteln("AT+FTPPUT=1"); delay(20000); gsm.WhileSimpleRead(); Serial.println("begin ftpput=2,44 ..."); // отпарвляю 100 байт на фтп gsm.SimpleWriteln("AT+FTPPUT=2,44"); delay(3000); gsm.WhileSimpleRead(); snprintf(data, sizeof(data), %b, data); gsm.SimpleWriteln(data); delay(30000); gsm.WhileSimpleRead(); Serial.println("end 100 "); Serial.println("close ftpput=2,0 ..."); // завершаю запись на фтп gsm.SimpleWriteln("AT+FTPPUT=2,0"); delay(3000); gsm.WhileSimpleRead(); } void setupCamera(){ pinMode(BTN, INPUT); uint8_t vid,pid; uint8_t temp; #if defined (__AVR__) Wire.begin(); #endif #if defined(__arm__) Wire1.begin(); #endif Serial.begin(115200); Serial.println("ArduCAM Start!"); // set the SPI_CS as an output: pinMode(SPI_CS, OUTPUT); // initialize SPI: SPI.begin(); //Check if the ArduCAM SPI bus is OK myCAM.write_reg(ARDUCHIP_TEST1, 0x55); temp = myCAM.read_reg(ARDUCHIP_TEST1); if(temp != 0x55) { Serial.println("SPI interface Error!"); while(1); } //Change MCU mode myCAM.write_reg(ARDUCHIP_MODE, 0x00); myGLCD.InitLCD(); //Check if the camera module type is OV2640 myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid); myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid); if((vid != 0x26) || (pid != 0x42)){ Serial.println("Can't find OV2640 module!"); } else{ Serial.println("OV2640 detected"); } //Change to BMP capture mode and initialize the OV2640 module myCAM.set_format(BMP); myCAM.InitCAM(); //Initialize SD Card if (!SD.begin(SD_CS)){ //while (1); //If failed, stop here Serial.println("SD Card Error"); }else{ Serial.println("SD Card detected!"); } } void setupFtp(){ Serial.begin(9600); Serial.println("GSM Shield testing."); if (gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; } else { Serial.println("\nstatus=IDLE"); } if(started){ //GPRS attach, put in order APN, username and password. //If no needed auth let them blank. connectToServer(); delay(1000); //sets the PIN code // snprintf(aux_str, sizeof(aux_str), "AT+CPIN=%s", pin); // sendATcommand(aux_str, "OK", 2000); Serial.println("get GPRS connection"); // sets the paremeters for the FTP server gsm.SimpleWriteln("AT+SAPBR=1,1"); delay(5000); gsm.SimpleWriteln("AT+SAPBR=2,1"); delay(5000); gsm.WhileSimpleRead(); configureFtp(); } } void setupRadio(){ radio.begin(); // запуск радиомодуля // выбираю канал для радио 0-127 radio.setChannel(10); // скорость RF24_250KBPS, RF24_1MBPS или RF24_2MBPS //RF24_250MBPS на nRF24L01 без + не работает // меньше скорость. выше чувствительность приемника radio.setDataRate(RF24_1MBPS); // мощность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm radio.setPALevel(RF24_PA_HIGH); // открываем первую трубу на чтение radio.openReadingPipe(1, pipeId); radio.startListening(); //включаем приемник, начинаем слушать трубу } void printCountBottlesInfo(){ Serial.println(); Serial.println(firstFridgeLine); Serial.println(secondFridgeLine); Serial.println(thirdFridgeLine); Serial.println(fourthFridgeLine); Serial.println(); } void countBottles(){ if (radio.available()) // если в приемнике есть данные - { radio.read(&radioData, sizeof(radioData)); firstFridgeLine = countProductPercents(radioData[1]); secondFridgeLine = countProductPercents(radioData[0]); thirdFridgeLine = countProductPercents(radioData[2]); fourthFridgeLine = countProductPercents(radioData[3]); printCountBottlesInfo(); } } void printTime(){ Serial.print(minutes); Serial.print(":"); Serial.println(seconds); } void countTime(){ unsigned int minBuf; unsigned int secBuf; time_ms = millis(); secBuf = time_ms / 1000; minBuf = secBuf / 60; hour = secBuf / 3600; day = hour / 24; seconds = secBuf; if (secBuf > 60) { seconds = secBuf % 60; } else { seconds = secBuf; } minutes = minBuf; if (minBuf > 60) { minutes = minBuf % 60; } else { minutes = minBuf; } sprintf(formattedTimeHMS, "%d:%d:%d", hour, minutes, seconds); printTime(); } //Программа распознавания опрокидывания bool isTilting(){ bool result = false; if (digitalRead (UGOL_PORT1) || digitalRead (UGOL_PORT2)==LOW) { result = true; Serial.println(UNDERLINE); } return result; } void readVoltage(){ int port = digitalRead (POWER_PORT); if ( port == LOW) { for (int k = 0; k <= 9; k++) { power[k] = POWER_ON[k]; } } else { for (int k = 0; k <= 9; k++) { power[k] = POWER_OFF[k]; } } } void printVoltageData(){ Serial.print("FLAT= "); Serial.println(latitude); Serial.print("FLON= "); Serial.println(longitude); Serial.print("SAT= "); Serial.println(numberSatellites); Serial.println(); } void gpsModule(){ float flat, flon; unsigned long age, date, time; gps.f_get_position(&flat, &flon, &age); printFloat(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6); //Широта printFloat(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6); //Долгота if (flat == TinyGPS::GPS_INVALID_F_ANGLE) { memcpy(latitude, "None", 5); memcpy(longitude, "None", 5); } else { int tmpInt; int tmpFloat; floatToInt(flat, tmpInt, tmpFloat); sprintf(latitude, "%d.%d", tmpInt, tmpFloat); floatToInt(flon, tmpInt, tmpFloat); sprintf(longitude, "%d.%d", tmpInt, tmpFloat); } if (gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES) { numberSatellites = 0; } else { numberSatellites = gps.satellites(); } printVoltageData(); smartDelay(1000); } void readMoveSensor(){ digitalRead (MOV); // считываю датчик движения int x = digitalRead (MOV); // при наличии сигнала движения if (x == HIGH) { digitalWrite (LED, HIGH); // зажигаю светодиод if (fpro == 0) { peopleCount += 1; // добавляю 1 к счетчику char mow_people [] = " value of peopleCount "; // пишу "количество человек прошедших" Serial.println (); Serial.println (mow_people); // вывод в порт "количества проходов людей" Serial.print (peopleCount); // количество людей Serial.println (); fpro = 1; } } else { digitalWrite (LED, LOW); fpro = 0; } } void callRFidLabel(){ if (Serial2.available()) { //Если в RDM6300 есть данные - переписываем их в массив while (Serial2.available()) { //Чтение данных из RDM6300 buffer[bufferIndex++] = Serial2.read(); //Запись данных в переменную массива if (bufferIndex == 64) break; //Если считали первые 64 бита - обрываем чтение } for ( int i = 0; i <= 13; i++) // записываю в массив р фид метку { rFidMark[i] = buffer[i]; } Serial.print (rFidMark); clearBufferArray(); bufferIndex = 0;//Обнуление переменной массива Serial.println();//Перевод строки перед записью нового значения } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook { Serial2.write(Serial.read()); // write it to the Serial2 shield } delay(100); } /* void realTimeClock(){ DateTime now = rtc.now(); int year = 0; int month = 0; int day = 0; Serial.print("SAT1= "); Serial.println(numberSatellites); sprintf(realDateNow, "%d/%d/%d", day, month, year); Serial.print("SAT1= "); Serial.println(numberSatellites); int hour = now.hour(); int minute = now.minutes(); sprintf(realTimeNow, "%d:%d", hour, minute); } */ void ifDoorWasOpen(){ digitalWrite(RELE, HIGH); // зажигаю линейки светодиодов if (f1 == 0) // если дверь была открыта { countDoorOpens += 1; // переменная счетчик открывания дверей Serial.print (DOOR_OPEN); Serial.println (countDoorOpens); f1 = 1; } } void printRadioDataInfo(){ for (int j=0; j<4; j++) { Serial.println(radioData[j]); } } void resetRFidMark(){ for ( int i = 0; i <= 13; i++) { rFidMark[i] = 0; } } void connectToServer(){ isInetAttach = inet.connectedClient(); if (!isInetAttach) { for (int i = 0; i < 15; i++) { if (inet.attachGPRS("internet", "gdata", "gdata")) { Serial.println("Internet status = ATTACHED"); break; } else { Serial.println("Internet status = ERROR"); } } } else { Serial.println("Already attached"); } } void sendDataToServerByGet(){ connectToServer(); int numdata; char msg[50]; char query[250]; sprintf(query, "/process.php?CID=%d&IM=%s&SN=%d&GA=%s&GL=%s&SA=%d&DA=%s&TI=%s&TE=%d&CA=%s&AC=%s&QO=%d&QP=%d&RF=%s&P1=%d&P2=%d&P3=%d&P4=%d&TB=%s&submit=Submit", ID_CONTROLLER, IMEI, SERIAL_NUMBER, latitude, longitude, numberSatellites, realDateNow, realTimeNow, temperatureToServer, UNDERLINE, power, countDoorOpens, peopleCount, rFidMark, firstFridgeLine, secondFridgeLine, thirdFridgeLine, fourthFridgeLine, formattedTimeHMS); numdata = inet.httpGET("nsccenter.ru", 80, query, msg, 50); Serial.println (query); digitalWrite(RELE, LOW); resetRFidMark(); } void countDoorOpen(){ int k = digitalRead (GERCON); // проверяю геркон if ( k == LOW) // если дверь открыта { ifDoorWasOpen(); } else { if (f1 == 1) // если дверь открывалась и потом была закрыта { Serial.println (DOOR_CLOSED); //расчет количества бутылок countBottles(); printRadioDataInfo(); //Отправка данных на сервер sendDataToServerByGet(); } f1 = 0; } } int getTemperatureFromDallas(){ sensors.requestTemperatures(); // Send the command to get temperatures return sensors.getTempCByIndex(0); } void printTemperaturesInfo(int temperature){ Serial.print("Temperature: "); Serial.print(temperature); //display 2 decimal places Serial.println("deg C"); Serial.println("TIME"); Serial.println(realTimeNow); Serial.println("DATE"); Serial.println(realDateNow); Serial.println();//line break } void getPhoto(){ } // void connectToFtpServer(){ // } // void sendDataToFtpServer(){ // У тебя есть уже buf длинной 256 байт // делишь длину файла на 1024 и получаешь целое число Кбайтов, // каждый из которых отправляешь этим кодом, или подобным // //Serial.println("begin ftpput=2,44 ..."); // отпарвляю 100 байт на фтп // gsm.SimpleWriteln("AT+FTPPUT=2,1024"); // delay(3000);//это корректировать или конструировать обработчик ситуаций // gsm.WhileSimpleRead(); // for (k=0; k <= 3; ++k) { // //вычитываешь 256 байт // // например // for (i=0;i<=255; ++i) { // buf[i] = outFile.read() // } // //и передаёшь модулю // gsm.SimpleWrite(buf); // } // delay(30000); //это корректировать или конструировать обработчик ситуаций // gsm.WhileSimpleRead(); // Serial.println("end 1024 "); // //и так далее пока не закончатся целые Кбайты в файле, а дальше посчитаешь и отправишь всё остальное // } static void smartDelay(unsigned long ms){ unsigned long start = millis(); do { while (Serial3.available()) { gps.encode(Serial3.read()); } } while (millis() - start < ms); } static void printFloat(float val, float invalid, int len, int prec){ if (val == invalid) { while (len-- > 1) Serial.print('*'); Serial.print(' '); } else { Serial.print(val, prec); int vi = abs((int)val); int flen = prec + (val < 0.0 ? 2 : 1); // . and - flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; for (int i = flen; i < len; ++i) { Serial.print(' '); } } smartDelay(0); } static void printInt(unsigned long val, unsigned long invalid, int len){ char sz[32]; if (val == invalid) strcpy(sz, "*******"); else sprintf(sz, "%ld", val); sz[len] = 0; for (int i = strlen(sz); i < len; ++i) sz[i] = ' '; if (len > 0) sz[len - 1] = ' '; Serial.print(sz); smartDelay(0); } void clearBufferArray(){ for (int i = 0; i < bufferIndex; i++) { buffer[i] = NULL; } // clear all index of array with command NULL } int countProductPercents(float volt){ int percent; int kol_vo; for(int i = 0; i < 15; i++) { if( (volt >= numBegin[i]) && (volt < numBegin[i+1]) ) { kol_vo = i; percent = percentBase[i]; } } return percent; } void floatToInt(float num, int &lat, int &lon){ lat = (int)num; num = (num - lat) * 10000; lon = (int)num; }переведи в чар
#include "SIM900.h" #include <SoftwareSerial.h> #include "inetGSM.h" #include "HWSerial.h" #include "avr/sleep.h" #include "avr/power.h" #include "sms.h" #include "call.h" int t = 3600000; int pin = 9; // подключается к ring пину gsm модуля int relay = 6; // реле byte stat=0; SMSGSM sms; CallGSM call; InetGSM inet; bool isInetAttach = false; char msg[50]; int numdata; char inSerial[50]; int i=0; boolean started=false; int8_t answer; int onModulePin = 2; char aux_str[50]; //char pin[]=""; char apn[]="internet"; char user_name[]="gdata"; char password[]="gdata"; char ftp_server[]="nas.radiushost.net"; char ftp_user_name[]="nservice_ftp1"; char ftp_password[]="bd0jlifjncSUKA1C"; char path[]="www/nsccenter.ru/uploads"; char incoming_data[120]; char file_name[ ]="test.txt"; char test_str[ ]= "0000000011111111222222223333333344444444555555556666666677777777000000001111111122222222333333334444"; int data_size, aux; void setup(){ set_sleep_mode(SLEEP_MODE_STANDBY); //Определяем режим сна pinMode(pin, INPUT); digitalWrite(pin,HIGH); pinMode(6, OUTPUT); // к DTR пину GSM модуля digitalWrite(6,LOW); // пробуждаем GSM модуль pinMode(relay, OUTPUT); digitalWrite(relay,HIGH); Serial.begin(115200); Serial.println("GSM test."); if (gsm.begin(2400)) { Serial.println("\nstatus=READY"); } else Serial.println("\nstatus=IDLE"); delay(300); gsm.SimpleWrite(F("AT+CSCLK=1")); gsm.SimpleWriteln(""); Serial.begin(9600); Serial.println("GSM Shield testing."); if (gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; } else Serial.println("\nstatus=IDLE"); if(started){ //GPRS attach, put in order APN, username and password. //If no needed auth let them blank. isInetAttach = inet.connectedClient(); if (!isInetAttach) { for (int i = 0; i < 15; i++) { if (inet.attachGPRS("internet", "gdata", "gdata")) { Serial.println("Internet status = ATTACHED"); break; } else { Serial.println("Internet status = ERROR"); } } } else { Serial.println("Already attached"); } delay(1000); //sets the PIN code // snprintf(aux_str, sizeof(aux_str), "AT+CPIN=%s", pin); // sendATcommand(aux_str, "OK", 2000); Serial.println("get GPRS connection"); // sets the paremeters for the FTP server gsm.SimpleWriteln("AT+SAPBR=1,1"); delay(5000); gsm.SimpleWriteln("AT+SAPBR=2,1"); delay(5000); gsm.WhileSimpleRead(); configure_FTP(); uploadFTP(); downloadFTP(); } } void loop(){ } void configure_FTP(){ Serial.println("profile 1 for FTP"); // sets the paremeters for the FTP server gsm.SimpleWriteln("AT+FTPCID=1"); delay(2000); gsm.WhileSimpleRead(); Serial.println("adress of FTP"); snprintf(aux_str, sizeof(aux_str), "AT+FTPSERV=\"%s\"", ftp_server); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("port of FTP..."); gsm.SimpleWriteln("AT+FTPPORT=21"); delay(2000); gsm.WhileSimpleRead(); Serial.println("login of FTP..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPUN=\"%s\"", ftp_user_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("password of FTP..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPW=\"%s\"", ftp_password); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); } void uploadFTP(){ Serial.println("show file name..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTNAME=\"%s\"", file_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("show path ..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPPUTPATH=\"%s\"", path); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); //* обхожу все IF Serial.println("begin ftpput=1 ..."); // октрываю запись в FTP gsm.SimpleWriteln("AT+FTPPUT=1"); delay(5000); gsm.WhileSimpleRead(); Serial.println("begin ftpput=2,100 ..."); // отпарвляю 100 байт на фтп gsm.SimpleWriteln("AT+FTPPUT=2,100"); delay(3000); gsm.WhileSimpleRead(); gsm.SimpleWriteln(test_str); delay(3000); gsm.WhileSimpleRead(); Serial.println("end 100 "); Serial.println("close ftpput=2,0 ..."); // завершаю запись на фтп gsm.SimpleWriteln("AT+FTPPUT=2,0"); delay(3000); gsm.WhileSimpleRead(); } void downloadFTP(){ Serial.println("downloadFTP file-name..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPGETNAME=\"%s\"", file_name); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); Serial.println("downloadFTP path..."); snprintf(aux_str, sizeof(aux_str), "AT+FTPGETPATH=\"%s\"", path); gsm.SimpleWriteln(aux_str); delay(2000); gsm.WhileSimpleRead(); int x = 0; Serial.println("GET one..."); gsm.SimpleWriteln("AT+FTPGET=1"); delay(2000); gsm.WhileSimpleRead(); Serial.println("GET two..."); gsm.SimpleWriteln("AT+FTPGET=2,50"); delay(2000); gsm.WhileSimpleRead(); stat=call.CallStatus(); if(stat==CALL_INCOM_VOICE) { // Serial.println("CALL!!!"); // sms.SendSMS("НОМЕРТЕЛЕФОНА", "Vipolneno!"); digitalWrite(relay,LOW); delay(2000); digitalWrite(relay,HIGH); call.HangUp(); } digitalWrite(6,HIGH); EnterSleep(); delay(t); } void wakeUp() { Serial.println("WakeUp"); detachInterrupt(0); digitalWrite(6,LOW); delay(500); } void EnterSleep() { attachInterrupt(0, wakeUp, LOW); //Если на 0-вом прерываниии - ноль, то просыпаемся. delay(100); sleep_enable(); sleep_mode(); sleep_disable(); }ПРограмма компилируется но при загрузке на плату выдает ошибку , программа должна отправлять файлы на фтп сервер после отправки должна уйдти в сон