Удаленный снимок с камеры и отправка

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Добрый день.

Есть потребность собрать систему автоматизации переодического наблюдения за аквариумом.

Можно ли, насколько сложно реализовать переодический снимок с камеры и отправить его посредством либо ММС либо Е-майла?

предполагается использование чего то подобного:

http://www.ebay.com/itm/SIM900-Quad-band-GSM-GPRS-Shield-for-Arduino-UNO...

с выбором камеры еще не определился.(будет еще куча всего включая резервное питание подсветки с автоматическим включением по расписанию, мониторинг состояния сети, температуры, давления, ) 

Проект в стадии проектирования, пытаюсь определится с общим обьемом работ/возможностью воплотить задуманное.

Прошу помощи по данному вопросу, либо тыка носом туда, где искать.

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Если я правильнопонял по приведенным ссылкам используется для передачи данных WI-fi + роутер в качестве доступа к сети интернет.?

Или же доступ к интернету возможен через GSM?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Как я правильно понял в этом проекте по нажатию кнопки Ардуина делает запрос к камере послать картинку куда-то....
А там куда пришло  пересылка  к вам на мэйл(мобильный)

Были и ещё подобные, там использовался ваш Гугле Докс  ( вроде Ексель ) со скриптами форвард куда-то.

К способу доступа в Интернет это никоим образом не относится- он должен просто быть.

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Планировалось автономное устройство.

последовательность действий такиая:

по достижении определенного времени (модуль RTC) автоматически опрашиваются датчики, сохраняется снимок с камеры на карточку SD.

после завершения опроса системы посылается либо смс с данными датчиков либо е-майл с вложением картинки..

накопал такую ерунду

http://www.ebay.com/itm/Compatible-Mini-Seeed-Camera-Shield-Development-Board-for-Arduino-or-Seeeduino-/131485448615?hash=item1e9d24b9a7:g:KjcAAOSwEeFVKxo6

и

http://www.ebay.com/itm/SIM900-Quad-band-GSM-GPRS-Shield-for-Arduino-UNO-MEGA-Leonardo-/221917393294?hash=item33ab4eb18e:g:YikAAOxyRNJSjs3T

если правльно понимаю то собирается елементарно как бутерброд на уне/меге втыкивая одно в другое.

вроде как плата камеры командой с ардуины должна уметь сама сохранять каринку на сд-карточку.

и аналогично вроде как ГСМ модуль управляя командами с ардуины можно заставить самому сформировать смс/емайл, прицепить файл и отправить во вне.

Может кто нибудь подтвердить эту информацию?

Печально что по цене только эти 2 платки + уно/мега конские 4к рублей выходят, без учета остального обвеса... изначально стоимость всего проекта планировалась в 2 раза меньше...

 

 

 

 

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Спасибо, но хотелось бы исключить роутер из состава устройства вообще. 

 UPD: 

Неужели никто не использовал GSM-щит с SIM900 для отправки е-майла?

И щит типа Arducam для захвата картинки?

мдя.. походу прийдется самостоятельно топтать дорожку вокруг неизвестно где разложенных грабель...

KiTS
Offline
Зарегистрирован: 09.11.2016

Приветствую MadDen! Интересен твой проект. Сам ищу информацию по подобной теме! Разобрался с возможностью коммутирования Ардуино+SIM900+камера? Если есть что интересное отпишись пожалуйста.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

MadDen_ix пишет:

Добрый день.

Есть потребность собрать систему автоматизации переодического наблюдения за аквариумом.

Можно ли, насколько сложно реализовать переодический снимок с камеры и отправить его посредством либо ММС либо Е-майла?

предполагается использование чего то подобного:

http://www.ebay.com/itm/SIM900-Quad-band-GSM-GPRS-Shield-for-Arduino-UNO...

с выбором камеры еще не определился.(будет еще куча всего включая резервное питание подсветки с автоматическим включением по расписанию, мониторинг состояния сети, температуры, давления, ) 

Проект в стадии проектирования, пытаюсь определится с общим обьемом работ/возможностью воплотить задуманное.

Прошу помощи по данному вопросу, либо тыка носом туда, где искать.

 

Я бы делал без ардуины, взял TP-LINK c USB портом, накатил туда OPENWRT, прикрутил камеру по USB и простым скриптом из под openwrt делай снимки когда хошь и отсылай куда угодно

 

axill
Offline
Зарегистрирован: 05.09.2011

Ардуину к этой задаче можно прикрутить только из исключительно большой любви к ардуино. Так же как слушать сегодня музыку с винила вместо флэшки

дешевле и проще использовать готовые решения. Либо готовую камеру с встроенным GSM модемом либо соединить gsm роутер с ip камерой

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Вот честно, никого обидеть не хочу, но тупость наших сограждан иногда просто поражает. 

Мне НЕ НУЖЕН модем/роутер/ипкамера. для начала задумайтесь КАК ваша х.... поделка сможет управлять подсветкой???

я ХОЧУ сделать это на ардуине просто потому что мне это интересно.

так что иди те вы со своими предложениями, если ничего не можете сказать "по теме" на... ... то место откуда пришли. молча.

