Shares
Wireless Camera with Arduino and the CC3000 WiFi chip

Wireless Camera with Arduino and the CC3000 WiFi chip

Last Update: / by Marco Schwartz

One nice thing to have in any home automation or alarm system is a camera to see what’s going on remotely. Of course, such solutions already exists, and you even have WiFi cameras that you can buy for under $50. But they are not open-source, and therefore it is difficult to have the control on what’s going on, or to customize the interface. In 2012, a nice tutorial was published on how to build such a connected camera. You can find the tutorial here. We will do something different in this article: we will use the CC3000 WiFi chip and the Arduino platform, along with a serial camera, to build you own wireless camera. You will learn how to take still pictures from your home and display them on your computer remotely. Let’s dive in!

Hardware Requirements

The whole project is based on the Arduino platform, so of course you will need an Arduino board. I really recommend using the Arduino Uno board for this project, as it is the only board that is currently compatible with the CC3000 library at the time this article was written.

Then, you need the CC3000 chip. I recommend using the Adafruit CC3000 breakout board, which is the only one I tested that worked without problem. It is nice and compact, has voltage regulators onboard, as well as an onboard antenna. You can also make your own breakout board, as there are many PCB layout available online.

Then, you need a camera. I used a TTL serial camera from Adafruit. It is quite easy to connect and to use, thanks to a library developed for Arduino. It can take pictures up to 640*480. Not great, but enough to see what’s going on in your house. You will also need two 10K ohms resistors to connect the camera to the Arduino.

Finally, you need a breadboard and some jumper wires to make the connections between the different parts.

This is the list of the part that were used in this tutorial:

Software Requirements

For this project, you just need the usual Arduino IDE, and the Adafruit’s CC3000 library. To install a library, just download the required folder, and put it into your /Arduino/libraries/ folder. You will also need the library for the serial camera.

You will also need a web server running on your computer.

Hardware Configuration

The hardware configuration for this project is actually not that complicated, thanks to the good informations that you will find on the CC3000 breakout board. Connect the IRQ pin of the CC3000 board to pin number 3 of the Arduino board, VBAT to pin 5, and CS to pin 10. Then, you need to connect the SPI pins to the Arduino board: MOSI, MISO, and CLK go to pins 11,12, and 13, respectively. Finally, take care of the power supply: Vin goes to the Arduino 5V, and GND to GND.

Now, the camera. There are four pins to connect: the power pins VCC and GND, and the two serial pins TX and RX . Connect VCC to the 3.3V pin of the CC3000 board, and GND to the Arduino ground. After that, connect the TX pin to the Arduino pin number 2 using a voltage divider with the two 10K ohms resistors, following the picture below. Then, connect RX directly to the Arduino pin number 4.

The following picture summarizes the hardware connections:

Wireless Camera with Arduino and the CC3000 WiFi chip

Testing the Camera

In this part, we are simply going to test the camera. I also recommend testing if your CC3000 module is wired correctly. For that, please refer to this tutorial. The code for this part is available on our GitHub repository.

In this test sketch, we will just see if the camera is correctly recognized, and try to take a picture. It starts by importing the correct libraries:

#include 
#include 

Then, we have to create the correct objects to use the camera: a software serial connection on the right pins, and finally the camera object:

SoftwareSerial cameraconnection = SoftwareSerial(2, 4);
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

Then, in the setup() function, we can check if the camera can be initialized:

if (cam.begin()) {
Serial.println("Camera found:");
 } else {
Serial.println("Camera not found !");
return;
 }

We also need to set the picture size:

cam.setImageSize(VC0706_640x480);

Finally, after 3 seconds, we can try to take a picture:

delay(3000);

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

As usual, you will find the complete sketch on the GitHub repository of the project. You can upload the complete sketch, open the serial monitor, and you should see the following lines:

Camera test
Camera found
Picture in 3 seconds …
Picture taken!

Uploading a Picture on Your Computer

