Запись данных в МК
- Войдите на сайт для отправки комментариев
Вс, 10/03/2013 - 10:43
Приветствую вас, Друзья!
Возможно ли реализовать следующее:
необходимо на обьекте установить ловушку на базе МК, которая будет контролировать срабатывание реле, и выводить его состояние в сериал монитор. Проблема в том, что ноутбук оставлять там не хочется. Можно ли записывать в память МК события, а потом приехав подключить ноут и считать логи?
Приветствую вас, Друзья!
Возможно ли реализовать следующее:
необходимо на обьекте установить ловушку на базе МК, которая будет контролировать срабатывание реле, и выводить его состояние в сериал монитор. Проблема в том, что ноутбук оставлять там не хочется. Можно ли записывать в память МК события, а потом приехав подключить ноут и считать логи?
Можно подключить SD карту.
http://arduino.ru/forum/programmirovanie/sd-karta
А что, идея.. Спасибо ))
даа, почитал за эту тему... для меня это не подьёмно..(((
Так же если вам нужна привязка к времени, вам понадобится таймер реального времени, например DS1307.
Не подьемно что?
Стоимость?
да, время обязательно. Дело не в стоимости, а сложности.
Подключил 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, и т.д.
то есть программа постоянно опрашивает входы, и при изменении их состояния записывает на карту их текущее, извините, состояние. Сам програмировать не умею, надеюсь на вашу помощь))
И?
И?
Я так понимаю нужно изменить эту часть кода из примера
for (int analogPin = 0; analogPin < 3; analogPin++) { int sensor = analogRead(analogPin); dataString += String(sensor); if (analogPin < 2) { dataString += ","; }не понимаю как сделать
В приведенном участке кода обрабатываются не 8 цифровых входов (а с каких еще получать логические уровни?), а 4 аналоговых.
И на выводе должно получаться что-то вроде
125,543,1023,0 - и уж никак не 0 0 0 0 0 0 0 0
Поэтому можно повторить вопрос Максима - И?
В приведенном участке кода обрабатываются не 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 файла, а не каждая позиция в своё поле. А также вывод происходит постоянно, а нужно, только при изменении состояния какого либо вывода. А так остальное работает и записывает. жду ваших "И"
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++; } }И не забываем про подтяжку выводов иначе, когда вывод никуда не подключен будете записывать в файл помехи.
Попробывал Ваш код. Сначала компилятор ругнулся 'pin1_level_prev' was not declared in this scope. Я добавил строчку
и загрузил, но воз и ныне там. Проблемы остались прежние
Куда вы ее добавили?
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++; } }в loop. C последним вариантом также. За пару секунд наколбасило цифирек на 7 kb, и все ряды в одни ячейки
вместо запятой поставил точку с запятой
начал раскидывать по ячейкам)))
В общем, не знаю что у вас там "колбасит", но если вывод подтянут и переменная pin1_level_prev объявлена как static или глобально, то запись на карту будет производиться только при измении сигнала на выводе и никак иначе.
извиняюсь, не подтянуто.. на данный момент нечем, а можно напрямую pin1 на землю для проверочки?
Можно и на землю GND и на питание +5V
хм.. заработало.. но есть странность. Подключил пин на землю через резик 10кОм. Я так думал, что дигиталРид прочитает лог 0, а у меня на оборот 1.. при подтяжке на плюс, тоже выдаёт единицу..
Такого не бывает. Значит что-то не так делаете.
попробовал заменить МК, на новом при заливке пишет avrdude stk500_getsync() not in sync resp=0x00
и ваще ничего неработает. возвращаю обратно старый, всё как прежде...
ребятушки, что делать то? сбился с ног.. весь гугл перелопатил.На "родную" атмегу 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.
Прям уж весь гугл.... В поиске по сайту набираете "bootloader".
Максим, набрал, тёмный лес..((
из всего прочитанного, я так понял у меня этот бутлоадер живее всех живых
Ну так тогда в чем проблема? Значит у вас все работает.
У вас в двух МК (которые не шьются) не прошит bootloader.
теперь дошло, спасибо
вычитал, что ДС1307 считает только с точностью до секунды.. подстава.. в моём задании необходима точность до 1 мс, чем можно заменить микросхему? может существуют какие-то програмные ходы?
необходимо исследовать импульсы такого вида
чем можно заменить микросхему?
DS3232 и вообще их серия DS32
чем можно заменить микросхему?
DS3232 и вообще их серия DS32
ай я яй.. уже изготовил печатку, в серии ДС32 не нашел подходящего под дип8, с выводами соответствующими с 1307