2КиТС ковыряю потихоньку. у меня там в задумке не только камера но еще и что то вроде встроенного ибп.

собственно на текущий момент у меня получается что то вроде ибп с двойным преобразованием + удаленный мониторинг..

ИБП сделан из самодельная платка защиты и мониторинга напряжения сети + блок питания 220в-12в + акб 7В 12Ач + инвертор 12в-220в

+от тойже акб питается мега2650 + ардукам мини 2мп + карточка сд+ сим900.

пока все работает  "по отдельности" ардуина внешнее напряжение мониторит, управляет нагрузкой на линию инвертора и на линию освещения аквариума., параллельно делает фото и складывает на карту памяти.

может отсылать смс с сотоянием системы на номер телефона. как прикрутить отправку снимков с карты пока "не допер".

доделывал мониторинг внешнего напряжения и собирал инвертор (инвертор так до конца и не собрал, на него можно только включать  подачу напряжения с акб, а вот вторая линия в зависимости от времени включает или выключает подсветку, регулирует яркость. есть мысль поставить датчик освещения что бы  яркость регулировалась в зависимости от внешнего освещения.)

собственно отдельно ардуино + камера = проблем не много, стандартные скетчи если брать ARDUCAMовские шилды работают.

файлики исправно на карточку пишутся.

Проблема сейчас с сим900.. не могу словить момент и понять почему спустя 2-3 часа работы шилд вырубается.

Хотя никакой команды на него не подается... прриходится либо зажимать кнопку вручную, что не очень хорошо, либо повторно отдавать програмно команду на включение...  сейчас пытаюсь еще и как то заставить ардуину мониторить состояние щита - включен или выключен

а так, с отправкой смс проблем нет, опять таки стандартный скетч текстовое сообщение отправляет на ура.  как только решу проблему с выключением сим900 буду дальше в сторону отправки картинки  пытатся что то сдеалть.

axill
Offline
Зарегистрирован: 05.09.2011

Вы задачу вначале описали без всяких подсветок. Т.е. Сначала посчитали на форуме всех идиотами которым не обязательно знать всю гениальность задумки, а когда вам предложили оптимальное решение той задачи, которая заявлена, вы перешли на оскорбления

то есть ваше отношение к читающим понятно без приукрашиваний. 

На другом форуме вас бы уже забанили. Пользуйтесь свободой слова на ардуино.ру

удачи

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

собственно есть такой очень интересный файлик, называется SIM900_email_atcommand_manual

там очень много интересного написано, судя по кторому можно таки отправить емайл посредством ат-команд.

но так же находил информацию что на нормальном почтовом сервере очень проблемно проти аутентификацию из за использования всяких ssl..

но проверить все это в реальности еще не успел

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

2Аксил.

..будет еще куча всего включая резервное питание подсветки с автоматическим включением по расписанию, мониторинг состояния сети, температуры, давления...

 

это было в самом первом посте. если Вы не умеете читать сразу весь текст целиком, а ограничиваетесь только  первым предложением - тут уж я Вам ничем помоч не могу.

axill
Offline
Зарегистрирован: 05.09.2011

Признаю, текст в скобках не учел, но это не дает вам повода переходить на оскорбления. Ничего хорошего о вас такое поведение не говорит

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

axill пишет:

Признаю, текст в скобках не учел, но это не дает вам повода переходить на оскорбления. Ничего хорошего о вас такое поведение не говорит

Признаю, погорячился. Весь день общался со следователями. Трудный день на работе да еще и контору обчистили, усталость доет о себе знать.

Мир?

axill
Offline
Зарегистрирован: 05.09.2011

Ок. Я сам скептически отношусь к возможностям ардуины в части работы с изображениями. Поэтому сам предпочел бы вариант, что написал выше с использованием ip камеры, gsm роутера и к нему бы пристроил ардуину с ethernet shield или если хватает пинов то можно и esp8266 которая к gsm роутеру может цепляться по wifi, а не проводам

память МК всего 2кб для УНО или 8кб для МЕГИ. Этого не хватит для обработки даже самой мизерной вменяемой картинки. Все, что можно сделать - тупо побайтно перепихать данные из камеры в gsm модуль. Работать может, но на грани возможностей

alex_r61
Offline
Зарегистрирован: 20.06.2012

У китайцев есть модем A6C, с камерой. Работает через AT команды.

KiTS
Offline
Зарегистрирован: 09.11.2016

alex_r61. Данный модуль A6C можно скоммутировать с ардуино? 

phoenixoid
Offline
Зарегистрирован: 14.07.2015

Вам нужно смотреть в сторону Raspberry Pi. К ней и камера есть готовая (а можно любую USB подключить) и GPIO много и можно с SIM900 не заморачиваться а подключить USB 3G модем если нет WiFi.

KiTS
Offline
Зарегистрирован: 09.11.2016

