Запись данных в МК

olega88
Offline
Зарегистрирован: 03.04.2012

Приветствую вас, Друзья!

Возможно ли реализовать следующее:

необходимо на обьекте установить ловушку на базе МК, которая будет контролировать срабатывание реле, и выводить его состояние в сериал монитор. Проблема в том, что ноутбук оставлять там не хочется. Можно ли записывать  в память МК события, а потом приехав подключить ноут и считать логи?

Snubist
Offline
Зарегистрирован: 18.02.2013

olega88 пишет:

Приветствую вас, Друзья!

Возможно ли реализовать следующее:

необходимо на обьекте установить ловушку на базе МК, которая будет контролировать срабатывание реле, и выводить его состояние в сериал монитор. Проблема в том, что ноутбук оставлять там не хочется. Можно ли записывать  в память МК события, а потом приехав подключить ноут и считать логи?

Можно подключить SD карту.

http://arduino.ru/forum/programmirovanie/sd-karta

olega88
Offline
Зарегистрирован: 03.04.2012

А что, идея.. Спасибо ))

olega88
Offline
Зарегистрирован: 03.04.2012

даа, почитал за эту тему... для меня это не подьёмно..(((

maksim
Offline
Зарегистрирован: 12.02.2012

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

Snubist
Offline
Зарегистрирован: 18.02.2013

Не подьемно что?

Стоимость?

olega88
Offline
Зарегистрирован: 03.04.2012

да, время обязательно. Дело не в стоимости, а сложности.

olega88
Offline
Зарегистрирован: 03.04.2012

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

вдруг на одном из входов появилось 5 В-  0 0 0 0 0 0 0 1

вдруг ещё на оном - 0 0 0 0 1 0 0 1, и т.д.

то есть программа постоянно опрашивает входы, и при изменении их состояния записывает на карту их текущее, извините, состояние. Сам програмировать не умею, надеюсь на вашу помощь))

 

maksim
Offline
Зарегистрирован: 12.02.2012

И?

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

И?

Я так понимаю нужно изменить эту часть кода из примера

 for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ","; 
    }

не понимаю как сделать

step962
Offline
Зарегистрирован: 23.05.2011

В приведенном участке кода обрабатываются не 8 цифровых входов (а с каких еще получать логические уровни?), а 4 аналоговых.

И на выводе должно получаться что-то вроде

125,543,1023,0 - и уж никак не 0 0 0 0 0 0 0 0

Поэтому можно повторить вопрос Максима - И?

olega88
Offline
Зарегистрирован: 03.04.2012

step962 пишет:

В приведенном участке кода обрабатываются не 8 цифровых входов (а с каких еще получать логические уровни?), а 4 аналоговых.

И на выводе должно получаться что-то вроде

125,543,1023,0 - и уж никак не 0 0 0 0 0 0 0 0

Поэтому можно повторить вопрос Максима - И?

на данный момент код выглядит так (подглядел у Джереми Блюма)

#include <SD.h>

const int chipSelect = 10;
int pin1 = 1;
int pin2 = 2;
int pin3 = 3;
int pin4 = 4;
int pin5 = 5;
int pin6 = 6;
int pin7 = 7;
int pin0 = 0;
long time = 1;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; 
  }


  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(4, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

 File logFile = SD.open("datalog.csv", FILE_WRITE);  
 if (logFile)
  {
    logFile.println(" , , , , , , , ,");
    String header = "Time, Kv, 1c, 1c1, FECin, FECout, 51-45, H6-17, pp/pm";
    logFile.println(header);
    logFile.close();
    
    Serial.println(header);
  }  
  
  else {
    Serial.println("error opening datalog.csv");
  } 

}

void loop()
{
 int pin1_level = digitalRead(pin1);
 int pin2_level = digitalRead(pin2);
 int pin3_level = digitalRead(pin3);
 int pin4_level = digitalRead(pin4);
 int pin5_level = digitalRead(pin5);
 int pin6_level = digitalRead(pin6);
 int pin7_level = digitalRead(pin7);
 int pin0_level = digitalRead(pin0);

 String dataString = String(time) + ", " + String(pin1_level) + ", " + String(pin2_level) + ", " + String(pin3_level) + ", " + String(pin4_level) + ", " + String(pin5_level) + ", " + String(pin6_level) + ", " + String(pin7_level) + ", " + String(pin0_level);
 File logFile = SD.open("datalog.csv", FILE_WRITE);
 if (logFile)
 {
   logFile.println(dataString);
   logFile.close();
   Serial.println(dataString);
 }
 else
 {
   Serial.println("Couldn't open log file");
 }
 time++;
 delay(5000);
 }

сейчас проблема в том, что данные в виде 0 0 0 0 0 0 0 0 записываются в одну ячейку .csv файла, а не каждая позиция в своё поле. А также вывод происходит постоянно, а нужно, только при изменении состояния какого либо вывода. А так остальное работает и записывает. жду ваших "И"

