极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 52459|回复: 56

wed server+串口摄像头,有人感兴趣吗?

[复制链接]
发表于 2012-6-12 09:24:52 | 显示全部楼层 |阅读模式
通过浏览器远程拍照和看照片,稍为改动就是远程报警器…
回复

使用道具 举报

发表于 2012-6-12 09:27:44 | 显示全部楼层
淘宝有个四百块的wifi摄像头,带若干控制接口,不过成像似乎不怎么样,价格也偏高
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 09:31:50 | 显示全部楼层
串口摄像头控制类库和wed server类库网上下载的,与sd操作读写文件,可以通过浏览器打开远程文件,不是一般只支持html输出的。人多有兴趣就的话就大家交流一下
回复 支持 反对

使用道具 举报

发表于 2012-6-12 09:47:34 | 显示全部楼层
兴趣是有,但是不太懂这一块,占位看你们交流!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 12:14:43 | 显示全部楼层
几十块的串口摄像头就行,好像叫vc0776忘记了,回去就传代码。uno的ram不够用,mega才可以顺畅跑起来,大家要有心理准备。
回复 支持 反对

使用道具 举报

发表于 2012-6-12 15:03:29 | 显示全部楼层
感兴趣,串口摄像头(好像也叫jpg相机)近百元吧,2560控制,就地存在SD上,通过webserver调用,是这个意思吧?需要w5100吗?等着学习。
回复 支持 反对

使用道具 举报

发表于 2012-6-12 15:50:05 | 显示全部楼层
非常感兴趣!正想为我的小车配一个摄像头!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 16:04:46 | 显示全部楼层
是用w5100+sd那种官方模块。串口摄像头30
万像素的淘宝大神是六七十块,二百万象素的一百多的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 16:11:28 | 显示全部楼层
本来就想做个远程报警拍照的东西,然后做一个安卓客户端去轮询状态,然后调出现场照片。不过实验了硬件大部分功能可以实现后就没有搞下去,没意思了感觉上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 16:16:22 | 显示全部楼层
在这里抛砖引玉。用stm32读模拟摄像头然后再wed服务器才是实现这个最好选择。低成本,好效果,高速度。
回复 支持 反对

使用道具 举报

发表于 2012-6-12 16:33:51 | 显示全部楼层
楼主的代码和方案该抛出来了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 16:59:28 | 显示全部楼层
因为最近才发现这里有一个arduino的好地方,这几天一直在外地,今晚或明天回家把它翻出来。只要有一个人感兴趣就会放出来的。
回复 支持 反对

使用道具 举报

发表于 2012-6-12 17:17:58 | 显示全部楼层
daiqx2 发表于 2012-6-12 16:59
因为最近才发现这里有一个arduino的好地方,这几天一直在外地,今晚或明天回家把它翻出来。只要有一个人感兴 ...


你现在才发现这里是好地方啊,这里可是国内最好的Arduino论坛哦!期待您的代码。
回复 支持 反对

使用道具 举报