MadDen_ix .

     Сам в данный момент собираю похожее устройство на дипломный проект. Новичок в этом деле, поэтому пока сложновато.

      Суть- создание автоматизированной системы упраления на базе ардуино, с возможностью дистанционного управления и получения данных с ардуинки ( влажность, температура, управление некоторыми силовыми устройствами, простейшая сигнализация) Так же на базе Arduono Mega2650. 

     На данный момент играюсь отдельно с каждыми модулями.Начал с простого.Сейчас объединяю все подпрограммы в одну большую( блок управления) с выводом на дисплей и регулировкой  параметров.

     Загвоздка заключается в данный момент в подключении модуля SIM 900 к ардуинке и настройке команд управления, а так же подключеня камеры OV2640. В идеале, было бы здорово если  OV2640 делала один снимок при срабатывании датчика движения, сохраняла на SD карту и в последующем передавала изображение либо в виде MMS, либо  в сеть. Я так понял задачи у нас с вами очень схожи и вы в этом вопросе продвинулись. 

  Миниммум который хотелось бы реализовать это дистанционное управление через SMS и сохранеие фото на SD при срабатывании датчика.

  Можете скинуть скетчи,схемы, фото подключения (конкретные пины), буду очень благодарен.

 

alex_r61
Offline
Зарегистрирован: 20.06.2012

KiTS пишет:

alex_r61. Данный модуль A6C можно скоммутировать с ардуино? 

Подключается как обычный GSM модем, через Serial порт. Для камеры есть несколько AT команд, включение/выключение, установка разрешения, съёмка, выдача результата. Здесь, на форуме, мучают такой модем, только без камеры. Я его из за камеры и взял, тоже эта тема интересна.

KiTS
Offline
Зарегистрирован: 09.11.2016

Phoenixoid.

Cогласен с вами возможно так и проще, но поддержу  слова MadDen_ix -"я ХОЧУ сделать это на ардуине просто потому что мне это интересно.." Что тут суть не в том что бы найти замену ардуине.Да и вопрос в целом не в этом стоял, а втом что бы решить проблему с подключением и настройкой конкретных модулей. 

KiTS
Offline
Зарегистрирован: 09.11.2016

alex_r61.

Вы сами подключали данный модем (А6С), если да, то можно взглянуть на результат?

alex_r61
Offline
Зарегистрирован: 20.06.2012

Пока только к компу через терминал, для проверки. Снимки не сохранил, сейчас нет времени с ним возиться.

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

2KITS

а какой сим 900 используете? отдельно чип + своя плата или что то уже готовое? я пытался протравить плату под собственные нужды, но после того как трижды поотслаивались дорожки  забил и купил готовый шилд.

 

 

 

собственно ему для работы нужно всего 4 пина. Тх Рх и питание (5в и земля)

отдельно если закоротить 2 площадки под кондером  с4 (над красной гребенкой справа) то можно включать программно подключив 9-й пин на шилде к любому цифровому пину ардуины и подавая на него в течении  2х секунд высокий уровень сигнала.

правдо вот как отслеживать состояние его я еще не понял...  есть идея убрать светодиод статуса , вместо него кинуть продод до входа ардуины и мониторить состояние этого входа - если что то приходит - значит включен, если нет - выключился.

вообще по я по этому шилду весь мой код:

добавить в самом начале 

#include <SoftwareSerial.h>
#include <String.h>
SoftwareSerial mySerial(18, 19);
#define gsm_power 25

соответственно пины связи на меге - 18 и 19, на шилде 0 и 1,

9пин с шилда заведен на 25-й на меге - использую для включения

собственно в void setup-е вот оно включение

      pinMode(gsm_power, OUTPUT)          ;
      digitalWrite (gsm_power, HIGH);
      delay (3000)        ;
      digitalWrite (gsm_power, LOW);

и там же установка скорости связи с шилдом 

/////////////////////////////////////Set GPRS baud rate/////////////////////
      mySerial.begin(19200);  
ну а далее уже в void loop-e идет отправка смс
 

if(currentMillis - previousMillis_gsm > 30000)   //every xx seconds send status sms
      {      
          //mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
          //delay(100);
         // mySerial.println("AT + CMGS = \"+7920*******\"");//send sms message, be careful need to add a country code before the cellphone number
         // delay(100);
         // mySerial.print("A test message!");//the content of the message
         // mySerial.print("kzfghg");//the content of the message
         // mySerial.println("x");
         // delay(100);
         // mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
         // delay(100);
          //mySerial.println();
      }

собственно у меня оно пока закомменчено потому как один раз проверил, работает.. разберусь с набором переменных к отправке буду дальше этот кусок править. а пока каждые 30 секунд отправка смс как то разорительно.., ах да, чтобы работаело для именно этого куска нужно в самое начало, еще до void setup-а добавить строку

unsigned long previousMillis_gsm = 0; 

и еще надо смотреть длину сообщения. по умолчанию 1 смс это 170 латинских и 70 кириллических символов если не ошибаюсь.

то что укалыдвается в 1 смс - отправляется без проблем., длинее - не проверял. 

В принципе можнопривязать не к счетчику милисекунд, а к камоту то событию.

допустим если нужно по движению - вешаете условие если датчик сработал то выполняем. 

 

 
MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

ну по сохранинию картинки с датчика вообще не беда..

собственно мое начало скетча для работы с камерой