maksim
Offline
Зарегистрирован: 12.02.2012
void loop()
{
  int pin1_level = digitalRead(pin1);
  if(pin1_level != pin1_level_prev)
  {
    pin1_level_prev = pin1_level;
    String dataString = String(time) + ", " + String(pin1_level);
    File logFile = SD.open("datalog.csv", FILE_WRITE);
    if (logFile)
    {
      logFile.println(dataString);
      logFile.close();
      Serial.println(dataString);
    }
    else
    {
      Serial.println("Couldn't open log file");
    }
    time++;
  }
}

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

olega88
Offline
Зарегистрирован: 03.04.2012

Попробывал Ваш код. Сначала компилятор ругнулся 'pin1_level_prev' was not declared in this scope. Я добавил строчку

int pin1_level_prev;

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

 

maksim
Offline
Зарегистрирован: 12.02.2012

Куда вы ее добавили? 

void loop()
{
  int pin1_level = digitalRead(pin1);
  static int pin1_level_prev;
  if(pin1_level != pin1_level_prev)
  {
    pin1_level_prev = pin1_level;
    String dataString = String(time) + ", " + String(pin1_level);
    File logFile = SD.open("datalog.csv", FILE_WRITE);
    if (logFile)
    {
      logFile.println(dataString);
      logFile.close();
      Serial.println(dataString);
    }
    else
    {
      Serial.println("Couldn't open log file");
    }
    time++;
  }
}

 

olega88
Offline
Зарегистрирован: 03.04.2012

в loop. C последним вариантом также. За пару секунд наколбасило цифирек на 7 kb, и все ряды в одни ячейки

olega88
Offline
Зарегистрирован: 03.04.2012

вместо запятой поставил точку с запятой

String dataString = String(time) + "; " + String(pin1_level);

начал раскидывать по ячейкам)))

 

maksim
Offline
Зарегистрирован: 12.02.2012

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

olega88
Offline
Зарегистрирован: 03.04.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

Можно и на землю GND и на питание +5V

olega88
Offline
Зарегистрирован: 03.04.2012

хм.. заработало.. но есть странность. Подключил пин на землю через резик 10кОм.  Я так думал, что дигиталРид прочитает лог 0, а у меня на оборот 1.. при подтяжке на плюс, тоже выдаёт единицу..

maksim
Offline
Зарегистрирован: 12.02.2012

Такого не бывает. Значит что-то не так делаете.

olega88
Offline
Зарегистрирован: 03.04.2012

попробовал заменить МК, на новом при заливке пишет avrdude stk500_getsync() not in sync resp=0x00

и ваще ничего неработает. возвращаю обратно старый, всё как прежде...

 

olega88
Offline
Зарегистрирован: 03.04.2012

ребятушки, что делать то? сбился с ног.. весь гугл перелопатил.На  "родную" атмегу 328р прошивается любой код, а на новые (2 штуки) не хочет..  выдаёт:

 
Binary sketch size: 1 084 bytes (of a 32 256 byte maximum)
D:\masterskaja\arduino-1.0.2\hardware/tools/avr/bin/avrdude -CD:\masterskaja\arduino-1.0.2\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM3 -b115200 -D -Uflash:w:C:\Users\olega\AppData\Local\Temp\build1342245560610073067.tmp\Blink.cpp.hex:i

avrdude: Version 5.11, compiled on Sep  2 2011 at 19:38:36
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "D:\masterskaja\arduino-1.0.2\hardware/tools/avr/etc/avrdude.conf"

         Using Port                    : \\.\COM3
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: Send: 0 [30]   [20]
avrdude: Send: 0 [30]   [20]
avrdude: Send: 0 [30]   [20]
avrdude: Recv:
avrdude: stk500_getsync(): not in sync: resp=0x00

avrdude done.  Thank you.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Прям уж весь гугл.... В поиске по сайту набираете "bootloader".

olega88
Offline
Зарегистрирован: 03.04.2012

Максим, набрал, тёмный лес..((

olega88
Offline
Зарегистрирован: 03.04.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

Ну так тогда в чем проблема? Значит у вас все работает.

У вас в двух МК (которые не шьются) не прошит bootloader.

olega88
Offline
Зарегистрирован: 03.04.2012

теперь дошло, спасибо

olega88
Offline
Зарегистрирован: 03.04.2012

вычитал, что ДС1307 считает только с точностью до секунды.. подстава.. в моём задании необходима точность до 1 мс, чем можно заменить микросхему? может существуют какие-то програмные ходы?

olega88
Offline
Зарегистрирован: 03.04.2012

необходимо исследовать импульсы такого вида

Snubist
Offline
Зарегистрирован: 18.02.2013

 

olega88 пишет:

 чем можно заменить микросхему? 

DS3232 и вообще их серия DS32

olega88
Offline
Зарегистрирован: 03.04.2012

Snubist пишет:

 

olega88 пишет:

 чем можно заменить микросхему? 

DS3232 и вообще их серия DS32

ай я яй.. уже изготовил печатку, в серии ДС32 не нашел подходящего под дип8, с выводами соответствующими с 1307