发表于 2012-6-12 17:33:58 | 显示全部楼层
{:soso_e113:}来这里的目的就是为了这个
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-12 19:40:50 | 显示全部楼层
  1. // -*- c++ -*-
  2. //
  3. // Copyright 2010 Ovidiu Predescu <[email protected]>
  4. // Date: December 2010
  5. // Updated: 08-JAN-2012 for Arduno IDE 1.0 by <[email protected]>
  6. //

  7. #include <pins_arduino.h>
  8. #include <SPI.h>
  9. #include <Ethernet.h>
  10. #include <Flash.h>
  11. #include <SD.h>
  12. #include <TinyWebServer.h>
  13. #include <Adafruit_VC0706.h>
  14. #include <SoftwareSerial.h>
  15. /****************VALUES YOU CHANGE*************/
  16. // The LED attached to PIN X on an Arduino board.
  17. const int LEDPIN = 7;

  18. // pin 4 is the SPI select pin for the SDcard
  19. const int SD_CS = 4;

  20. // pin 10 is the SPI select pin for the Ethernet
  21. const int ETHER_CS = 10;

  22. // Don't forget to modify the IP to an available one on your home network
  23. byte ip[] = { 192, 168, 1, 177 };
  24. /*********************************************/

  25. static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

  26. // The initial state of the LED
  27. int ledState = LOW;
  28. SoftwareSerial cameraconnection = SoftwareSerial(2, 3);

  29. Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);
  30. boolean has_cam=false;
  31. void setLedEnabled(boolean state) {
  32.   ledState = state;
  33.   digitalWrite(LEDPIN, ledState);
  34. }

  35. inline boolean getLedState() { return ledState; }

  36. boolean file_handler(TinyWebServer& web_server);
  37. boolean blink_led_handler(TinyWebServer& web_server);
  38. boolean led_status_handler(TinyWebServer& web_server);
  39. boolean index_handler(TinyWebServer& web_server);

  40. TinyWebServer::PathHandler handlers[] = {
  41.   // Work around Arduino's IDE preprocessor bug in handling /* inside
  42.   // strings.
  43.   //
  44.   // `put_handler' is defined in TinyWebServer
  45.   {"/", TinyWebServer::GET, &index_handler },
  46.   {"/upload/" "*", TinyWebServer::PUT, &TinyWebPutHandler::put_handler },
  47.   {"/blinkled", TinyWebServer::POST, &blink_led_handler },
  48.   {"/ledstatus" "*", TinyWebServer::GET, &led_status_handler },
  49.   {"/" "*", TinyWebServer::GET, &file_handler },
  50.   {NULL},
  51. };

  52. const char* headers[] = {
  53.   "Content-Length",
  54.   NULL
  55. };

  56. TinyWebServer web = TinyWebServer(handlers, headers);

  57. boolean has_filesystem = true;
  58. Sd2Card card;
  59. SdVolume volume;
  60. SdFile root;
  61. SdFile file;
  62. SdFile imgFile;
  63. uint16_t jpglen;
  64. int32_t time;
  65. byte wCount;
  66. boolean WriteFileing=false;
  67. char Filenamenow[13];
  68. void send_file_name(TinyWebServer& web_server, const char* filename) {
  69.   if (!filename) {
  70.     web_server.send_error_code(404);
  71.     web_server << F("Could not parse URL");
  72.   } else {
  73.     TinyWebServer::MimeType mime_type
  74.       = TinyWebServer::get_mime_type_from_filename(filename);
  75.     web_server.send_error_code(200);
  76.     web_server.send_content_type(mime_type);
  77.     web_server.end_headers();
  78.     if (file.open(&root, filename, O_READ)) {
  79.       Serial << F("Read file "); Serial.println(filename);
  80.       web_server.send_file(file);
  81.       file.close();
  82.     } else {
  83.       web_server << F("Could not find file: ") << filename << "\n";
  84.     }
  85.   }
  86. }

  87. boolean file_handler(TinyWebServer& web_server) {
  88.   char* filename = TinyWebServer::get_file_from_path(web_server.get_path());
  89.   send_file_name(web_server, filename);
  90.   free(filename);
  91.   return true;
  92. }

  93. boolean blink_led_handler(TinyWebServer& web_server) {
  94.   web_server.send_error_code(200);
  95.   web_server.send_content_type("text/plain");
  96.   web_server.end_headers();
  97.   // Reverse the state of the LED.
  98.   setLedEnabled(!getLedState());
  99.   Client& client = web_server.get_client();
  100.   if (client.available()) {
  101.     char ch = (char)client.read();
  102.     if (ch == '0') {
  103.       setLedEnabled(false);
  104.     } else if (ch == '1') {
  105.       setLedEnabled(true);
  106.       PicSave();
  107.     }
  108.   }
  109.   return true;
  110. }

  111. boolean led_status_handler(TinyWebServer& web_server) {
  112.   web_server.send_error_code(200);
  113.   web_server.send_content_type("text/plain");
  114.   web_server.end_headers();
  115.   Client& client = web_server.get_client();
  116.   client.println(getLedState(), DEC);
  117.   return true;
  118. }

  119. boolean index_handler(TinyWebServer& web_server) {
  120.   send_file_name(web_server, "INDEX.HTM");
  121.   return true;
  122. }

  123. void file_uploader_handler(TinyWebServer& web_server,
  124.                            TinyWebPutHandler::PutAction action,
  125.                            char* buffer, int size) {
  126.   static uint32_t start_time;
  127.   static uint32_t total_size;

  128.   switch (action) {
  129.   case TinyWebPutHandler::START:
  130.     start_time = millis();
  131.     total_size = 0;
  132.     if (!file.isOpen()) {
  133.       // File is not opened, create it. First obtain the desired name
  134.       // from the request path.
  135.       char* fname = web_server.get_file_from_path(web_server.get_path());
  136.       if (fname) {
  137.         Serial << F("Creating ") << fname << "\n";
  138.         file.open(&root, fname, O_CREAT | O_WRITE | O_TRUNC);
  139.         free(fname);
  140.       }
  141.     }
  142.     break;

  143.   case TinyWebPutHandler::WRITE:
  144.     if (file.isOpen()) {
  145.       file.write(buffer, size);
  146.       total_size += size;
  147.     }
  148.     break;

  149.   case TinyWebPutHandler::END:
  150.     file.sync();
  151.     Serial << F("Wrote ") << file.fileSize() << F(" bytes in ")
  152.            << millis() - start_time << F(" millis (received ")
  153.            << total_size << F(" bytes)\n");
  154.     file.close();
  155.   }
  156. }

  157. void setup() {
  158.   Serial.begin(9600);
  159.   Serial << F("Free RAM: ") << FreeRam() << "\n";

  160.   pinMode(LEDPIN, OUTPUT);
  161.   setLedEnabled(false);

  162.   pinMode(SS_PIN, OUTPUT);        // set the SS pin as an output
  163.                                 // (necessary to keep the board as
  164.                                 // master and not SPI slave)
  165.   digitalWrite(SS_PIN, HIGH);        // and ensure SS is high

  166.   // Ensure we are in a consistent state after power-up or a reset
  167.   // button These pins are standard for the Arduino w5100 Rev 3
  168.   // ethernet board They may need to be re-jigged for different boards
  169.   pinMode(ETHER_CS, OUTPUT);         // Set the CS pin as an output
  170.   digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for
  171.                                 // configuration)
  172.   pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  173.   digitalWrite(SD_CS, HIGH);         // Turn off the SD card! (wait for
  174.                                 // configuration)

  175.   // initialize the SD card.
  176.   Serial << F("Setting up SD card...\n");
  177.   // Pass over the speed and Chip select for the SD card
  178.   if (!card.init(SPI_FULL_SPEED, SD_CS)) {
  179.     Serial << F("card failed\n");
  180.     has_filesystem = false;
  181.   }
  182.   // initialize a FAT volume.
  183.   if (!volume.init(&card)) {
  184.     Serial << F("vol.init failed!\n");
  185.     has_filesystem = false;
  186.   }
  187.   if (!root.openRoot(&volume)) {
  188.     Serial << F("openRoot failed");
  189.    
  190.     has_filesystem = false;
  191.   }

  192.   if (has_filesystem) {
  193.     // Assign our function to `upload_handler_fn'.
  194.     TinyWebPutHandler::put_handler_fn = file_uploader_handler;
  195.      if(initCam()>0)
  196.      has_cam=true;
  197.   }

  198.   // Initialize the Ethernet.
  199. // Serial << F("Setting up the Ethernet card...\n");
  200.   Ethernet.begin(mac, ip);

  201.   // Start the web server.
  202. // Serial << F("Web server starting...\n");
  203.   web.begin();

  204.   Serial << F("Ready to accept HTTP requests.\n");
  205. }

  206. void loop() {
  207.   if (has_filesystem) {
  208.     web.process();
  209.     Writefiles();
  210.   }
  211. }
  212. uint8_t initCam()
  213. {
  214. if (!cam.begin()) {
  215.    // serial.println("Camera Found:");
  216.   //} else {
  217.     Serial.println("No camera found?");
  218.     return 0;
  219.   }
  220.   // Print out the camera version information (optional)
  221. // char *reply = cam.getVersion();
  222. // if (reply == 0) {
  223. //   serial.print("Failed to get version");
  224. // } //else {
  225.    // serial.println("-----------------");
  226.    // serial.print(reply);
  227.   //  serial.println("-----------------");
  228. //  }

  229.   cam.setImageSize(VC0706_640x480);        // biggest
  230. //  serial.print("Image size: ");
  231.   Serial.println("640x480");
  232.   return 1;
  233. }
  234. uint8_t PicSave()
  235. {  if(WriteFileing)
  236.     return 0;
  237.    if(has_cam==false)  
  238.     return 0;
  239.   if(!cam.takePicture())
  240.     Serial.println("Failed to snap!");
  241. // else
  242.    // serial.println("Picture taken!");
  243.   
  244.   // Create an image with the name IMAGExx.JPG
  245.   char filename[13];
  246.   strcpy(filename, "IMAGE00.JPG");
  247.   for (int i = 0; i < 40; i++) {
  248.     filename[5] = '0' + i/10;
  249.     filename[6] = '0' + i%10;
  250.     // create if does not exist, do not open existing, write, sync after write
  251.     if (! checkExists(root,filename)) {
  252.    //*//*  if(i==19)
  253.    //*  Delxx(20,40);
  254.     //* if(i==39)
  255.    //*  Delxx(0,20);
  256.      
  257.      strcpy(Filenamenow, "IMAGE00.JPG");
  258.      Filenamenow[5] = '0' + i/10;
  259.     Filenamenow[6] = '0' + i%10;
  260.       break;
  261.     }
  262.   }
  263.   
  264.   // Open the file for writing
  265.   
  266.    imgFile.open(&root,filename, O_CREAT | O_WRITE);

  267.   // Get the size of the image (frame) taken  
  268.   jpglen = cam.frameLength();
  269.   Serial.print("Storing ");
  270.   Serial.print(jpglen, DEC);
  271.   Serial.print(" byte image.");
  272.   time = millis();
  273.   //pinMode(8, OUTPUT);
  274.   // Read all the data up to # bytes!
  275.   wCount = 0; // For counting # of writes
  276.   WriteFileing=true;

  277. // Serial.println(" ms elapsed");
  278.   return 1;
  279. }
  280. void Writefiles()
  281. {
  282.   if (!WriteFileing)
  283.   return;
  284.   if (jpglen > 0) {
  285.     // read 32 bytes at a time;
  286.     uint8_t *buffer;
  287.     uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
  288.     buffer = cam.readPicture(bytesToRead);
  289.     imgFile.write(buffer, bytesToRead);
  290.     if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
  291.     //  serial.print('.');
  292.       wCount = 0;
  293.     }
  294.    //Serial.print("Read ");
  295.     //Serial.print(bytesToRead, DEC);
  296.    //Serial.println(" bytes");
  297.     jpglen -= bytesToRead;
  298.    return;
  299.   }
  300.   imgFile.close();

  301.   time = millis() - time;
  302.   Serial.println("done!");
  303.   Serial.print(time);
  304.   Serial.print(Filenamenow);
  305.   WriteFileing=false;
  306. }
  307. boolean checkExists(SdFile& parentDir, char *filePathComponent) {

  308.   SdFile child;

  309.   boolean exists = child.open(parentDir, filePathComponent, O_RDONLY);
  310.   
  311.   if (exists) {
  312.      child.close();
  313.   }
  314.   
  315.   return exists;
  316. }
  317. void delExists(SdFile& parentDir, char *filePathComponent) {

  318.   SdFile child;

  319.   boolean exists = child.open(parentDir, filePathComponent, O_WRITE);
  320.   
  321.   if (exists) {
  322.      child.remove();
  323.      child.close();
  324.     Serial.println("del!");
  325.     Serial.println(filePathComponent);
  326.   }
  327.   
  328.   
  329. }
  330. void Delxx(int starf,int endf)
  331. {
  332.   char filename[13];
  333.   strcpy(filename, "IMAGE00.JPG");
  334.   for (int i = starf; i < endf; i++) {
  335.     filename[5] = '0' + i/10;
  336.     filename[6] = '0' + i%10;
  337.     // create if does not exist, do not open existing, write, sync after write
  338.     delExists(root,filename);
  339.   }


  340. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 14:16 , Processed in 0.055674 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表