//      ARDUCAM   ///////////////////////////////////////////////////////////////////////////////////
                  #include <ArduCAM.h>
                  #include <Wire.h>
                  #include <SPI.h>
                  #include <SD.h>
                  #include "memorysaver.h"
                  #define SD_CS 53
                  const int SPI_CS = 48;
                  #if defined (OV2640_MINI_2MP)
                  ArduCAM myCAM( OV2640, SPI_CS );
                  #else
                  ArduCAM myCAM( OV5642, SPI_CS );
                  #endif

затем перед void setup-ом отдельный цикл

////////////////////////////////////////////////////////////////////////////////
void myCAMSaveToSDFile()
      {
          char str[8];
          byte buf[256];
          static int i = 0;
          static int k = 0;
          static int n = 0;
          uint8_t temp, temp_last;
          File file;
          myCAM.flush_fifo();//Flush the FIFO
          myCAM.clear_fifo_flag();//Clear the capture done flag
          myCAM.start_capture();//Start capture
          Serial.println("star Capture");
          while(!myCAM.get_bit(ARDUCHIP_TRIG , CAP_DONE_MASK));
          Serial.println("Capture Done!");  
          k = k + 1;//Construct a file name
          itoa(k, str, 10);
          strcat(str, ".jpg");
          file = SD.open(str, O_WRITE | O_CREAT | O_TRUNC);//Open the new file
          if(! file)
              {  
                  Serial.println("open file faild");
                  return;
              }
          i = 0;
          myCAM.CS_LOW();
          myCAM.set_fifo_burst();
          temp=SPI.transfer(0x00);
          while ( (temp !=0xD9) | (temp_last !=0xFF)) //Read JPEG data from FIFO
              {
                  temp_last = temp;
                  temp = SPI.transfer(0x00);
                  if( i < 256) buf[i++] = temp;               //Write image data to buffer if not full
                  else
                      {           //Write 256 bytes image data to file
                          myCAM.CS_HIGH();
                          file.write(buf ,256);
                          i = 0;
                          buf[i++] = temp;
                          myCAM.CS_LOW();
                          myCAM.set_fifo_burst();
                      }
                  delay(0);  
              }
 
          if(i > 0) //Write the remain bytes in the buffer
              {
                  myCAM.CS_HIGH();
                  file.write(buf,i);
              }
          file.close();//Close the file
          Serial.println("CAM Save Done!");
      }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

в самом setup-е

///////////////////////////SETUP CAMERA//////////////////////////////////////////
              uint8_t vid, pid;
              uint8_t temp;
              Serial.println("ArduCAM Start!");
              pinMode(SPI_CS,OUTPUT); //set the CS as an output 
              SPI.begin();// initialize SPI:
              delay(1000);
              myCAM.write_reg(ARDUCHIP_TEST1, 0x55);//Check if the ArduCAM SPI bus is OK
              temp = myCAM.read_reg(ARDUCHIP_TEST1);
              if (temp != 0x55)
                  {
                      Serial.println("SPI1 interface Error!");
                      //while(1);
                  }
              if(!SD.begin(SD_CS))//Initialize SD Card
                  {
                      Serial.println("SD Card Error");
                  }
              else    Serial.println("SD Card detected!");
              #if defined (OV2640_MINI_2MP)//Check if the camera module type is OV2640
              myCAM.wrSensorReg8_8(0xff, 0x01);  
              myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
              myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
              if ((vid != 0x26) || (pid != 0x42)) Serial.println("Can't find OV2640 module!");
              else Serial.println("OV2640 detected.");
              #else //Check if the camera module type is OV5642
              myCAM.wrSensorReg16_8(0xff, 0x01);
              myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
              myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
              if((vid != 0x56) || (pid != 0x42)) Serial.println("Can't find OV5642 module!");
              else Serial.println("OV5642 detected.");
              #endif
              myCAM.set_format(JPEG);
              myCAM.InitCAM();
              #if defined (OV2640_MINI_2MP)
              myCAM.OV2640_set_JPEG_size(OV2640_1600x1200);
              #else
              myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
              myCAM.OV5642_set_JPEG_size(OV5642_320x240);
              #endif
              ///////////////////////////////////////////////////////////////////////////////////////

и уже в loop-е

    if(currentMillis - previousMillis_cam > 120000)     //every 120 seconds take photo
      {   
        previousMillis_cam = currentMillis;
        myCAMSaveToSDFile();
      }

 

 
(по аналогии с гпрс шилдом в начале нужно добавить перерменную для счетчика миллисекунд чтобы работало)
 
если хотите чтобы от какого тодатчика срабатывала вместо счетчика  милисекунд напишите что то вроде
 
if(digitalRead(pinXX) == HIGH)     //
      {   
                myCAMSaveToSDFile();
      }

 

 

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Пока к сожалению ни фото поделки ни целиком скетч выложить не могу - собрал обрывки с работы, пока время было.. на выходных  может получится выложить

KiTS
Offline
Зарегистрирован: 09.11.2016

 MadDen_ix .

  Очень интересно будет посмотреть вашу работу. Будем ждать фотографии!Спасибо за скетчи. Будем жксперементировать, пробовать. . Модуль GSM я взял такой же как у вас, не стал заморачиваться отдельно с чипом и разводкой под него платы.

 По поводу библиотек на GSMку и камеру. Они все работают или есть какие то косячные версии с которыми код может неадекватно работать?

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

 

