Запись данных с акселерометра на sd карту

Leon
Offline
Зарегистрирован: 11.04.2013

Помогите пожалуста написать программу, чтобы данные снятые с акселерометра MMA7361 записывались на карту sd и в режиме реального времени эти данные с акселерометра показывались на дисплее LCD Keypad Shield и с помощью Модуля часы на чипе DS1302 были отражены дата и время записи. Вот мои комплектующие:

_ttp://www.dvrobot.ru/?show=shop&item_id=163

_ttp://www.dvrobot.ru/?show=shop&item_id=196

_ttp://www.dvrobot.ru/?show=shop&item_id=129

_ttp://www.dvrobot.ru/?show=shop&item_id=182

_ttp://www.dvrobot.ru/?show=shop&item_id=113

Прошу помогите пожалуйста!!!!

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

Чем вам помочь-то? Что не получается? Или помочь означает написать за вас код? Ну тогда вы не в ту ветку отписались, добро пожаловать - Ищу исполнителя. Могу "помочь", но возмездно.

Leon
Offline
Зарегистрирован: 11.04.2013

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

#include <Adafruit_GFX.h>
#include <ArduinoRobot.h>
#include <Arduino_LCD.h>
#include <Compass.h>
#include <EasyTransfer2.h>
#include <EEPROM_I2C.h>
#include <Fat16.h>
#include <Fat16Config.h>
#include <Fat16mainpage.h>
#include <Fat16util.h>
#include <FatStructs.h>
#include <Multiplexer.h>
#include <SdCard.h>
#include <SdInfo.h>
#include <SPI.h>
#include <Squawk.h>
#include <SquawkSD.h>
#include <Wire.h>
/* Datalogger 
Eric Ayars
July '10
This Arduino program controls and reads three axes from an MMA7260 3-axis
accelerometer, and writes the data to a micro-SD card.
It uses the Fat16 library by Will Greiman. Will, if you're reading this, my
hat is off to you. The deeper I get into the library the more impressed I
am by the quality of the work you did. Very nice code!
Errors will be given on the LED.
Here are those errors, in flashes:
2,1 "card.init"
2,2 "Fat16::init"
3,1 "file.open() error"
3,2 "file.close() error"
4,1 "error when trying to write header"
4,2 "error when trying to write data"
4,3 "file.sync() error"
*/
/*  User-selected values
    The following definitions can be set before sending the code to the
    Arduino, and change the datalogger's behavior.
    LOG_INTERVAL is the time in milliseconds between samples. 
    GAIN is the user-selectable range on the MMA7260 accelerometer, and 
        should be set to one of {1, 2, 4, 6}. The range for 1 is actually
        1.5, if you care about that... 
        The default value (if you set something wrong) is 6.
    DEBUG should be set to 0 for optimal data-collection speed. If set to 
        1, the Arduino sends verbose messages to the serial port about 
        everything it is doing. 
    CONVERT_VALUES should be set to 1 to have the Arduino convert raw 
        A/D integers into float SI values of acceleration. Set it to 0 if
        you would prefer the data file to contain raw A/D values.
    
    TIME_OR_BUTTON changes the stop condition for data collection. If set
        to 1, the Arduino stops after the number of milliseconds set by
        COLLECTION_MILLIS. If set to 0, it stops on a second button press.
    COLLECTION_MILLIS applies only if TIME_OR_BUTTON is set to 1, and is 
        the number of milliseconds to collect data.
*/
#define LOG_INTERVAL 100    
#define GAIN 1
#define DEBUG 0
#define CONVERT_VALUES 1
#define TIME_OR_BUTTON 0
#define COLLECTION_MILLIS 10000 
//  Definitions below this point should probably only be changed if you
//  know what you're doing.
#define LONG_INTERVAL 500   // number of mills to wait, for a longish time
#define SHORT_INTERVAL 100  // number of mills to wait, short time.
#define BUTTON 4            // BUTTON pin
#define LED 6               // LED pin
#define GS1 7               // Gain select 1 pin
#define GS2 8               // Gain select 2 pin
#define SLP 9               // Sleep pin
#define X_ACCEL 2           // x input
#define Y_ACCEL 1           // y input
#define Z_ACCEL 0           // z input
#include <Fat16.h>
#include <Fat16util.h>
unsigned long int logTime = 0;      // time of last log event
unsigned long int currentTime = 0;  // Now, with startTime subtracted
unsigned long int startTime = 0;    // When did we start collection?
int x, y, z;                        // data storage
float conversionFactor;
SdCard card;            // 'card' is of type 'SdCard'.
Fat16 file;             // 'file' is of type 'Fat16'.
boolean lastButtonState = HIGH;
boolean buttonPressed(byte button) {
    // Checks to see if the button was pressed since last check.
    boolean currentButtonState = digitalRead(button);
    boolean state;
    if (lastButtonState && !currentButtonState) {
        // Button was high, is now low. The button has been pressed.
        state = true;
    } else {
        // Not pressed.
        state = false;
    }
    lastButtonState = currentButtonState;
#if DEBUG
    Serial.println("buttonPressed()");
#endif // DEBUG
    return state;
}
void flashLED(byte count, int interval) {
    // Just what it says: it flashes the LED 'count' times for 
    // the given on/off interval each time.
    byte j;
#if DEBUG
    Serial.print("flashLED(");
    Serial.print(count, DEC);
    Serial.print(",");
    Serial.print(interval, DEC);
    Serial.println(")");
#endif //DEBUG
    for (j=0; j<count; j++) {
        digitalWrite(LED, HIGH);
        delay(interval);
        digitalWrite(LED, LOW);
        delay(interval);
    }
}
void sendError(byte errorGroup, byte errorItem) {
    // Flashes the LED count times, then pauses, then repeats. 
    // Used to tell the user what the problem is.
#if DEBUG
    Serial.print("sendError(");
    Serial.print(errorGroup, DEC);
    Serial.print(", ");
    Serial.print(errorItem, DEC);
    Serial.println(")");
#endif //DEBUG
    while (true) {
        flashLED(errorGroup, SHORT_INTERVAL);
        delay(LONG_INTERVAL/2);
        flashLED(errorItem, SHORT_INTERVAL);
        delay(LONG_INTERVAL);
    }
}
#if CONVERT_VALUES  // This function is only needed if you're converting.
float convert(int ADValue) {
    // Converts integer A/D values to float, depending on the value of 
    // conversionFactor.
    float gValue = float(ADValue - 512)*conversionFactor;
    return gValue;
}
#endif // CONVERT_VALUE
void setup(void) {
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    pinMode(GS1, OUTPUT);
    pinMode(GS2, OUTPUT);
    pinMode(SLP, OUTPUT);
    // Initialize the SD card or send the error
    if (!card.init()) sendError(2,1);
    // Locate the Fat16 volume or send the error
    if (!Fat16::init(&card)) sendError(2,2);
    // Set gain pins
    // The MMA7260 has two pins that set the gain range
    // 0 0  -> 1.5 g
    // 0 1  -> 2 g
    // 1 0  -> 4 g
    // 1 1  -> 6 g
    switch (GAIN) {
        case 1:
            digitalWrite(GS1, 0);
            digitalWrite(GS2, 0);
            conversionFactor = 0.0394775;
            break;
        case 2:
            digitalWrite(GS1, 1);
            digitalWrite(GS2, 0);
            conversionFactor = 0.0526367;
            break;
        case 4:
            digitalWrite(GS1, 0);
            digitalWrite(GS2, 1);
            conversionFactor = 0.1052734;
            break;
        default:    // 6 g range is default.
            digitalWrite(GS1, 1);
            digitalWrite(GS2, 1);
            conversionFactor = 0.1579101;
    }
    // Start asleep, to save power.
    digitalWrite(SLP, LOW);
#if DEBUG
    Serial.begin(9600);
    Serial.println("Got through setup()");
#endif //DEBUG
}   // end setup()
/* 
 *  Main Loop
 */
