#include "SPI.h"
#include "SD.h"
byte ZERO = 0x00;
byte incomingbyte;
long int j=0,k=0,count=0,i=0x0000;
uint8_t MH,ML;
boolean EndFlag=0;
File myFile;
File dataFile;
int a;
unsigned char data=0;
unsigned long taille = 0;
String taillephoto;
void setup()
{
Serial.begin(38400);
while (!Serial)
{
// attente connecttion du port Série sur Arduino Leonardo uniquement
;
}
Serial.print("Initialisationde la carte SD… ");
pinMode(53, OUTPUT);
if (!SD.begin(53))
{
Serial.println("Initialisation KO!");
return;
}
Serial.println("Initialisation Faite.");
Serial.println("Veuillez patienter ….");
//Démarrage de la caméra à 115200 bauds (vitesse par défaut de la caméra)
Serial2.begin(115200);
delay(100);
//Reset de la caméra
SendResetCmd();
delay(2000);
// réglage vitesse de transfert de la caméra à 38400 bauds
SetBaudRateCmd();
delay(1000);
// Démarrage de la caméra à 38400 bauds
Serial2.begin(38400);
delay(2000);
// Démarrage du SIM900 à 38400 bauds
Serial3.begin(38400);
}
void loop()
{
// prise de la photo avec la caméra
photo();
// Envoi de la photo par MMS
sendMMS();
while(1);
}
void photo()
{
byte a[32];
int ii;
SendResetCmd();
delay(2000);
SendTakePhotoCmd();
delay(1000);
while(Serial2.available()>0)
{
incomingbyte=Serial2.read();
}
myFile = SD.open("image7.jpg", FILE_WRITE);
while(!EndFlag)
{
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(20);
while(Serial2.available()>0)
{
incomingbyte=Serial2.read();
k++;
delay(1);
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
//indique que la photo est prise
if((a[j-1]==0xFF)&&(a[j]==0xD9))
{
EndFlag=1;
}
j++;
count++;
}
}
for(j=0;j<count;j++)
{
if(a[j]<0x10) Serial.print("0");
// observation de l’image via le port série
Serial.print(a[j],HEX);
Serial.print("");
}
for(ii=0; ii<count; ii++)
myFile.write(a[ii]);
Serial.println();
}
myFile.close();
Serial.println("Photo dans la carte SD!");
}
void sendMMS()
{
// ouverture de la photo prise
myFile = SD.open("image7.jpg");
// on récupère le poids de photo
taille = myFile.size();
// Conversion du poids du format int au format String
taillephoto = String(taille, DEC);
Serial.print("Taille du fichier = " );
// Affiche le poids en octets de la photo
Serial.println(taillephoto);
// Fermeture de la photo
myFile.close();
// Envoi du MMS
Serial3.println("AT");
delay(1000);//100
updateSerial();
Serial3.println("AT+CMMSINIT");
delay(1000);//100
updateSerial();
Serial3.print("AT+CMMSCURL=\ http://mms1\ ""\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSCID=1\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSPROTO=\"10.151.0.1\",8080\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSSENDCFG=6,3,0,0,2,4,1,0\r");
delay(2000);
updateSerial();
Serial3.print("AT+SAPBR=3,1,\ CONTYPE\,\ GPRS\"" "\r");
delay(1000);
updateSerial();
Serial3.print("AT+SAPBR=3,1,\ APN\,\ sl2sfr\"" "\r");
delay(1000);
updateSerial();
Serial3.print("AT+SAPBR=1,1\r");
delay(2000);
updateSerial();
Serial3.print("AT+SAPBR=2,1\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSEDIT=0\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSEDIT=1\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSDOWN=\PIC" + taillephoto + ", 50000 , \"image7.jpg\r");
delay(1000);
updateSerial();
dataFile=SD.open("image7.jpg");
a=0;
if(dataFile)
{
while(dataFile.available())
{
data=dataFile.read();
if(data<0x10) Serial.print("0");
Serial.print(data,HEX);
a++;
if((a%40)==0) Serial.println();
Serial3.write(data);
}
dataFile.close();
}
else
{
Serial.println("Erreur de fichier!");
}
delay(1000);
Serial3.print("AT+CMMSRECP=\"+33641363164\ \r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSVIEW\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSSEND\r");
delay(1000);
updateSerial();
Serial3.print("AT+CMMSEDIT=0\r");
delay(100);
updateSerial();
Serial3.print("AT+CMMSTERM\r");
delay(1000);
updateSerial();
}
void SendResetCmd() // reset de la caméra
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x26);
Serial2.write(ZERO);
}
/*************************************/
/* réglage taille de l’image :
/* <1> 0x22 : 160*120
/* <2> 0x11 : 320*240
/* <3> 0x00 : 640*480
/* <4> 0x1D : 800*600
/* <5> 0x1C : 1024*768
/* <6> 0x1B : 1280*960
/* <7> 0x21 : 1600*1200
/************************************/
void SetImageSizeCmd(byte Size) // résolution de l’image
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x54);
Serial2.write(0x01);
Serial2.write(Size);
}
/*************************************/
/* Set BaudRate :
/* <1>¡¡0xAE : 9600
/* <2>¡¡0x2A : 38400
/* <3>¡¡0x1C : 57600
/* <4>¡¡0x0D : 115200
/* <5>¡¡0xAE : 128000
/* <6>¡¡0x56 : 256000
/*************************************/
void SetBaudRateCmd()
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x31);
Serial2.write(0x06);
Serial2.write(0x04);
Serial2.write(0x02);
Serial2.write(ZERO);
Serial2.write(0x08);
Serial2.write(0X2A);
Serial2.write(0xF2);
}
void SendTakePhotoCmd()// Prise de photo
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x36);
Serial2.write(0x01);
Serial2.write(ZERO);
}
void SendReadDataCmd()
{
MH=i/0x100;
ML=i%0x100;
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x32);
Serial2.write(0x0c);
Serial2.write(ZERO);
Serial2.write(0x0a);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(MH);
Serial2.write(ML);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(0x20);
Serial2.write(ZERO);
Serial2.write(0x0a);
i+=0x20;
}
void StopTakePhotoCmd()
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x36);
Serial2.write(0x01);
Serial2.write(0x03);
}
void updateSerial()
{
delay(500);
while (Serial.available())
{
Serial3.write(Serial.read());
}
while(Serial3.available())
{
Serial.write(Serial3.read());
}
}