у вот как то так оно пока выглядит..

 

 

,блин, ктонибудь в курсе как тут картинки под спойлер прятать?

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

На GSM использовал стандартную библиотеку (IDE1.6.6)

для камеры, если не ошибаюсь, эта - https://github.com/ArduCAM/Arduino.git

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

С камерой был какой то косяк, сразу не заработала...

Если не ошибаюсь то  "из коробки" там  при компилировании IDE ругается,

чтобы заработало надо было залезть в библиотеку и строку раскомментировать с нужным типом камеры, что ли..

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015
Собственно вот тот код который конкретно сейчас залит.

 

#include "Arduino.h"
#include <Wire.h>


//      UPS       ///////////////////////////////////////////////////////////////////////////////
                  #define UPS_R1 31       // relay , on/off 220AC включить все питание, вырубать питание ВСЕГО при повышенном AC, изредка включать для мониторинга
                  #define UPS_R2 33       // relay , on/off 220AC - for 220AC-24DC power supply
                  #define UPS_MON A9      // pin for digital multimeter, monitoring 220AC
                  int UPS_MON_read = 0; // raw data from A9
                  byte R1;                //
                  byte R2;                //

//      GSM       ///////////////////////////////////////////////////////////////////////////////
                  #include <SoftwareSerial.h>
                  #include <String.h>
                  SoftwareSerial mySerial(18, 19);
                  #define gsm_power 25
                 
//      TIME      ///////////////////////////////////////////////////////////////////////////////
                  #define DS3231_I2C_ADDRESS 0x68
                  byte decToBcd(byte val)// Convert normal decimal numbers to binary coded decimal
                    {
                      return( (val/10*16) + (val%10) );
                    }
                  byte bcdToDec(byte val)// Convert binary coded decimal to normal decimal numbers
                    {
                  return( (val/16*10) + (val%16) );
                    }
                  int h;

//      LED       ////////////////////////////////////////////////////////////////////////////////
                  #define LED_brightness 2 //pwm 2
                  #define LED_power 22 //digital 22
                  byte statusLED   ;

// include the SD library:
//#include <SPI.h>
//#include <SD.h>
//50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)
//const int chipSelect = 53;

//      ARDUCAM   ///////////////////////////////////////////////////////////////////////////////////
                  #include <ArduCAM.h>
                  #include <Wire.h>
                  #include <SPI.h>
                  #include <SD.h>
                  #include "memorysaver.h"
                  #define SD_CS 53
                  const int SPI_CS = 48;
                  #if defined (OV2640_MINI_2MP)
                  ArduCAM myCAM( OV2640, SPI_CS );
                  #else
                  ArduCAM myCAM( OV5642, SPI_CS );
                  #endif

//      COUNTERS  ////////////////////////////////////////cucle
                  unsigned long currentMillis;
                  unsigned long previousMillis_ups = 0;
                  unsigned long previousMillis_cam = 0;                // millis counters
                  unsigned long previousMillis_led = 0;
                  unsigned long previousMillis_gsm = 0;
/////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void myCAMSaveToSDFile()
      {
          char str[8];
          byte buf[256];
          static int i = 0;
          static int k = 0;
          static int n = 0;
          uint8_t temp, temp_last;
          File file;
          myCAM.flush_fifo();//Flush the FIFO
          myCAM.clear_fifo_flag();//Clear the capture done flag
          myCAM.start_capture();//Start capture
          Serial.println("star Capture");
          while(!myCAM.get_bit(ARDUCHIP_TRIG , CAP_DONE_MASK));
          Serial.println("Capture Done!");  
          k = k + 1;//Construct a file name
          itoa(k, str, 10);
          strcat(str, ".jpg");
          file = SD.open(str, O_WRITE | O_CREAT | O_TRUNC);//Open the new file
          if(! file)
              {  
                  Serial.println("open file faild");
                  return;
              }
          i = 0;
          myCAM.CS_LOW();
          myCAM.set_fifo_burst();
          temp=SPI.transfer(0x00);
          while ( (temp !=0xD9) | (temp_last !=0xFF)) //Read JPEG data from FIFO
              {
                  temp_last = temp;
                  temp = SPI.transfer(0x00);
                  if( i < 256) buf[i++] = temp;               //Write image data to buffer if not full
                  else
                      {           //Write 256 bytes image data to file
                          myCAM.CS_HIGH();
                          file.write(buf ,256);
                          i = 0;
                          buf[i++] = temp;
                          myCAM.CS_LOW();
                          myCAM.set_fifo_burst();
                      }
                  delay(0);  
              }
 
          if(i > 0) //Write the remain bytes in the buffer
              {
                  myCAM.CS_HIGH();
                  file.write(buf,i);
              }
          file.close();//Close the file
          Serial.println("CAM Save Done!");
      }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////





