A Telegram BOT for this awesome all-in-one board.
Dependencies: BSP_B-L475E-IOT01 mbed es_wifi jsmn
Telegram Bot for DISCO_L475VG_IOT01
This application embeds aTelegram chatbot into the DISCO_L475VG_IOT01 board.
The Bot answers to the users queries about:
- Real time environmental data taken from the on board sensors.
- Environmental data history of the latest 24 hours stored on board.
- Camera images taken from the Arducam-mini-2mp (optional).
This software uses:
- A modified version of the wifi library provided by ST in order to enable the TCP-SSL connection.
- An open source json parser jsmn (https://github.com/zserge/jsmn).
- A web service (http://now.http.org) to initialize the RTC.
- A web service (https://image-charts.com) to publish temperature,humidity and pressure charts.
- A modified version of the Arducam driver (https://os.mbed.com/users/dflet/)
Compilation
Import in your compiler and modify the following defines:
- WIFI_SSID
- WIFI_PASSWORD
- TELEGRAM_BOT_APIKEY
Please follow the Telegram bots documentation (https://core.telegram.org/bots) to better understand how the Telegram API works and how to create your bot.
In order to support the Arducam-Mini-2MP set WITH_ARDUCAM_2640 #define to 1.
Screenshots
Security
The Inventek wifi module creates the ssl connection but does not authenticate the server's certificate ( AT cmd P9=0 ).
For more details http://www.inventeksys.com/IWIN/programming-certificates-tcp-ssltls/
ArduCAM2640.h@10:28cf58359411, 2018-02-16 (annotated)
- Committer:
- dvddnr
- Date:
- Fri Feb 16 09:17:47 2018 +0000
- Revision:
- 10:28cf58359411
- Parent:
- 8:89fe332bc412
WITH_ARDUCAM_2640 default value to 0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dvddnr | 8:89fe332bc412 | 1 | /* |
dvddnr | 8:89fe332bc412 | 2 | ArduCAM.h - Arduino library support for CMOS Image Sensor |
dvddnr | 8:89fe332bc412 | 3 | Copyright (C)2011-2015 ArduCAM.com. All right reserved |
dvddnr | 8:89fe332bc412 | 4 | |
dvddnr | 8:89fe332bc412 | 5 | Basic functionality of this library are based on the demo-code provided by |
dvddnr | 8:89fe332bc412 | 6 | ArduCAM.com. You can find the latest version of the library at |
dvddnr | 8:89fe332bc412 | 7 | http://www.ArduCAM.com |
dvddnr | 8:89fe332bc412 | 8 | |
dvddnr | 8:89fe332bc412 | 9 | Now supported controllers: |
dvddnr | 8:89fe332bc412 | 10 | - OV7670 |
dvddnr | 8:89fe332bc412 | 11 | - MT9D111 |
dvddnr | 8:89fe332bc412 | 12 | - OV7675 |
dvddnr | 8:89fe332bc412 | 13 | - OV2640 |
dvddnr | 8:89fe332bc412 | 14 | - OV3640 |
dvddnr | 8:89fe332bc412 | 15 | - OV5642 |
dvddnr | 8:89fe332bc412 | 16 | - OV7660 |
dvddnr | 8:89fe332bc412 | 17 | - OV7725 |
dvddnr | 8:89fe332bc412 | 18 | - MT9M112 |
dvddnr | 8:89fe332bc412 | 19 | - MT9V111 |
dvddnr | 8:89fe332bc412 | 20 | - OV5640 |
dvddnr | 8:89fe332bc412 | 21 | - MT9M001 |
dvddnr | 8:89fe332bc412 | 22 | |
dvddnr | 8:89fe332bc412 | 23 | We will add support for many other sensors in next release. |
dvddnr | 8:89fe332bc412 | 24 | |
dvddnr | 8:89fe332bc412 | 25 | Supported MCU platform |
dvddnr | 8:89fe332bc412 | 26 | - Theoretically support all Arduino families |
dvddnr | 8:89fe332bc412 | 27 | - Arduino UNO R3 (Tested) |
dvddnr | 8:89fe332bc412 | 28 | - Arduino MEGA2560 R3 (Tested) |
dvddnr | 8:89fe332bc412 | 29 | - Arduino Leonardo R3 (Tested) |
dvddnr | 8:89fe332bc412 | 30 | - Arduino Nano (Tested) |
dvddnr | 8:89fe332bc412 | 31 | - Arduino DUE (Tested) |
dvddnr | 8:89fe332bc412 | 32 | - Arduino Yun (Tested) |
dvddnr | 8:89fe332bc412 | 33 | - Raspberry Pi (Tested) |
dvddnr | 8:89fe332bc412 | 34 | |
dvddnr | 8:89fe332bc412 | 35 | |
dvddnr | 8:89fe332bc412 | 36 | If you make any modifications or improvements to the code, I would appreciate |
dvddnr | 8:89fe332bc412 | 37 | that you share the code with me so that I might include it in the next release. |
dvddnr | 8:89fe332bc412 | 38 | I can be contacted through http://www.ArduCAM.com |
dvddnr | 8:89fe332bc412 | 39 | |
dvddnr | 8:89fe332bc412 | 40 | This library is free software; you can redistribute it and/or |
dvddnr | 8:89fe332bc412 | 41 | modify it under the terms of the GNU Lesser General Public |
dvddnr | 8:89fe332bc412 | 42 | License as published by the Free Software Foundation; either |
dvddnr | 8:89fe332bc412 | 43 | version 2.1 of the License, or (at your option) any later version. |
dvddnr | 8:89fe332bc412 | 44 | |
dvddnr | 8:89fe332bc412 | 45 | This library is distributed in the hope that it will be useful, |
dvddnr | 8:89fe332bc412 | 46 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
dvddnr | 8:89fe332bc412 | 47 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
dvddnr | 8:89fe332bc412 | 48 | Lesser General Public License for more details. |
dvddnr | 8:89fe332bc412 | 49 | |
dvddnr | 8:89fe332bc412 | 50 | You should have received a copy of the GNU Lesser General Public |
dvddnr | 8:89fe332bc412 | 51 | License along with this library; if not, write to the Free Software |
dvddnr | 8:89fe332bc412 | 52 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
dvddnr | 8:89fe332bc412 | 53 | */ |
dvddnr | 8:89fe332bc412 | 54 | |
dvddnr | 8:89fe332bc412 | 55 | /*------------------------------------ |
dvddnr | 8:89fe332bc412 | 56 | Revision History: |
dvddnr | 8:89fe332bc412 | 57 | 2012/09/20 V1.0.0 by Lee first release |
dvddnr | 8:89fe332bc412 | 58 | 2012/10/23 V1.0.1 by Lee Resolved some timing issue for the Read/Write Register |
dvddnr | 8:89fe332bc412 | 59 | 2012/11/29 V1.1.0 by Lee Add support for MT9D111 sensor |
dvddnr | 8:89fe332bc412 | 60 | 2012/12/13 V1.2.0 by Lee Add support for OV7675 sensor |
dvddnr | 8:89fe332bc412 | 61 | 2012/12/28 V1.3.0 by Lee Add support for OV2640,OV3640,OV5642 sensors |
dvddnr | 8:89fe332bc412 | 62 | 2013/02/26 V2.0.0 by Lee New Rev.B shield hardware, add support for FIFO control |
dvddnr | 8:89fe332bc412 | 63 | and support Mega1280/2560 boards |
dvddnr | 8:89fe332bc412 | 64 | 2013/05/28 V2.1.0 by Lee Add support all drawing functions derived from UTFT library |
dvddnr | 8:89fe332bc412 | 65 | 2013/08/24 V3.0.0 by Lee Support ArudCAM shield Rev.C hardware, features SPI interface and low power mode. |
dvddnr | 8:89fe332bc412 | 66 | Support almost all series of Arduino boards including DUE. |
dvddnr | 8:89fe332bc412 | 67 | 2014/03/09 V3.1.0 by Lee Add the more impressive example sketches. |
dvddnr | 8:89fe332bc412 | 68 | Optimise the OV5642 settings, improve image quality. |
dvddnr | 8:89fe332bc412 | 69 | Add live preview before JPEG capture. |
dvddnr | 8:89fe332bc412 | 70 | Add play back photos one by one after BMP capture. |
dvddnr | 8:89fe332bc412 | 71 | 2014/05/01 V3.1.1 by Lee Minor changes to add support Arduino IDE for linux distributions. |
dvddnr | 8:89fe332bc412 | 72 | 2014/09/30 V3.2.0 by Lee Improvement on OV5642 camera dirver. |
dvddnr | 8:89fe332bc412 | 73 | 2014/10/06 V3.3.0 by Lee Add OV7660,OV7725 camera support. |
dvddnr | 8:89fe332bc412 | 74 | 2015/02/27 V3.4.0 by Lee Add the support for Arduino Yun board, update the latest UTFT library for ArduCAM. |
dvddnr | 8:89fe332bc412 | 75 | 2015/06/09 V3.4.1 by Lee Minor changes and add some comments |
dvddnr | 8:89fe332bc412 | 76 | 2015/06/19 V3.4.2 by Lee Add support for MT9M112 camera. |
dvddnr | 8:89fe332bc412 | 77 | 2015/06/20 V3.4.3 by Lee Add support for MT9V111 camera. |
dvddnr | 8:89fe332bc412 | 78 | 2015/06/22 V3.4.4 by Lee Add support for OV5640 camera. |
dvddnr | 8:89fe332bc412 | 79 | 2015/06/22 V3.4.5 by Lee Add support for MT9M001 camera. |
dvddnr | 8:89fe332bc412 | 80 | --------------------------------------*/ |
dvddnr | 8:89fe332bc412 | 81 | |
dvddnr | 8:89fe332bc412 | 82 | /* |
dvddnr | 8:89fe332bc412 | 83 | Parts of this software is related to https://os.mbed.com/users/dflet/ work. |
dvddnr | 8:89fe332bc412 | 84 | */ |
dvddnr | 8:89fe332bc412 | 85 | |
dvddnr | 8:89fe332bc412 | 86 | |
dvddnr | 8:89fe332bc412 | 87 | #pragma once |
dvddnr | 8:89fe332bc412 | 88 | |
dvddnr | 8:89fe332bc412 | 89 | #include <mbed.h> |
dvddnr | 8:89fe332bc412 | 90 | #include "arducam_regs.h" |
dvddnr | 8:89fe332bc412 | 91 | |
dvddnr | 8:89fe332bc412 | 92 | /****************************************************/ |
dvddnr | 8:89fe332bc412 | 93 | /* Sensor related definition */ |
dvddnr | 8:89fe332bc412 | 94 | /****************************************************/ |
dvddnr | 8:89fe332bc412 | 95 | /****************************************************/ |
dvddnr | 8:89fe332bc412 | 96 | /* ArduChip related definition */ |
dvddnr | 8:89fe332bc412 | 97 | /****************************************************/ |
dvddnr | 8:89fe332bc412 | 98 | #define RWBIT 0x80 //READ AND WRITE BIT IS BIT[7] |
dvddnr | 8:89fe332bc412 | 99 | |
dvddnr | 8:89fe332bc412 | 100 | #define ARDUCHIP_TEST1 0x00 //TEST register |
dvddnr | 8:89fe332bc412 | 101 | #define ARDUCHIP_TEST2 0x01 //TEST register |
dvddnr | 8:89fe332bc412 | 102 | |
dvddnr | 8:89fe332bc412 | 103 | #define ARDUCHIP_FRAMES 0x01 //Bit[2:0]Number of frames to be captured |
dvddnr | 8:89fe332bc412 | 104 | |
dvddnr | 8:89fe332bc412 | 105 | #define ARDUCHIP_MODE 0x02 //Mode register |
dvddnr | 8:89fe332bc412 | 106 | #define MCU2LCD_MODE 0x00 |
dvddnr | 8:89fe332bc412 | 107 | #define CAM2LCD_MODE 0x01 |
dvddnr | 8:89fe332bc412 | 108 | #define LCD2MCU_MODE 0x02 |
dvddnr | 8:89fe332bc412 | 109 | |
dvddnr | 8:89fe332bc412 | 110 | #define ARDUCHIP_TIM 0x03 //Timming control |
dvddnr | 8:89fe332bc412 | 111 | #define HREF_LEVEL_MASK 0x01 //0 = High active , 1 = Low active |
dvddnr | 8:89fe332bc412 | 112 | #define VSYNC_LEVEL_MASK 0x02 //0 = High active , 1 = Low active |
dvddnr | 8:89fe332bc412 | 113 | #define LCD_BKEN_MASK 0x04 //0 = Enable, 1 = Disable |
dvddnr | 8:89fe332bc412 | 114 | #define DELAY_MASK 0x08 //0 = no delay, 1 = delay one clock |
dvddnr | 8:89fe332bc412 | 115 | #define MODE_MASK 0x10 //0 = LCD mode, 1 = FIFO mode |
dvddnr | 8:89fe332bc412 | 116 | #define FIFO_PWRDN_MASK 0x20 //0 = Normal operation, 1 = FIFO power down |
dvddnr | 8:89fe332bc412 | 117 | #define LOW_POWER_MODE 0x40 //0 = Normal mode, 1 = Low power mode |
dvddnr | 8:89fe332bc412 | 118 | |
dvddnr | 8:89fe332bc412 | 119 | #define ARDUCHIP_FIFO 0x04 //FIFO and I2C control |
dvddnr | 8:89fe332bc412 | 120 | #define FIFO_CLEAR_MASK 0x01 |
dvddnr | 8:89fe332bc412 | 121 | #define FIFO_START_MASK 0x02 |
dvddnr | 8:89fe332bc412 | 122 | #define FIFO_RDPTR_RST_MASK 0x10 |
dvddnr | 8:89fe332bc412 | 123 | #define FIFO_WRPTR_RST_MASK 0x20 |
dvddnr | 8:89fe332bc412 | 124 | |
dvddnr | 8:89fe332bc412 | 125 | #define ARDUCHIP_GPIO 0x06 //GPIO Write Register |
dvddnr | 8:89fe332bc412 | 126 | #define GPIO_RESET_MASK 0x01 //0 = default state, 1 = Sensor reset IO value |
dvddnr | 8:89fe332bc412 | 127 | #define GPIO_PWDN_MASK 0x02 //0 = Sensor power down IO value, 1 = Sensor power enable IO value |
dvddnr | 8:89fe332bc412 | 128 | |
dvddnr | 8:89fe332bc412 | 129 | #define BURST_FIFO_READ 0x3C //Burst FIFO read operation |
dvddnr | 8:89fe332bc412 | 130 | #define SINGLE_FIFO_READ 0x3D //Single FIFO read operation |
dvddnr | 8:89fe332bc412 | 131 | |
dvddnr | 8:89fe332bc412 | 132 | #define ARDUCHIP_REV 0x40 //ArduCHIP revision |
dvddnr | 8:89fe332bc412 | 133 | #define VER_LOW_MASK 0x3F |
dvddnr | 8:89fe332bc412 | 134 | #define VER_HIGH_MASK 0xC0 |
dvddnr | 8:89fe332bc412 | 135 | |
dvddnr | 8:89fe332bc412 | 136 | #define ARDUCHIP_TRIG 0x41 //Trigger source |
dvddnr | 8:89fe332bc412 | 137 | #define VSYNC_MASK 0x01 |
dvddnr | 8:89fe332bc412 | 138 | #define SHUTTER_MASK 0x02 |
dvddnr | 8:89fe332bc412 | 139 | #define CAP_DONE_MASK 0x08 |
dvddnr | 8:89fe332bc412 | 140 | |
dvddnr | 8:89fe332bc412 | 141 | #define FIFO_SIZE1 0x42 //Camera write FIFO size[7:0] for burst to read |
dvddnr | 8:89fe332bc412 | 142 | #define FIFO_SIZE2 0x43 //Camera write FIFO size[15:8] |
dvddnr | 8:89fe332bc412 | 143 | #define FIFO_SIZE3 0x44 //Camera write FIFO size[18:16] |
dvddnr | 8:89fe332bc412 | 144 | |
dvddnr | 8:89fe332bc412 | 145 | #define OV2640_CHIPID_HIGH 0x0A |
dvddnr | 8:89fe332bc412 | 146 | #define OV2640_CHIPID_LOW 0x0B |
dvddnr | 8:89fe332bc412 | 147 | #define OV2640_CHIPID_HIGH_VALUE 0x26 |
dvddnr | 8:89fe332bc412 | 148 | #define OV2640_CHIPID_LOW_VALUE 0x42 |
dvddnr | 8:89fe332bc412 | 149 | |
dvddnr | 8:89fe332bc412 | 150 | /****************************************************/ |
dvddnr | 8:89fe332bc412 | 151 | |
dvddnr | 8:89fe332bc412 | 152 | |
dvddnr | 8:89fe332bc412 | 153 | #define OV_RESOLUTION_VGA 1 |
dvddnr | 8:89fe332bc412 | 154 | #define OV_RESOLUTION_QVGA 2 |
dvddnr | 8:89fe332bc412 | 155 | #define OV_RESOLUTION_CIF 3 |
dvddnr | 8:89fe332bc412 | 156 | #define OV_RESOLUTION_QQVGA 4 |
dvddnr | 8:89fe332bc412 | 157 | |
dvddnr | 8:89fe332bc412 | 158 | #define OV2640_I2C_ADDR_W 0x0060 |
dvddnr | 8:89fe332bc412 | 159 | #define OV2640_I2C_ADDR_R 0x0061 |
dvddnr | 8:89fe332bc412 | 160 | |
dvddnr | 8:89fe332bc412 | 161 | class ArduCAM2640 |
dvddnr | 8:89fe332bc412 | 162 | { |
dvddnr | 8:89fe332bc412 | 163 | public: |
dvddnr | 8:89fe332bc412 | 164 | |
dvddnr | 8:89fe332bc412 | 165 | // ctor dtor |
dvddnr | 8:89fe332bc412 | 166 | ArduCAM2640(){}; |
dvddnr | 8:89fe332bc412 | 167 | ~ArduCAM2640(){}; |
dvddnr | 8:89fe332bc412 | 168 | |
dvddnr | 8:89fe332bc412 | 169 | // setup |
dvddnr | 8:89fe332bc412 | 170 | bool Setup(int resolution,int jpeg_quality,DigitalOut *cam_cs, SPI *cam_spi, I2C *cam_i2c) |
dvddnr | 8:89fe332bc412 | 171 | { |
dvddnr | 8:89fe332bc412 | 172 | uint8_t vid = 0; |
dvddnr | 8:89fe332bc412 | 173 | uint8_t pid = 0; |
dvddnr | 8:89fe332bc412 | 174 | const struct sensor_reg8 *pivot; |
dvddnr | 8:89fe332bc412 | 175 | |
dvddnr | 8:89fe332bc412 | 176 | _cam_cs = cam_cs; |
dvddnr | 8:89fe332bc412 | 177 | _cam_spi = cam_spi; |
dvddnr | 8:89fe332bc412 | 178 | _cam_i2c = cam_i2c; |
dvddnr | 8:89fe332bc412 | 179 | |
dvddnr | 8:89fe332bc412 | 180 | _cam_spi->format(8,0); |
dvddnr | 8:89fe332bc412 | 181 | _cam_spi->frequency(8000000); |
dvddnr | 8:89fe332bc412 | 182 | _cam_i2c->frequency(100000); |
dvddnr | 8:89fe332bc412 | 183 | *_cam_cs = 1; |
dvddnr | 8:89fe332bc412 | 184 | |
dvddnr | 8:89fe332bc412 | 185 | /* check spi i2c */ |
dvddnr | 8:89fe332bc412 | 186 | wrSensorReg8_8(0xFF,0x01); |
dvddnr | 8:89fe332bc412 | 187 | rdSensorReg8_8(OV2640_CHIPID_HIGH,&vid); |
dvddnr | 8:89fe332bc412 | 188 | rdSensorReg8_8(OV2640_CHIPID_LOW,&pid); |
dvddnr | 8:89fe332bc412 | 189 | if ((vid != OV2640_CHIPID_HIGH_VALUE) || (pid != OV2640_CHIPID_LOW_VALUE)) |
dvddnr | 8:89fe332bc412 | 190 | { |
dvddnr | 8:89fe332bc412 | 191 | printf("Can't find OV2640 module! vid = 0x%x pid = 0x%x\r\n", vid, pid); |
dvddnr | 8:89fe332bc412 | 192 | return false; |
dvddnr | 8:89fe332bc412 | 193 | } |
dvddnr | 8:89fe332bc412 | 194 | |
dvddnr | 8:89fe332bc412 | 195 | /* setup resolution and jpeg quality */ |
dvddnr | 8:89fe332bc412 | 196 | wrSensorReg8_8(0xFF,0x01); |
dvddnr | 8:89fe332bc412 | 197 | wrSensorReg8_8(0x12,0x80); |
dvddnr | 8:89fe332bc412 | 198 | wait_ms(200); |
dvddnr | 8:89fe332bc412 | 199 | |
dvddnr | 8:89fe332bc412 | 200 | pivot = &OV2640_JPEG_INIT[0]; |
dvddnr | 8:89fe332bc412 | 201 | while(1) |
dvddnr | 8:89fe332bc412 | 202 | { |
dvddnr | 8:89fe332bc412 | 203 | if(pivot->reg == 0xff && pivot->val == 0xff) break; |
dvddnr | 8:89fe332bc412 | 204 | // quality register |
dvddnr | 8:89fe332bc412 | 205 | if(pivot->reg == 0x44) |
dvddnr | 8:89fe332bc412 | 206 | { |
dvddnr | 8:89fe332bc412 | 207 | wrSensorReg8_8(pivot->reg,(uint8_t)100-jpeg_quality); |
dvddnr | 8:89fe332bc412 | 208 | } |
dvddnr | 8:89fe332bc412 | 209 | else |
dvddnr | 8:89fe332bc412 | 210 | wrSensorReg8_8(pivot->reg,pivot->val); |
dvddnr | 8:89fe332bc412 | 211 | pivot++; |
dvddnr | 8:89fe332bc412 | 212 | } |
dvddnr | 8:89fe332bc412 | 213 | |
dvddnr | 8:89fe332bc412 | 214 | pivot = &OV2640_YUV422[0]; |
dvddnr | 8:89fe332bc412 | 215 | while(1) |
dvddnr | 8:89fe332bc412 | 216 | { |
dvddnr | 8:89fe332bc412 | 217 | if(pivot->reg == 0xff && pivot->val == 0xff) break; |
dvddnr | 8:89fe332bc412 | 218 | wrSensorReg8_8(pivot->reg,pivot->val); |
dvddnr | 8:89fe332bc412 | 219 | pivot++; |
dvddnr | 8:89fe332bc412 | 220 | } |
dvddnr | 8:89fe332bc412 | 221 | |
dvddnr | 8:89fe332bc412 | 222 | pivot = &OV2640_JPEG[0]; |
dvddnr | 8:89fe332bc412 | 223 | while(1) |
dvddnr | 8:89fe332bc412 | 224 | { |
dvddnr | 8:89fe332bc412 | 225 | if(pivot->reg == 0xff && pivot->val == 0xff) break; |
dvddnr | 8:89fe332bc412 | 226 | wrSensorReg8_8(pivot->reg,pivot->val); |
dvddnr | 8:89fe332bc412 | 227 | pivot++; |
dvddnr | 8:89fe332bc412 | 228 | } |
dvddnr | 8:89fe332bc412 | 229 | |
dvddnr | 8:89fe332bc412 | 230 | wrSensorReg8_8(0xFF,0x01); |
dvddnr | 8:89fe332bc412 | 231 | wrSensorReg8_8(0x15,0x00); |
dvddnr | 8:89fe332bc412 | 232 | |
dvddnr | 8:89fe332bc412 | 233 | switch(resolution) |
dvddnr | 8:89fe332bc412 | 234 | { |
dvddnr | 8:89fe332bc412 | 235 | case OV_RESOLUTION_VGA: |
dvddnr | 8:89fe332bc412 | 236 | pivot = &OV2640_640x480_JPEG[0]; |
dvddnr | 8:89fe332bc412 | 237 | break; |
dvddnr | 8:89fe332bc412 | 238 | case OV_RESOLUTION_QVGA: |
dvddnr | 8:89fe332bc412 | 239 | pivot = &OV2640_320x240_JPEG[0]; |
dvddnr | 8:89fe332bc412 | 240 | break; |
dvddnr | 8:89fe332bc412 | 241 | case OV_RESOLUTION_QQVGA: |
dvddnr | 8:89fe332bc412 | 242 | pivot = &OV2640_160x120_JPEG[0]; |
dvddnr | 8:89fe332bc412 | 243 | break; |
dvddnr | 8:89fe332bc412 | 244 | case OV_RESOLUTION_CIF: |
dvddnr | 8:89fe332bc412 | 245 | pivot = &OV2640_352x288_JPEG[0]; |
dvddnr | 8:89fe332bc412 | 246 | break; |
dvddnr | 8:89fe332bc412 | 247 | default: |
dvddnr | 8:89fe332bc412 | 248 | printf("Wrong resolution\r\n"); |
dvddnr | 8:89fe332bc412 | 249 | return false; |
dvddnr | 8:89fe332bc412 | 250 | }; |
dvddnr | 8:89fe332bc412 | 251 | |
dvddnr | 8:89fe332bc412 | 252 | while(1) |
dvddnr | 8:89fe332bc412 | 253 | { |
dvddnr | 8:89fe332bc412 | 254 | if(pivot->reg == 0xff && pivot->val == 0xff) break; |
dvddnr | 8:89fe332bc412 | 255 | wrSensorReg8_8(pivot->reg,pivot->val); |
dvddnr | 8:89fe332bc412 | 256 | pivot++; |
dvddnr | 8:89fe332bc412 | 257 | } |
dvddnr | 8:89fe332bc412 | 258 | |
dvddnr | 8:89fe332bc412 | 259 | wait_ms(2000); |
dvddnr | 8:89fe332bc412 | 260 | |
dvddnr | 8:89fe332bc412 | 261 | return true; |
dvddnr | 8:89fe332bc412 | 262 | }; |
dvddnr | 8:89fe332bc412 | 263 | |
dvddnr | 8:89fe332bc412 | 264 | uint32_t CaptureImage(uint8_t *image_buffer, uint32_t image_buffer_size,uint32_t *jpeg_start_index) |
dvddnr | 8:89fe332bc412 | 265 | { |
dvddnr | 8:89fe332bc412 | 266 | uint32_t fifolen = 0; |
dvddnr | 8:89fe332bc412 | 267 | uint32_t jpeg_start,jpeg_end; |
dvddnr | 8:89fe332bc412 | 268 | |
dvddnr | 8:89fe332bc412 | 269 | flush_fifo(); |
dvddnr | 8:89fe332bc412 | 270 | start_capture(); |
dvddnr | 8:89fe332bc412 | 271 | while (!(get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))) |
dvddnr | 8:89fe332bc412 | 272 | { |
dvddnr | 8:89fe332bc412 | 273 | wait_ms(30); |
dvddnr | 8:89fe332bc412 | 274 | } |
dvddnr | 8:89fe332bc412 | 275 | |
dvddnr | 8:89fe332bc412 | 276 | fifolen = read_fifo_length() + 2; |
dvddnr | 8:89fe332bc412 | 277 | if(fifolen>image_buffer_size) |
dvddnr | 8:89fe332bc412 | 278 | { |
dvddnr | 8:89fe332bc412 | 279 | printf("Arducam::CaptureImage fifo_len %d exceeds image_buffer_size %d\r\n",fifolen,image_buffer_size); |
dvddnr | 8:89fe332bc412 | 280 | return 0; |
dvddnr | 8:89fe332bc412 | 281 | } |
dvddnr | 8:89fe332bc412 | 282 | printf("fifo len %d\r\n",fifolen); |
dvddnr | 8:89fe332bc412 | 283 | |
dvddnr | 8:89fe332bc412 | 284 | image_buffer[0]=BURST_FIFO_READ; |
dvddnr | 8:89fe332bc412 | 285 | *_cam_cs = 0; |
dvddnr | 8:89fe332bc412 | 286 | _cam_spi->write((char*)image_buffer,fifolen,(char*)image_buffer,fifolen); |
dvddnr | 8:89fe332bc412 | 287 | *_cam_cs = 1; |
dvddnr | 8:89fe332bc412 | 288 | |
dvddnr | 8:89fe332bc412 | 289 | jpeg_start = image_buffer_size; |
dvddnr | 8:89fe332bc412 | 290 | jpeg_end = 0; |
dvddnr | 8:89fe332bc412 | 291 | for(int i=0;i<fifolen-1;i++) |
dvddnr | 8:89fe332bc412 | 292 | { |
dvddnr | 8:89fe332bc412 | 293 | if(image_buffer[i] == 0xFF) |
dvddnr | 8:89fe332bc412 | 294 | { |
dvddnr | 8:89fe332bc412 | 295 | if(image_buffer[i+1] == 0xD8 && jpeg_start == image_buffer_size) |
dvddnr | 8:89fe332bc412 | 296 | { |
dvddnr | 8:89fe332bc412 | 297 | jpeg_start = i; |
dvddnr | 8:89fe332bc412 | 298 | } |
dvddnr | 8:89fe332bc412 | 299 | else if(image_buffer[i+1] == 0xD9 && jpeg_end == 0) |
dvddnr | 8:89fe332bc412 | 300 | { |
dvddnr | 8:89fe332bc412 | 301 | jpeg_end = i+1; |
dvddnr | 8:89fe332bc412 | 302 | break; |
dvddnr | 8:89fe332bc412 | 303 | } |
dvddnr | 8:89fe332bc412 | 304 | } |
dvddnr | 8:89fe332bc412 | 305 | } |
dvddnr | 8:89fe332bc412 | 306 | |
dvddnr | 8:89fe332bc412 | 307 | if( jpeg_start != image_buffer_size && jpeg_end != 0 ) |
dvddnr | 8:89fe332bc412 | 308 | { |
dvddnr | 8:89fe332bc412 | 309 | *jpeg_start_index = jpeg_start; |
dvddnr | 8:89fe332bc412 | 310 | return (jpeg_end - jpeg_start + 1); |
dvddnr | 8:89fe332bc412 | 311 | } |
dvddnr | 8:89fe332bc412 | 312 | |
dvddnr | 8:89fe332bc412 | 313 | return 0; |
dvddnr | 8:89fe332bc412 | 314 | }; |
dvddnr | 8:89fe332bc412 | 315 | |
dvddnr | 8:89fe332bc412 | 316 | private: |
dvddnr | 8:89fe332bc412 | 317 | DigitalOut *_cam_cs; |
dvddnr | 8:89fe332bc412 | 318 | SPI *_cam_spi; |
dvddnr | 8:89fe332bc412 | 319 | I2C *_cam_i2c; |
dvddnr | 8:89fe332bc412 | 320 | |
dvddnr | 8:89fe332bc412 | 321 | //Low level SPI write operation |
dvddnr | 8:89fe332bc412 | 322 | int bus_write(int address, int value) |
dvddnr | 8:89fe332bc412 | 323 | { |
dvddnr | 8:89fe332bc412 | 324 | // take the SS pin low to select the chip: |
dvddnr | 8:89fe332bc412 | 325 | *_cam_cs = 0; |
dvddnr | 8:89fe332bc412 | 326 | // send in the address and value via SPI: |
dvddnr | 8:89fe332bc412 | 327 | _cam_spi->write(address); |
dvddnr | 8:89fe332bc412 | 328 | _cam_spi->write(value); |
dvddnr | 8:89fe332bc412 | 329 | // take the SS pin high to de-select the chip: |
dvddnr | 8:89fe332bc412 | 330 | *_cam_cs = 1; |
dvddnr | 8:89fe332bc412 | 331 | |
dvddnr | 8:89fe332bc412 | 332 | return 0; |
dvddnr | 8:89fe332bc412 | 333 | }; |
dvddnr | 8:89fe332bc412 | 334 | |
dvddnr | 8:89fe332bc412 | 335 | //Low level SPI read operation |
dvddnr | 8:89fe332bc412 | 336 | uint8_t bus_read(int address) |
dvddnr | 8:89fe332bc412 | 337 | { |
dvddnr | 8:89fe332bc412 | 338 | uint8_t value = 0; |
dvddnr | 8:89fe332bc412 | 339 | // take the SS pin low to select the chip: |
dvddnr | 8:89fe332bc412 | 340 | *_cam_cs = 0; |
dvddnr | 8:89fe332bc412 | 341 | // send in the address and value via SPI: |
dvddnr | 8:89fe332bc412 | 342 | // printf("addr = 0x%x\r\n",address); |
dvddnr | 8:89fe332bc412 | 343 | _cam_spi->write(address); |
dvddnr | 8:89fe332bc412 | 344 | value = _cam_spi->write(0x00); |
dvddnr | 8:89fe332bc412 | 345 | // take the SS pin high to de-select the chip: |
dvddnr | 8:89fe332bc412 | 346 | *_cam_cs = 1; |
dvddnr | 8:89fe332bc412 | 347 | return value; |
dvddnr | 8:89fe332bc412 | 348 | }; |
dvddnr | 8:89fe332bc412 | 349 | |
dvddnr | 8:89fe332bc412 | 350 | //Write ArduChip internal registers |
dvddnr | 8:89fe332bc412 | 351 | void write_reg(uint8_t addr, uint8_t data) |
dvddnr | 8:89fe332bc412 | 352 | { |
dvddnr | 8:89fe332bc412 | 353 | bus_write(addr | 0x80, data); |
dvddnr | 8:89fe332bc412 | 354 | }; |
dvddnr | 8:89fe332bc412 | 355 | |
dvddnr | 8:89fe332bc412 | 356 | //Read ArduChip internal registers |
dvddnr | 8:89fe332bc412 | 357 | uint8_t read_reg(uint8_t addr) |
dvddnr | 8:89fe332bc412 | 358 | { |
dvddnr | 8:89fe332bc412 | 359 | uint8_t data; |
dvddnr | 8:89fe332bc412 | 360 | data = bus_read(addr); |
dvddnr | 8:89fe332bc412 | 361 | return data; |
dvddnr | 8:89fe332bc412 | 362 | }; |
dvddnr | 8:89fe332bc412 | 363 | |
dvddnr | 8:89fe332bc412 | 364 | //Reset the FIFO pointer to ZERO |
dvddnr | 8:89fe332bc412 | 365 | void flush_fifo(void) |
dvddnr | 8:89fe332bc412 | 366 | { |
dvddnr | 8:89fe332bc412 | 367 | write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK); |
dvddnr | 8:89fe332bc412 | 368 | }; |
dvddnr | 8:89fe332bc412 | 369 | |
dvddnr | 8:89fe332bc412 | 370 | //Send capture command |
dvddnr | 8:89fe332bc412 | 371 | void start_capture(void) |
dvddnr | 8:89fe332bc412 | 372 | { |
dvddnr | 8:89fe332bc412 | 373 | write_reg(ARDUCHIP_FIFO, FIFO_START_MASK); |
dvddnr | 8:89fe332bc412 | 374 | }; |
dvddnr | 8:89fe332bc412 | 375 | |
dvddnr | 8:89fe332bc412 | 376 | //Clear FIFO Complete flag |
dvddnr | 8:89fe332bc412 | 377 | void clear_fifo_flag(void) |
dvddnr | 8:89fe332bc412 | 378 | { |
dvddnr | 8:89fe332bc412 | 379 | write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK); |
dvddnr | 8:89fe332bc412 | 380 | }; |
dvddnr | 8:89fe332bc412 | 381 | |
dvddnr | 8:89fe332bc412 | 382 | |
dvddnr | 8:89fe332bc412 | 383 | //Read Write FIFO length |
dvddnr | 8:89fe332bc412 | 384 | //Support ArduCAM Mini only |
dvddnr | 8:89fe332bc412 | 385 | uint32_t read_fifo_length(void) |
dvddnr | 8:89fe332bc412 | 386 | { |
dvddnr | 8:89fe332bc412 | 387 | uint32_t len1,len2,len3=0; |
dvddnr | 8:89fe332bc412 | 388 | uint32_t length=0; |
dvddnr | 8:89fe332bc412 | 389 | len1 = read_reg(FIFO_SIZE1); |
dvddnr | 8:89fe332bc412 | 390 | len2 = read_reg(FIFO_SIZE2); |
dvddnr | 8:89fe332bc412 | 391 | len3 = read_reg(FIFO_SIZE3) & 0x07; |
dvddnr | 8:89fe332bc412 | 392 | length = ((len3 << 16) | (len2 << 8) | len1);// & 0x07ffff; |
dvddnr | 8:89fe332bc412 | 393 | return length; |
dvddnr | 8:89fe332bc412 | 394 | }; |
dvddnr | 8:89fe332bc412 | 395 | |
dvddnr | 8:89fe332bc412 | 396 | //I2C Write 8bit address, 8bit data |
dvddnr | 8:89fe332bc412 | 397 | uint8_t wrSensorReg8_8(int regID, int regDat) |
dvddnr | 8:89fe332bc412 | 398 | { |
dvddnr | 8:89fe332bc412 | 399 | uint8_t buff[2]; |
dvddnr | 8:89fe332bc412 | 400 | buff[0] = regID; |
dvddnr | 8:89fe332bc412 | 401 | buff[1] = regDat; |
dvddnr | 8:89fe332bc412 | 402 | _cam_i2c->write(OV2640_I2C_ADDR_W,(char*)buff,2); |
dvddnr | 8:89fe332bc412 | 403 | return(1); |
dvddnr | 8:89fe332bc412 | 404 | }; |
dvddnr | 8:89fe332bc412 | 405 | |
dvddnr | 8:89fe332bc412 | 406 | //I2C Read 8bit address, 8bit data |
dvddnr | 8:89fe332bc412 | 407 | uint8_t rdSensorReg8_8(uint8_t regID, uint8_t* regDat) |
dvddnr | 8:89fe332bc412 | 408 | { |
dvddnr | 8:89fe332bc412 | 409 | _cam_i2c->write(OV2640_I2C_ADDR_W,(char*)®ID,1); |
dvddnr | 8:89fe332bc412 | 410 | _cam_i2c->read(OV2640_I2C_ADDR_R,(char*)regDat,1); |
dvddnr | 8:89fe332bc412 | 411 | return(1); |
dvddnr | 8:89fe332bc412 | 412 | }; |
dvddnr | 8:89fe332bc412 | 413 | |
dvddnr | 8:89fe332bc412 | 414 | //Get corresponding bit status |
dvddnr | 8:89fe332bc412 | 415 | uint8_t get_bit(uint8_t addr, uint8_t bit) |
dvddnr | 8:89fe332bc412 | 416 | { |
dvddnr | 8:89fe332bc412 | 417 | uint8_t temp; |
dvddnr | 8:89fe332bc412 | 418 | temp = read_reg(addr); |
dvddnr | 8:89fe332bc412 | 419 | temp = temp & bit; |
dvddnr | 8:89fe332bc412 | 420 | return temp; |
dvddnr | 8:89fe332bc412 | 421 | }; |
dvddnr | 8:89fe332bc412 | 422 | |
dvddnr | 8:89fe332bc412 | 423 | }; |
dvddnr | 8:89fe332bc412 | 424 |