Buenas a todos los foreros. Es mi primer post ya que estoy loco intentando entender el problema y no consigo dar con él. Estoy intentando desarrollar un velocimetro que mida la velocidad por gps y me la muestre de forma analógica con un motor paso a paso y una aguja que se mueble por el tablero donde están marcadas las velocidades. Comencé haciendo el código por separado de todos los elementos y todo funcionaba pero cuando hice el código general para todo vinieron los problemas. Si conecto todo menos el módulo GPS los kilometros guardados en la SD se muestran en la pantalla oled, pero si conecto el módulo GPS me muestra que hubo un error abriendo la tarjeta SD. He mirado y remirado el codigo y siempre el mismo problema. Estoy utilizando un arduino nano .Pongo el codigo para que le echeis un vistazo:
#include <Stepper.h>
#include <SSD1306Ascii.h>
#include "SSD1306AsciiAvrI2c.h"
#include <SD.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#define rxPin 6
#define txPin 5
#define BUTTON_PIN 2
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
//GPS
SoftwareSerial neogps(rxPin,txPin);
TinyGPSPlus gps;
int pulso = 2;
//OLED
SSD1306AsciiAvrI2c oled;
File myFile;
File file;
String k_o;
int cont = 0;
bool state = false;
String leyendo = "ckm.txt";
String anterior;
const int sensorPin = A1; // seleccionar la entrada para el sensor
int sensorValue; // variable que almacena el valor raw (0 a 1023)
float value;
void leer(String archivo);
void sobrescribir(String archivo, String nuevo);
//MOTOR
Stepper myStepper(2550, 8, 9);
double v_a = 0;
double v = 0;
double mover = 0;
float recorrido = 0;
int km = 0; //leer(a.txt);
String k;
void setup()
{
//GPS
Serial.begin(9600);
neogps.begin(9600);
pinMode(pulso,OUTPUT);
Serial.println("Velocimetro");
delay(3000);
//MOTOR
myStepper.setSpeed(55);
//SD Y OLED
Serial.begin(9600);
if (!SD.begin(4))
{
Serial.println("No se pudo inicializar la SD");
return ;
}
Serial.println("inicializacion exitosa de la SD");
Serial.println(SD.exists(leyendo));
leer(leyendo);
#if RST_PIN >= 0
oled.begin(&Adafruit128x32, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x32, I2C_ADDRESS);
#endif // RST_PIN >= 0
// Call oled.setI2cClock(frequency) to change from the default frequency.
oled.setFont(X11fixed7x14);
oled.clear();
oled.print(k_o + " km");
anterior = k_o;
}
//LOOP DE GPS Y MOTOR
void loop(){
//GPS
if(gps.speed.kmph()>10)
{
recorrido = recorrido + (gps.speed.kmph()*0.00027777777777777777777777777777777777777777777777777777777777777777777777777778);
}
else
{
recorrido=recorrido;
}
if (recorrido>=1){
//sobrescribir(file,km);
km = km+1;
recorrido = 0;
}
//BOTON INTERFAZ
if(!digitalRead(BUTTON_PIN))
{
cont += 100;
state = true;
}
else if(state)
{
if(cont>=2000 && leyendo=="p.txt")
{
Serial.println("reset");
sobrescribir(leyendo, "0");
}
else if(cont>=100)
{
Serial.println("cambiar");
if(leyendo=="ckm.txt"){
leyendo = "p.txt";
}else if(leyendo=="p.txt"){
leyendo= "ckm.txt";
}
}
cont = 0;
}
anterior = k_o;
leer(leyendo);
if(anterior!=k_o)
{
oled.clear();
oled.print(k_o + " km");
}
delay(100);
boolean newData = false;
for(unsigned long start = millis(); millis() - start < 1000;)
{
while (neogps.available())
{
if (gps.encode(neogps.read()))
{
newData = true;
}
}
}
//If newData is true
if(newData == true)
{
newData = false;
print_speed();
}
else
{
Serial.print("Error de conexión\n");
v=0;
}
//MOTOR
if(v<=10)
{
v = 0;
}
else
{
mover = 21.25*(v-v_a); //hay que redondear el numero de pasos
myStepper.step(int(mover));
delay(100);
v_a = v;
}
}
void print_speed()
{
if (gps.location.isValid() == 1)
{
Serial.print(gps.speed.kmph());
Serial.print(" km/h \n");
v = gps.speed.kmph();
//Serial.println("km/h");
// Serial.print("SAT:");
// Serial.println(gps.satellites.value());
// Serial.print("ALT:");
// Serial.println(gps.altitude.meters(), 0);
}
else
{
Serial.print("Estableciendo conexión...\n");
delay(5000);
}
}
//DATOS SD
void sobrescribir(String archivo, String nuevo){
SD.remove(archivo);
file = SD.open(archivo, FILE_WRITE);
if (file){
file.print(nuevo);
file.close();
}
}
void leer(String archivo){
pinMode(BUTTON_PIN, INPUT_PULLUP);
myFile = SD.open(archivo, FILE_READ);//abrimos el archivo
if (myFile) {
k_o = "";
while (myFile.available()) {
char caracter = myFile.read();
k_o = k_o + caracter;
}
myFile.close(); //cerramos el archivo
} else {
k_o = "Error de lectura.";
}
}
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}