Отправка файлов на FTP сервер по GPRS

Strannik-s
Offline
Зарегистрирован: 13.05.2015

С наступающим ,господа!

Подскажите решение задачи: 

Необходимо отправить фото с Ардукам по 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();
}
 
Araris
Offline
Зарегистрирован: 09.11.2012

Strannik-s пишет:

Что означает данная ошибка, как быть дальше?

Гугл подсказывает, что "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

Strannik-s
Offline
Зарегистрирован: 13.05.2015

благодарю!

Еще вопрос, как отправить данные больше чем позволяет модуль за один раз?

+FTPPUT:1,1,1300 - можно отправлять до 1300 байт, мне необходимо 100 кб
 
Araris
Offline
Зарегистрирован: 09.11.2012

Мне не приходилось заниматься ни GPRS, ни FTP, но запрос https://www.google.com.ua/?gws_rd=ssl#q=arduino+gprs+ftp+file+transfer даёт немало интересных ссылок. Запрос на русском, кстати, тоже (но меньше).

Strannik-s
Offline
Зарегистрирован: 13.05.2015

магия ) 

ESV
Offline
Зарегистрирован: 16.12.2015

Это читал?

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

AT+SAPBR=3,1,"CONTYPE","GPRS"

OK
AT+SAPBR=3,1,"APN","CMNET"

OK
AT+SAPBR=1,1

OK
AT+FTPCID=1

OK
AT+FTPTYPE="A"

OK
AT+FTPSERV="simcom.exavault.com"

OK
AT+FTPUN="zyf"

OK
AT+FTPPW="zyf"

OK
AT+FTPPUTNAME="111.txt"

OK
AT+FTPPUTPATH="/"

OK
AT+FTPPUT=1

OK

+FTPPUT:1,1,1360
AT+FTPPUT=2,10

+FTPPUT:2,10

OK

+FTPPUT:1,1,1360
AT+FTPPUT=2,0

OK

+FTPPUT:1,0

 

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Именно это читал. ГСМ шилд установлен на Мегу, в библиотеке исправлен RX TX  на 10, 11. Что не получилось- адаптировать настройки под представленный по ссылке код. Получилось только вырезать часть кода и отправить не более 1300 байт.

ESV
Offline
Зарегистрирован: 16.12.2015

http://brne.narod.ru/ftp-sim900.htm

Отправляй  в цикле кусочками - по килобайту например

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Подскажешь как этот цикл задать? 

ESV
Offline
Зарегистрирован: 16.12.2015

пиши что и как ты пытаешься отправить (код)

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Конечным результатом должен быть передан файл 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();
}

 

ESV
Offline
Зарегистрирован: 16.12.2015


/*У тебя есть уже 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

Strannik-s
Offline
Зарегистрирован: 13.05.2015

И так, благодаря помощи вашей и друзей код встроил в программу, теперь выдает ошибку - при преобразовани данных

с камеры получает в байтах а отправлять в чарах, подскажите как быть, чтобы файл с фото отправить по ФТП. Ошибка в строке 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;
}  

 

MacSim
Offline
Зарегистрирован: 28.11.2012

переведи в чар

Andruino1
Offline
Зарегистрирован: 14.04.2021
#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(); 
}

ПРограмма компилируется но при загрузке на плату выдает ошибку , программа должна отправлять файлы на фтп сервер после отправки должна уйдти в сон