Arduino TTL jpeg串行相机和esp8266 wifi Wi-Fi模块

时间:2019-11-30 15:59:18

标签: arduino camera esp8266

如果距离测量后超过一定距离,我正在写代码拍照。

并将距离数据发送到Thingspeak,将照片存储在SD卡上。

但是,程序始终停在中间。

Serial moniter capture

距离测量和Thingspeak服务器数据传输/相机拍摄分别开发。

两个源代码可以独立正常工作。

但是当两个代码组合在一起时,会出现错误。

使用部件:Arduino Uno,esp8266 wifi模块,带NTSC视频的TTL串行JPEG相机,2Y0A21红外距离传感器,Micro SD卡适配器

#include <SoftwareSerial.h>
#include <stdlib.h>
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>

#define DEBUG true
#define chipSelect 10

const int distancePin = 0;

String apiKey = "39R00EYW0BTKK5JJ";

SoftwareSerial esp8266(2, 3); //TX/RX 

#if ARDUINO >= 100

SoftwareSerial cameraconnection = SoftwareSerial(4, 5); //TX/RX

#else
NewSoftSerial cameraconnection = NewSoftSerial(4, 5);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

int defaultDistance = 0;
int temp = 0;

void ThingspeakSendData(String alarmData);
void Snapshots();

void setup() {
    #if !defined(SOFTWARE_SPI)
    #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
        if (chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
    #else
        if (chipSelect != 10) pinMode(10, OUTPUT); // SS on Uno, etc.
    #endif
    #endif

    Serial.begin(9600);
    Serial.println("VC0706 Camera snapshot test");//the program keeps stopping in the middle.

    if (cam.begin()) {
        Serial.println("Camera Found:");
    }
    else {
        Serial.println("No camera found?");
        return;
    }

    char *reply = cam.getVersion();
    if (reply == 0) {
        Serial.print("Failed to get version");
    }
    else {
        Serial.println("-----------------");
        Serial.print(reply);
        Serial.println("-----------------");
    }

    cam.setImageSize(VC0706_640x480);

    uint8_t imgsize = cam.getImageSize();
    Serial.print("Image size: ");
    if (imgsize == VC0706_640x480) Serial.println("640x480");
    if (imgsize == VC0706_320x240) Serial.println("320x240");
    if (imgsize == VC0706_160x120) Serial.println("160x120");

    esp8266.begin(9600);

    sendData("AT+RST\r\n", 2000, DEBUG); //reset module
    sendData("AT+CWMODE=1\r\n", 1000, DEBUG); //dual mode로 설정
    sendData("AT+CWJAP=\"0sangsiljangnim\",\"123456788\"\r\n", 5000, DEBUG); 

    // 2Y0A21
    analogReference(DEFAULT);
    pinMode(distancePin, INPUT);

    // distancePin 2Y0A21
    int raw = analogRead(distancePin);
    int volt = map(raw, 0, 1023, 0, 5000);
    int distance = (21.61 / (volt - 0.1696)) * 1000;
    defaultDistance = distance;
    Serial.println("Default : " + defaultDistance);
}

void loop() {
    // distancePin 2Y0A21 
    int raw = analogRead(distancePin);
    int volt = map(raw, 0, 1023, 0, 5000);
    int distance = (21.61 / (volt - 0.1696)) * 1000;
    Serial.println(distance);

    if (distance < defaultDistance)
    {
        String alarmData = "1";
        esp8266.listen();
        ThingspeakSendData(alarmData);

        cameraconnection.listen();
        Snapshots();
    }
    else if (distance == defaultDistance)
    {
        String alarmData = "0";
        esp8266.listen();
        ThingspeakSendData(alarmData);
    }

    delay(3000);
}

void ThingspeakSendData(String alarmData) {
    String cmd = "AT+CIPSTART=\"TCP\",\"";
    cmd += "184.106.153.149"; 
    cmd += "\",80";           
    esp8266.println(cmd);

    if (esp8266.find("Error")) {
        Serial.println("AT+CIPSTART error");
        return;
    }

    String getStr = "GET /update?api_key=";
    getStr += apiKey;
    getStr += "&field1=";
    getStr += String(alarmData);
    getStr += "\r\n\r\n";

    // Send Data
    cmd = "AT+CIPSEND=";
    cmd += String(getStr.length());
    esp8266.println(cmd);

    if (esp8266.find(">")) {
        esp8266.print(getStr);
    }
    else {
        esp8266.println("AT+CIPCLOSE");
        // alert uesp8266
        Serial.println("AT+CIPCLOSE");
    }
}

String sendData(String command, const int timeout, boolean debug) {
    String response = "";
    esp8266.print(command); 
    long int time = millis();

    while ((time + timeout) > millis()) {
        while (esp8266.available()) {

            char c = esp8266.read(); 
            response += c;
        }
    }
    if (debug) {
        Serial.print(response);
    }

    return response;
}

void Snapshots() {
    Serial.println("Snap in 3 secs...");
    delay(3000);

    if (!cam.takePicture())
        Serial.println("Failed to snap!");
    else
        Serial.println("Picture taken!");

    if (!SD.begin(chipSelect)) {
        Serial.println("Card failed, or not present");
        return;
    }

    char filename[13];
    strcpy(filename, "IMAGE00.JPG");
    for (int i = 0; i < 100; i++) {
        filename[5] = '0' + i / 10;
        filename[6] = '0' + i % 10;

        if (!SD.exists(filename)) {
            break;
        }
    }

    File imgFile = SD.open(filename, FILE_WRITE);

    uint16_t jpglen = cam.frameLength();
    Serial.print("Storing ");
    Serial.print(jpglen, DEC);
    Serial.print(" byte image.");

    int32_t time = millis();
    pinMode(8, OUTPUT);

    byte wCount = 0; 
    while (jpglen > 0) {

        uint8_t *buffer;
        uint8_t bytesToRead = min(32, jpglen); 
        buffer = cam.readPicture(bytesToRead);
        imgFile.write(buffer, bytesToRead);
        if (++wCount >= 64) { 
            Serial.print('.');
            wCount = 0;
        }

        jpglen -= bytesToRead;
    }
    imgFile.close();

    time = millis() - time;
    Serial.println("done!");
    Serial.print(time); Serial.println(" ms elapsed");
}

0 个答案:

没有答案