void loop(void) {
    // Start by waiting for the "go" button.
#if DEBUG
    Serial.println("loop, wait for button");
#endif // DEBUG
    while (!buttonPressed(BUTTON)) {
        // Button is not pressed, so just sit here slowly flashing.
        flashLED(1, LONG_INTERVAL);
    }
    /*
     * Button has been pressed now, so open/create the file.
     * The "create a new file" code below is directly from
     * Will Greiman's Fat16 examples folder. Sweet code!
     */
    char name[] = "LOGGER00.TXT";
    for (int j=0;j<100;j++) {
        name[6] = j/10 + '0';
        name[7] = j%10 + '0';
        if (file.open(name, O_CREAT | O_EXCL | O_WRITE)) break;
    }
    /* Here's how that works: 
        O_WRITE = 0x02 = 00000010
        O_CREAT = 0x10 = 00010000
        O_EXCL  = 0x20 = 00100000
       So (O_WRITE | O_CREAT | O_EXCL) = 00110010. This set of flags goes
       to the file.open() routine, and it's written so that if both 
       O_CREAT and O_EXCL are set and the file already exists, then 
       file.open() returns false.
       The for loop tries sequential LOGGERxx.CSV filenames until it finds
       one that doesn't exist, in which case it returns true and the break
       statement stops the loop. So each time you take data, it writes
       to a new filename.
    */
#if DEBUG
    for (byte j=0;j<12;j++) {
        Serial.print(name[j]);
    }
    Serial.println();
#endif // DEBUG
    if (!file.isOpen()) sendError(3,1);
    // Now write the file header
    file.writeError = false; 
#if CONVERT_VALUES
    file.println("xyz values in m/s/s");
#endif //CONVERT_VALUES
    file.println("t (s)\tx\ty\tz");
#if DEBUG
    Serial.println("t (s)\tx\ty\tz");
#endif //DEBUG
    if (file.writeError || !file.sync()) sendError(4,1);
    // File is open and header written, so give a countdown.
    for (int j=5;j>0;j--) {
        flashLED(j, SHORT_INTERVAL);
        delay(LONG_INTERVAL);
    }
    // And we're live! Turn on the LED, wake up the accelerometer.
    digitalWrite(LED, HIGH);
    digitalWrite(SLP, HIGH);
    /* 
     * Here's the data collection. There are two ways of deciding when to
     * stop: "fixed time" (TIME_OR_BUTTON = 1) or "collect until button"
     * (TIME_OR_BUTTON = 0). So start with some compiler directives that
     * put in the right bit of while stop-code for our situation.
     */
    startTime = millis();
#if TIME_OR_BUTTON
    while (millis()-startTime < COLLECTION_MILLIS) {
        // collect data for a set time.
#else
    while (!buttonPressed(BUTTON)) {
        // keep going until button is pressed.
#endif  //TIME_OR_BUTTON
        // This next bit waits around until the current time is an 
        // exact multiple of LOG_INTERVAL.
        do {
            logTime = millis();
        } while (logTime % LOG_INTERVAL);
        // Now is a good time to log data, so...
        currentTime = logTime - startTime;
        x = analogRead(X_ACCEL);
        y = analogRead(Y_ACCEL);
        z = analogRead(Z_ACCEL);
        file.print((float(currentTime) / 1000.0));
        file.print("\t");
#if CONVERT_VALUES  // We're saving converted values instead of raw, so...
        file.print(convert(x));
        file.print("\t");
        file.print(convert(y));
        file.print("\t");
        file.println(convert(z));
#else               // Here's code for saving raw values
        file.print(x);
        file.print("\t");
        file.print(y);
        file.print("\t");
        file.println(z);
#endif // CONVERT_VALUES
#if DEBUG
        Serial.print(currentTime / 1000);
        Serial.print(".");
        Serial.print(currentTime % 1000);
        Serial.print("\t");
        Serial.print(x);
        Serial.print("\t");
        Serial.print(y);
        Serial.print("\t");
        Serial.println(z);
#endif // DEBUG
        // Any problem writing?
        if (file.writeError) sendError(4,2);
    }   // end of whichever while loop is put in by the compiler.
    
    // Close file, put accelerometer back to sleep.
    if (!file.close()) sendError(3,2);
#if DEBUG
    Serial.println("close()");
#endif //DEBUG
    digitalWrite(LED, LOW);
    digitalWrite(SLP, LOW);
}   // end loop()

 

вот какие ошибки пишет:
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In constructor 'RobotControl::RobotControl()':
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'LCD_CS' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'DC_LCD' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'RST_LCD' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In member function 'void RobotControl::begin()':
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXB' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXC' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXD' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:19: error: 'MUX_IN' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:22: error: 'BUZZ' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:25: error: 'Serial1' was not declared in this scope

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Выглядит, что у вас либо не все библиотеки установлены, либо не те библиотеки что в оригинале...

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

Leon
Offline
Зарегистрирован: 11.04.2013

но там не было библиотек для скачивания. а я так понял что они их использовали из стандартного набора в папке Robot Control

Leon
Offline
Зарегистрирован: 11.04.2013

Ребят, ну помогите пожалуйста разобраться

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

Вот опять... чем вам помочь-то? Где там? Какой еще стандартный набор? Вы о чем вообще? 

"Уважаемые товарищи ученые, у меня в подвале стук. Объясните, пожалуйста, причину этого стука"

Leon
Offline
Зарегистрирован: 11.04.2013

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

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

Версия IDE у вас какая?

Leon
Offline
Зарегистрирован: 11.04.2013

1.0.5

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

   

Leon
Offline
Зарегистрирован: 11.04.2013

что вы написали у меня невидно

PASHASV
Offline
Зарегистрирован: 13.06.2013

А для DS1302 где подключенная библиотека?

Я в этом всем тоже мягко говоря "чайник". Но столкнулся вот с чем:

1. Не все библиотеки, которые нужны идут в "стандартном наборе" среды программирования.

2. Не все библиотеки, которые можно скачать корректно работают с "железом".

3. В скачанных программах (скетчах) тоже хватает ошибок.

Сам я тоже экспериментирую и с часами и с акселерометром, а также тачскрином, картридером, и пр.

Вот, в частности толковая библиотека с толковым примером для часов: http://henningkarlsen.com/electronics/download.php?f=DS1302.rar

Leon
Offline
Зарегистрирован: 11.04.2013

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

PASHASV
Offline
Зарегистрирован: 13.06.2013

А в Украину будет не дорого звонить? pashasv(собака)ukr.net