Now let’s dive in the core of the article: automatically uploading the pictures taken by the camera to your computer. We’ll keep it very basic: the Arduino will simply upload a picture at given time interval, and erase the picture that was uploaded before. But it is quite easy to modify the software to do some more advanced functions. The code for this project is available on our GitHub repository.

First, the Arduino sketch. I will really focus on the code to upload the picture to your computer, you can find the details of how to connect to a WiFi network in a previous tutorial. The whole difficulty in this project is to format the right HTTP message to send to the server. We will transmit the picture using a “multipart/form-data” content type. And for that, we need to know the exact length of the message we are going to send to the server. After taking a picture like in the test sketch, we need to know the size of the picture:

uint16_t jpglen = cam.frameLength();

The size of the data being sent will be this jpglen, plus the extra length of the headers around the picture. This is done by these lines:

start_request = start_request + "\n" + "--AaB03x" + "\n" + "Content-Disposition: form-data; name=\"picture\"; filename=\"CAM.JPG\"" + "\n" + "Content-Type: image/jpeg" + "\n" + "Content-Transfer-Encoding: binary" + "\n" + "\n";
end_request = end_request + "\n" + "--AaB03x--" + "\n";

We can then compute the final length of the message with:

uint16_t extra_length;
extra_length = start_request.length() + end_request.length();
uint16_t len = jpglen + extra_length;

We can then connect via TCP to the server:

Adafruit_CC3000_Client client = cc3000.connectTCP(ip, port);

And send the start of the request:

client.println(F("POST /arduino-camera-wifi/camera.php HTTP/1.1"));
client.println(F("Host: 192.168.0.1:80"));
client.println(F("Content-Type: multipart/form-data; boundary=AaB03x"));
client.print(F("Content-Length: "));
client.println(len);
client.print(start_request);

Now, we get to the part where we actually have to transfer the picture. We are going to send it chunk by chunk to the server. This is the loop that transfer the picture to the server:

byte wCount = 0; // For counting # of writes
while (jpglen > 0) {

 uint8_t *buffer;
 uint8_t bytesToRead = min(16, jpglen); // change to 32 or 64 for a speedup but may not work with all setups!

 buffer = cam.readPicture(bytesToRead);
 client.write(buffer, bytesToRead);

 if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
  Serial.print('.');
  wCount = 0;
 }
 jpglen -= bytesToRead;
 delay(100);
}

This code basically put the picture in a buffer of 16 bytes, and transfer it to the server with a write() operation. There are two parameters you can play with here: the size of the buffer, and the delay() at the end. I had to reduce the size to 16 bytes and add a 100 ms delay to actually make it work, otherwise the picture was corrupted when it arrived on my computer. So at the moment the file transfer is quite slow. It might work with other parameters for you, I would really be interested by your results!

We can finish with the end of the request:

client.print(end_request);
client.println();

You can go over to our GitHub repository to check out the complete sketch.

Now, the server part, which is much shorter. It is basically a PHP file, camera.php, that is called by the Arduino sketch. This is the content of the file:

$target_path = "uploads/";

$target_path = $target_path . basename( $_FILES['picture']['name']);

if(move_uploaded_file($_FILES['picture']['tmp_name'], $target_path)) {
 echo "The file ". basename( $_FILES['picture']['name']).
 " has been uploaded";

}
else {
 echo "There was an error uploading the file, please try again!";
}

This code is actually quite simple: the main part is the move_uploaded_file command that move the $_FILES[‘picture’][‘tmp_name’] to the target path. It checks if this operation was successful, and return an error otherwise.

You can now upload the sketch, and look at the serial monitor. You should see the Arduino take the picture, connect to the server, and start uploading it:

Wireless Camera with Arduino and the CC3000 WiFi chip

You can check the little dots on the Serial monitor to be sure it’s actually doing something. After a while, this is what was uploaded on my computer:

Wireless Camera with Arduino and the CC3000 WiFi chip

Of course, you can now use this code to develop some more advanced applications using this simple serial camera. It already has a built-in motion detector feature that I didn’t try yet, it would be an interesting application as well ! Note that in this tutorial, we will only cover a tiny part of the possibilities offered by the Arduino platform. If you want to learn more about the topic and discover more similar projects, I recommend checking out our main digital product, Home Automation with Arduino.