/////////////////////////////////////////////////////////////////////////////////// УСТАНОВКА
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()                                      
  {
      
      Wire.begin();
      Serial.begin(115200);
     
      ////////////////////////////////////// set the initial time here/////////////
      // DS3231         seconds, minutes, hours, day, date, month, year
      // setDS3231time(00,        25,       14,   1,    14,   10,   16);
      /////////////////////////////////////////////////////////////////////////////

      ///////////////////////////////////////Turn ON GSM Shield////////////////////
      pinMode(gsm_power, OUTPUT)          ;
      digitalWrite (gsm_power, HIGH);
      delay (3000)        ;
      digitalWrite (gsm_power, LOW);
      /////////////////////////////////////Set GPRS baud rate/////////////////////
      mySerial.begin(19200);                 
      ////////////////////////////////////////////////////////////////////////////      
      
      ///////////////////////////////////// Turn OFF Backlight/////////////////////
      pinMode(LED_power, OUTPUT)          ;
      digitalWrite (LED_power, LOW);
      pinMode(LED_brightness, OUTPUT)          ;
      digitalWrite(LED_brightness, LOW);
      /////////////////////////////////////////////////////////////////////////////

      /////////////////////////// UPS ///////////////////////////////////
      pinMode(UPS_R1, OUTPUT)          ;
      digitalWrite (UPS_R1, LOW);
      pinMode(UPS_R2, OUTPUT)          ;
      digitalWrite (UPS_R2, LOW);
      pinMode(UPS_MON, INPUT)          ;
      //digitalWrite (UPS_MON, LOW);
      //pinMode (UPS_MON, INPUT_PULLUP);
      R1 = 0;
      ///////////////////////////////////////////////////////////////////

              ///////////////////////////SETUP CAMERA//////////////////////////////////////////
              uint8_t vid, pid;
              uint8_t temp;
              Serial.println("ArduCAM Start!");
              pinMode(SPI_CS,OUTPUT); //set the CS as an output 
              SPI.begin();// initialize SPI:
              delay(1000);
              myCAM.write_reg(ARDUCHIP_TEST1, 0x55);//Check if the ArduCAM SPI bus is OK
              temp = myCAM.read_reg(ARDUCHIP_TEST1);
              if (temp != 0x55)
                  {
                      Serial.println("SPI1 interface Error!");
                      //while(1);
                  }
              if(!SD.begin(SD_CS))//Initialize SD Card
                  {
                      Serial.println("SD Card Error");
                  }
              else    Serial.println("SD Card detected!");
              #if defined (OV2640_MINI_2MP)//Check if the camera module type is OV2640
              myCAM.wrSensorReg8_8(0xff, 0x01);  
              myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
              myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
              if ((vid != 0x26) || (pid != 0x42)) Serial.println("Can't find OV2640 module!");
              else Serial.println("OV2640 detected.");
              #else //Check if the camera module type is OV5642
              myCAM.wrSensorReg16_8(0xff, 0x01);
              myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
              myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
              if((vid != 0x56) || (pid != 0x42)) Serial.println("Can't find OV5642 module!");
              else Serial.println("OV5642 detected.");
              #endif
              myCAM.set_format(JPEG);
              myCAM.InitCAM();
              #if defined (OV2640_MINI_2MP)
              myCAM.OV2640_set_JPEG_size(OV2640_1600x1200);
              #else
              myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
              myCAM.OV5642_set_JPEG_size(OV5642_320x240);
              #endif
              ///////////////////////////////////////////////////////////////////////////////////////


  }

//////////////////////////////////////////////////////////////////////////////////////
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)
  {                                               // sets time and date data to DS3231
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0);                              // set next input to start at the seconds register
      Wire.write(decToBcd(second));               // set seconds
      Wire.write(decToBcd(minute));               // set minutes
      Wire.write(decToBcd(hour));                 // set hours
      Wire.write(decToBcd(dayOfWeek));            // set day of week (1=Sunday, 7=Saturday)
      Wire.write(decToBcd(dayOfMonth));           // set date (1 to 31)
      Wire.write(decToBcd(month));                // set month
      Wire.write(decToBcd(year));                 // set year (0 to 99)
      Wire.endTransmission();
  }

////////////////////////////////////////////////////////////////////////////
void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
  {
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0); // set DS3231 register pointer to 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
    // request seven bytes of data from DS3231 starting from register 00h
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
  }

//////////////////////////////////////////////////////////////////////////////////
void displayTime()
  {
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);  // retrieve data from DS3231
    Serial.print(hour, DEC);                                                          // send it to the serial monitor
    Serial.print(":");                                                                // convert the byte variable to a decimal number when displayed
    if (minute<10)
      {
        Serial.print("0");
      }
    Serial.print(minute, DEC);
    Serial.print(":");
    if (second<10)
      {
        Serial.print("0");
      }
    Serial.print(second, DEC);
    Serial.print(" ");
    Serial.print(dayOfMonth, DEC);
    Serial.print("/");
    Serial.print(month, DEC);
    Serial.print("/");
    Serial.print(year, DEC);
    Serial.print(" Day of week: ");
    switch(dayOfWeek)
      {
      case 1:
          Serial.println("Sunday");
        break;
      case 2:
          Serial.println("Monday");
        break;
      case 3:
          Serial.println("Tuesday");
        break;
      case 4:
          Serial.println("Wednesday");
        break;
      case 5:
          Serial.println("Thursday");
        break;
      case 6:
          Serial.println("Friday");
        break;
      case 7:
          Serial.println("Saturday");
        break;
      }
  }
