Пишем скетчи как для Ардуино так и для МК AVR (atmega128, atmega2560 и пр.) По мимо С++, пишем скрипты для VBA, 1C(внешние обработки). Проектируем принципиальные схемы TTL, высылаем как конечный продукт так и файлы для дальнейшего изготовления (Gerber) Сроки напрямую зависят от сложности проекта. Размер предоплаты и ее наличие так же зависит от объема работ. e-mail: unnnder@mail.ru сайт: www.ooosmartfarm.ru Портфолио:
Добрый день , нужно что бы данные которые сейчас записываются по кнопке, записывались каждый раз когда начинается запись в новый файл. Сколько будет стоить ? Код (C++): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулями IMU #include <TroykaIMU.h> // библиотека для работы с устройствами по SPI #include <SPI.h> // библиотека для работы с SD-картой #include <SD.h> // библиотека для работы с GPS устройством #include <TroykaGPS.h> // создаём объект класса GPS и передаём в него объект Serial1 GPS gps(Serial1); // создаём объект для работы с акселерометром Accelerometer accel; // пин светодиода #define LED_PIN 9 // пин кнопки #define BUTTON_PIN A4 // пин CS micro-sd карты #define SD_CHIP_SELECT_PIN 8 // интервал времени записи данных на карту #define INTERVAL 100 // задаём размер массива для времени, даты, широты и долготы #define MAX_SIZE_MASS 16 // массив для хранения текущего времени char time[MAX_SIZE_MASS]; // состояние записи на карту памяти bool stateRec = false ; // запоминаем текущее время long startMillis = millis(); // счётчк записи int counter = 0; void setup() { // устанавливаем светодиод в режим выхода pinMode(LED_PIN, OUTPUT); // устанавливаем кнопку в режим входа pinMode(BUTTON_PIN, INPUT_PULLUP); Serial1.begin(115200); delay(100); Serial1.write("$PMTK220,200*2C\r\n"); accel.begin(); SD.begin(SD_CHIP_SELECT_PIN); } void loop() { bool bp = false; // Фиксируем нажатие кнопки if (digitalRead(BUTTON_PIN)) { // меняем состояние «запись» / «не запись» на карту памяти stateRec = !stateRec; delay(10); // меняем состояние светодиода индикации digitalWrite(LED_PIN, stateRec); bp = true; } gps.readParsing(); if (millis() - startMillis > INTERVAL && stateRec) { // сохраняем данные GPS и акселерометра на карту памяти saveSD(bp); // запоминаем текущее время startMillis = millis(); } } // функция сохарение данных на карту памяти void saveSD(bool bp) { File dataFile = SD.open("dataGPS.csv", FILE_WRITE); if (bp){ counter=0; ; } //секундомер static unsigned long x = 0; if (bp) x = millis(); int number = ((millis() - x) / 1000) % 200; Serial.println( number); // если файл существует и открылся if (dataFile) { dataFile.print(counter++); dataFile.print("\t"); dataFile.println(number); dataFile.close(); } }
Получается сейчас запись идёт в один и тот же файл , а нужно что бы при нажатии кнопки создавался новый файл !
Порядок работы : Нажимаю кнопку , создаётся файл ,открывается , начинается запись секундомера , нажимаю кнопку, запись останавливается. Следующие нажатие кнопки будет продолжаться запись в тот же файл с конца . А нужно что бы запись начиналась в новый файл.
А он у вас вообще корректно работает? Я местами логику в скетче потерял, особенно с переменной Х. Ну да ладно вы наверное что-то типо этого хотели увидеть Код (C++): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулями IMU #include <TroykaIMU.h> // библиотека для работы с устройствами по SPI #include <SPI.h> // библиотека для работы с SD-картой #include <SD.h> // библиотека для работы с GPS устройством #include <TroykaGPS.h> // создаём объект класса GPS и передаём в него объект Serial1 GPS gps(Serial1); // создаём объект для работы с акселерометром Accelerometer accel; // char StrFile[80]; int FileNumber = 0; // пин светодиода #define LED_PIN 9 // пин кнопки #define BUTTON_PIN A4 // пин CS micro-sd карты #define SD_CHIP_SELECT_PIN 8 // интервал времени записи данных на карту #define INTERVAL 100 // задаём размер массива для времени, даты, широты и долготы #define MAX_SIZE_MASS 16 // массив для хранения текущего времени char time[MAX_SIZE_MASS]; // состояние записи на карту памяти bool stateRec = false ; // запоминаем текущее время long startMillis = millis(); // счётчк записи int counter = 0; void setup() { // устанавливаем светодиод в режим выхода pinMode(LED_PIN, OUTPUT); // устанавливаем кнопку в режим входа pinMode(BUTTON_PIN, INPUT_PULLUP); Serial1.begin(115200); delay(100); Serial1.write("$PMTK220,200*2C\r\n"); accel.begin(); SD.begin(SD_CHIP_SELECT_PIN); } void loop() { bool bp = false; // Фиксируем нажатие кнопки if (digitalRead(BUTTON_PIN)) { // меняем состояние «запись» / «не запись» на карту памяти stateRec = !stateRec; FileNumber++; delay(10); // меняем состояние светодиода индикации digitalWrite(LED_PIN, stateRec); bp = true; } gps.readParsing(); if (millis() - startMillis > INTERVAL && stateRec) { // сохраняем данные GPS и акселерометра на карту памяти saveSD(bp); // запоминаем текущее время startMillis = millis(); } } // функция сохарение данных на карту памяти void saveSD(bool bp) { sprintf (StrFile, "%s_%d.csv", "dataGPS", FileNumber); File dataFile = SD.open(StrFile, FILE_WRITE); if (bp){ counter=0; ; } //секундомер static unsigned long x = 0; if (bp) x = millis(); int number = ((millis() - x) / 1000) % 200; Serial.println( number); // если файл существует и открылся if (dataFile) { dataFile.print(counter++); dataFile.print("\t"); dataFile.println(number); dataFile.close(); } }
Да, только вот сюда вставьте итерацию Код (C++): if (millis() - startMillis > INTERVAL && stateRec) { // сохраняем данные GPS и акселерометра на карту памяти FileNumber++; saveSD(bp); // запоминаем текущее время startMillis = millis(); } а из предыдущего фрагмента уберите, и название файла лучше сократить, вместо Код (C++): sprintf (StrFile, "%s_%d.csv", "dataGPS", FileNumber); лучше Код (C++): sprintf (StrFile, "%s_%d.csv", "dGPS", FileNumber); Потому что библиотека <SD.h>, с длинными именами файлов не дружит
Спасибо Вот так получилось то что мне нужно , если поставить без условия он каждую строку данных в новый файл записывал . Код (C++): if (millis() - startMillis > INTERVAL && stateRec) { // сохраняем данные GPS и акселерометра на карту памяти if (bp){ FileNumber++; } saveSD(bp);
На ровный, бетонный пол клеим криволинейную линию , к примеру желтым скотчем, метров 50. Человек садится за руль небольшой машинки (полотер, погрузчик и т.д.) и должен ровно проехать по этой линии, чтобы она была под продольной осью "машинки" и не съезжал с нее. Требуется используя ИСКРА НЕО, SD картридер, тройка шилд, а так же любые из датчиков линий (аналоговый или цифровой, или восьмиканальный датчик линии Zelo модуль) написать скетч , чтобы устройство отслеживало вышеуказанную линию, а если с нее съезжали записывало на sd карту к примеру: 1 съезд-влево-2 секунды(время от ухода до возвращения на осевую линию), 2 съезд-право- 4 сек. По идее я в конце должен взять sd вставить в комп и прочитать эту информацию, что бы к примеру из 10 человек выбрать с минимальным количеством съездов или в последствии видеть улучшение качества езды одного и того же человека.