You have an idea on how to improve this tutorial ? You made it and developed some cool applications ? Please let us know by commenting below!

Want to learn more? Get my free eBook about Arduino!

Arduino is an amazing platform that you can use to build all sorts of projects. Download today my free eBook "Building a Simple Alarm System with Arduino". Simply click on the button below!

Leave a Comment

Please enter your name.
Please enter your email.
Please enter your comment.
silent walker 2 years ago
Hi! i'm a beginner in this field. Right now, i'm doing a project related to pet feeder machine. When the time for feeding arrived, the camera module will automatically captured a few photos within 30 seconds.The pet owner can view their pet' photos through an app. The problem is i don't know how to program as well as to connect all the components. The components that i used are arduino uno, OV7670 cmos vga camera module, micro sd module and wifi shield v2.2 for arduino (802.11 b/g/n) as a component to make a connection between arduino board to my app. i hope somebody can help me. i really2 need your help. Thank you.
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
naz 2 years ago
Hello M.r.Marco SchwartzI have a robot car deucational kit with Legaoo UNO board..and I want to control the car kit by my phone throgh wifi and straming image amd video to my phone..do you think your camra will be compatible with my board ? Thanks in advance *-*
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Huy Nguyễn Ngọc 3 years ago
what's name of Module Camera?I can't find that.
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Jay 3 years ago
Hi, Is it possible to use a 5V ready micro-SD breakout board+ from adafruit?
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
bj 3 years ago
hiits really a great project Marco Schwartz .....but can it be implemented with esp8266-01 WiFi module
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Marco Schwartz bj 3 years ago
Hi, never tried it but in theory yes :)
Donna Carter 4 years ago
Hello,Nice post about "Wireless Camera with Arduino and the CC3000 WiFi chip". I like the concept and nicely explained. Thanks for sharing a great post.Regard,Donna Carterhttp://www.arduinostarterki...
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Marco Schwartz Donna Carter 4 years ago
Hello, thanks!
shelly 4 years ago
Where is the picture uploaded?
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Dushyant Singh 4 years ago
I am trying this with Arduino WiFi shield, I know it shouldn't affect it but I am getting following error and I have no idea why. Also I have exact same post request as mentioned in the blog.HTTP/1.1 400 Bad RequestDate: Fri, 06 Nov 2015 08:51:48 GMTServer: ApacheContent-Length: 300Connection: closeContent-Type: text/html; charset=iso-8859-1400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.Request header field is missing ':' separator.ÂÿØÿþ
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Marco Schwartz Dushyant Singh 4 years ago
The WiFi library is unfortunately quite different from the CC3000 library, so I imagine there will be several changes to make especially on timings.
Ramanan Ramesh Dushyant Singh 4 years ago
Could you post what you construct in your HTTP Message please?Also, try some tool like Fiddler or Network Monitor or Microsoft Message Analyzer to see what goes down as the HTTP Message.That's how I got mine to work :)
SEENEEVASSEN CAREMBEN 4 years ago
Hi,Can i use an Arduino yun ? And will i be able to stream videos? Thanks :)
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Marco Schwartz SEENEEVASSEN CAREMBEN 4 years ago
Using an USB camera with the Yun, definitely :)
Ramanan Ramesh 4 years ago
Hi,Could you please share the ASP.NET/WCF Equivalent of the upload code to post the image I do not have a PHP server set up but have a working IIS on my laptop.Any pointers would be much helpful.
Reply
Please enter your name.
Please enter your email.
Please enter your comment.
Marco Schwartz Ramanan Ramesh 4 years ago
Hi, I never used ASP.net, but all the best for your project!
AetherWu 4 years ago
I eventually put everything all together to this post:http://aetherwu.com/life-la...The project runs perfectly expect it is a bit slow to upload to a cloud sever. I am moving forward to research on a SPI camera to replace the TTL serial camera. But I hope my post helps.
Reply
Please enter your name.
Please enter your email.
Please enter your comment.