/////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()                                       //ОСНОВНОЙ ЦИКЛ 
  { 
      currentMillis = millis();

      

      if(currentMillis - previousMillis_ups > 23)     //every 23 mseconds
      {
      previousMillis_ups = currentMillis;
      /////////////////////////// UPS ///////////////////////////////////
      UPS_MON_read = (analogRead(UPS_MON))/3.45; //read raw data 0..1023 / 0..5v    230v=803  240v=828   ??0v=414??
      Serial.print("UPS_MON_read =" );                     
      //Serial.println(UPS_MON_read);
    
      if (UPS_MON_read < 150) R1 = 0; // lower 150V AC
      if (UPS_MON_read > 240) R1 = 0; // over 240V AC
      else R1 = 1;         //normal 

      if (R1 == 1) digitalWrite (UPS_R1, HIGH); // нужна задержка перед включением, секунд ???сколько???
      else digitalWrite (UPS_R1, LOW);          //чтобы не щелкали реле слишком часто
      
      
      Serial.println(UPS_MON_read);
            
      }
      

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if(currentMillis - previousMillis_cam > 120000)     //every 120 seconds take photo
      {   
        previousMillis_cam = currentMillis;
        myCAMSaveToSDFile();
      }
          
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(currentMillis - previousMillis_led > 60000)        //every 60 seconds check time for backlight 
      {
          previousMillis_led = currentMillis;
          
          displayTime();
          byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
          readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          h = hour;
          Serial.println(h);
         
          if (h < 15)  statusLED = 0;
          if (h == 15) statusLED = 0;
          if (h == 16) statusLED = 0;
          if (h == 17) statusLED = 0;
          if (h == 18) statusLED = 0;
          if (h == 19) statusLED = 0;
          if (h == 20) statusLED = 1;
          if (h == 22) statusLED = 0;
          if (h > 22)  statusLED = 0;
          if (statusLED == 1) 
            {
              digitalWrite (LED_power, HIGH);
              analogWrite(LED_brightness, 255);
            }
          else 
            {
              digitalWrite (LED_power, LOW);
              analogWrite(LED_brightness, 0);
            }
          
  
      }

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(currentMillis - previousMillis_gsm > 30000)   //every xx seconds send status sms
      {
         
         //mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
         //delay(100);
         // mySerial.println("AT + CMGS = \"+7920*******\"");//send sms message, be careful need to add a country code before the cellphone number
         // delay(100);
         // mySerial.print("A test message!");//the content of the message
         // mySerial.print("kzfghg");
         // mySerial.println("x");
         // delay(100);
         // mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
         // delay(100);
         //mySerial.println();
          
      }
    
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                                                  
                                               
  }                                                     
                                               

Идет время, переодически сохраняется фото,  мониторит состояние сети. включает, выключает подсветку.

нужно довесить дотчик освещени и датчик температуры, поставить автомат и варистор, дособрать инвертор. 

и можно будет подбирать корпус.

 

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

если нужна  железная часть отвечающая за мониторинг 220V то вот она

вообще была идея поставить диодного моста предохранитель на мало-мало ампер  и варистор и выкинуть стабилитрон.. но думаю что т.к. будет стоять варистор и автомат на входе, еще до диодного моста, то и так сойдет. 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

MadDen_ix пишет:
если нужна  железная часть отвечающая за мониторинг 220V то вот она
Ужос нах, попробуй лизнуть контактный рельс в метро...

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

Ну, если ты такой умный, и это такой ужас, почему бы тебе не предложить для начала реешение лучше, а уже потом нах"ами кидатся?

alex_r61
Offline
Зарегистрирован: 20.06.2012

Про опторазвязку слышали? Я себе  взял sdm220 чтобы с таким "мониторингом" не связываться.

Ivan
Offline
Зарегистрирован: 21.08.2011

Если бы данные поступали в телефон (например Android), то вообще интересно было бы, и от туда же управлялось.

 

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

2alex_r61

что то мне подсказывает что ваш SDM220 стоит как все мое железо вместе взятое... и на кой он такой нужен?

тем более что напряжение питания выше 250 вольт в теории не поднимется - варистор на 250В + автомат должны вырубить все. А номиналы резисторов подобраны таким образом что 5в на пине ардуины будет только при напряжении сети 260 вольт. + стабилитрон должен погасить все что будет выше 5 вольт.

ах да, в програмной части пока отсутствует, но ардуина должна будет отсекать внешнее питание и на диодный мост в том числе при помощи реле при достижении значения выше 240 вольт....

а с учетом того что весь этот колхоз собран из того что было под рукой, и его фактическая стоимость равна нулю, сравнение с сдм220 тут вообще не уместно.

окей. опторазвязка так опторазвязка, скажите тогда как реализовать измерение текущего напряжения в сети с точность +-2В при помощи опторазвязки с использованием ширпотребной элементной базы. внесем изменение в проект, вам спасибо скажем.

2Ivan

 ну кто ж мешает допилить все до такого состояния? 

пока что хотелось бы заставить  работать без ошибок то что есть и допилить тот функционал который нужен

(датчик движения, температуры, контроль яркости внешнего освещения).

когда все это будет работать без проблем, можно будет и о модернизации до вашего предложения подумать.

собственно первое что на ум приходит - прикрутить что то вроде BLYNK.cc, но пока для себя такой необходимости не вижу.

 

alex_r61
Offline
Зарегистрирован: 20.06.2012

Это пример, а не сравнение. А что дороже, колхоз или безопасность каждый сам решает.

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

2alex_r61

если уж вы так о безопасности волнуетесь, поставьте РНПП в входной щиток в квартиру, и гарантирована убережете не только свой проект но и все оборудование в квартире вместе взятое. по деньгам тож на тож выйдет, а пользы значительно больше.

alex_r61
Offline
Зарегистрирован: 20.06.2012

У ATMEL есть не дорогое решение AVR465,  только опторазвязку на интерфейс.

KiTS
Offline
Зарегистрирован: 09.11.2016

  MadDen_ix

  Да, идея мониторить напряжение в сети очень кстати! Думал тоже над ней. В ближайшее время буду реализовывать железячную часть и код смотреть с выложенной вами информацией( рассыпуха). Надеюсь что все получится.

 по поводу мониторнга напряжение в сети. Есть еще какие то варианты реализации. Интересно было бы еще конечно при превышении некоторого порога напряжения переключить устройство неким коммутатором на аккумулятор, пока напряжение не нормализуется. При достижении нормального уровня напряжения переключать обратно на сеть. Возможно и правда имеется что то вроде оптопары- готовое решение?

 

KiTS
Offline
Зарегистрирован: 09.11.2016

 MadDen_ix  и  alex_r61

 Нашел интересную информацию по поводу мониторинга наличия напряжения в сети.Интересно ваше мнение по этому поводу. Реально рабочие схемы и какую выбрать?

 http://www.microchip.su/showthread.php?t=16293

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

оптопарой амплитуду не замерить никак. только наличие и частота.

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

2KiTS.

маленькая зеленая плата в правом верхнем углу для меня оно и есть.

сосбственно вот примерная схема (заранее за качество извиняюсь, хреновый из меня художник..)

собственно моя задумка - включаем реле 1 и 2 по умолчанию разомкнуты. сключаем реле 2.

напряжение идет на диодный мост. мониторим напругу ардуиной - если ардуина считает что в норме - включает реле 1 и напруга идет уже на блок питания.

если нет, выключаем реле 2, ждем сколько то минут и снова пробуем.

для защиты диодного моста от перенапряжения стоит варистор и предохранитель.

предохранитель нужен быстродействующий, хотя я хочу поставить автомат. варистор в моем варианте на 250В.

Если в сети совсем все плохо - варистор вырубает предохранитель и без замены оного питание уже никак не включить.

можно перед мостом поставить понижающий трансформатор и пересчитать номиналы резисторов, скажем вольт до 380, варистор на 380В, запас будет больше.

релюха каждая управляется через  транзистор + стоит диод от обратного тока катушки...

в принципе где то была схема на чипдипе простого 3 порогового индикатора напряжения. при наличии  горит 1 светодиод, при превышении какого то значения загорается второй светодиод, и при превышении второго порога загорается третий светодиод. вместо светодиода воткнуть оптрон, 3 пина ардуины. этого хватит чтобы определить напряжение в норме, высокое или повышенное, но только сам факт, без измерения текущего значения..

рассыпуху не обязательно такую же.. я собирал из того что под рукой оказалось.

по той ссылке что вы предложили человеку нужно было мониторить наличие напряжения а не его величину.

собственно если вам нужно только переключать при достижении определенного порога  - тогда да, на оптроне можно сделать. расчитать элементы только для нужного вам порога.

UPD

а собственно ловите http://www.chipdip.ru/video/id000489831/

там на видео вторая что ли схема, сам хотел что то подобное собрать. только если честно, руки не дошли, так что работоспособность целиком на совести чипдипа

 

AmateurFF
Offline
Зарегистрирован: 02.02.2015

С целью безопасности я бы вместо сопротивления 5,1 мОм ставил 2 сопротивления в каждое плечо моста.

alex_r61
Offline
Зарегистрирован: 20.06.2012

AmateurFF пишет:

С целью безопасности я бы вместо сопротивления 5,1 мОм ставил 2 сопротивления в каждое плечо моста.

Для безопасности можно взять трансформатор тока и маломощный тр-р напряжения, а нужное напряжение на АЦП получить через делители. Тогда будет полный мониторинг сети с развязкой.

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

2AmateurFF

в принципе да, можно туда по мегаому воткнуть, а смысл если перед мостом стоит варистор?

AmateurFF
Offline
Зарегистрирован: 02.02.2015

Варистор не защитит того, кто прикоснется к прибору. Фаза напрямую (через мост) соединена с GND! 

MadDen_ix
MadDen_ix аватар
Offline
Зарегистрирован: 20.10.2015

а нефиг как было сказано лезть куда не надо.

а если серьезно, все в изолированном корпусе. корме меня туда никто не полезет. а я не имею привычки тыкать голыми пальцами в прибор под напряжением.