Me podrian ayudar el servomotor no hace lo que dicta el programa

El servomotor si hace lo que le planteo en el codigo pero despues de hacerlo empieza a alternar muy rapido para despues volver a cumplir con el programa

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Servo.h>
#include <TinyGPS.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

// Declaración de objetos y variables globales
TinyGPS gps;
SoftwareSerial serialgps(11, 10);
Servo myservo;

#define DHTPIN 22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

float humedad;
float temperatura;
float latitude;

char pulsacion;
int contador = 1;
int posInicial = 0;
int posFinal = 180;
int tiempoMovimiento = 2000;
int tiempoEspera = 5000;
unsigned long tiempoAccion = 0;
int estado = 0;

int relay = 23;
int relay2 = 24;
int relay3 = 25;

int tiempoTotal = 1000;
unsigned long tiempoInicio = 0;
boolean enMovimiento = false;

const int chipSelect = 53;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
bool guardarDatos = false;

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'},
};
byte rowPins[ROWS] = {30, 31, 32, 33};
byte colPins[COLS] = {34, 35, 36, 37};
Keypad Teclado1 = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
lcd.init();
lcd.backlight();
pinMode(12, OUTPUT);

Serial.begin(9600);
dht.begin();
myservo.attach(48);
myservo.write(posInicial);
tiempoAccion = millis();
estado = 1;

pinMode(relay, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);

Serial.begin(9600);
serialgps.begin(9600);
pinMode(chipSelect, OUTPUT);
Serial.print("Inicializando SD...");

if (!SD.begin(chipSelect)) {
Serial.println("Fallo o tarjeta no presente");
return;
}
Serial.println("Tarjeta SD OK");
}

void loop() {
humedad = dht.readHumidity();
temperatura = dht.readTemperature();

if (isnan(humedad) || isnan(temperatura)) {
Serial.println("Error al leer el sensor DHT!");
return;
}

if (temperatura < 30) {
digitalWrite(relay, HIGH);
}

if (temperatura > 32) {
digitalWrite(relay, LOW);
}

if (humedad > 75) {
digitalWrite(relay2, LOW);
}

if (humedad < 76) {
digitalWrite(relay2, HIGH);
}

digitalWrite(relay3, LOW);

unsigned long tiempoActual = millis();

switch (estado) {
case 0:
if (tiempoActual - tiempoAccion >= tiempoEspera) {
estado = 1;
tiempoAccion = tiempoActual;
myservo.write(posFinal);
}
break;

case 1:
  if (tiempoActual - tiempoAccion >= tiempoMovimiento) {
    estado = 2;
    tiempoAccion = tiempoActual;
    myservo.write(posInicial);
  }
  break;

case 2:
  if (tiempoActual - tiempoAccion >= tiempoEspera) {
    estado = 1;
    tiempoAccion = tiempoActual;
    myservo.write(posFinal);
  }
  break;

}

String dataString = "";
while (serialgps.available()) {
int c = serialgps.read();
if (gps.encode(c)) {
float latitude, longitude;
gps.f_get_position(&latitude, &longitude);
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);

  File dataFile = SD.open("DATOSGPS.txt", FILE_WRITE);

  if (dataFile) {
    dataFile.print((millis() / 5000));
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.print("Latitud: ");
    dataFile.print(latitude, 5);
    dataFile.print(" ");
    dataFile.print(",");
    dataFile.print("Longitud: ");
    dataFile.print(longitude, 5);
    dataFile.print(" ");
    dataFile.print(",");
    dataFile.print("Velocidad en Km/Hr: ");
    dataFile.print(gps.f_speed_kmph());
    dataFile.print(" ");
    dataFile.print(",");
    dataFile.print("Satelites encontrados: ");
    dataFile.print(gps.satellites());
    dataFile.print(" ");
    dataFile.print(",");
    dataFile.print("Fecha: ");
    dataFile.print(day, DEC);
    dataFile.print(" ");
    dataFile.print("/");
    dataFile.print(month, DEC);
    dataFile.print(" ");
    dataFile.print("/");
    dataFile.print(year, DEC);
    dataFile.print(" ");
    dataFile.print(",");
    dataFile.print("Numero de dato");
    dataFile.close();
    guardarDatos = false;
    Serial.println(dataString);
  } else {
    Serial.println("Error abriendo DATOSGPS.txt");
  }
}

}

pulsacion = Teclado1.getKey();
if (pulsacion != 0) {
lcd.clear();
}

if (contador == 5) {
menu_5();
accion_5();
}

if (contador == 4) {
menu_4();
accion_4();
}

if (contador == 3) {
menu_3();
accion_3();
}

if (contador == 2) {
menu_2();
accion_2();
}

if (contador == 1) {
menu_1();
accion_1();
}
}

void menu_1() {
lcd.setCursor(0, 0);
lcd.print("Welcome");
lcd.setCursor(0, 1);
lcd.print("Operator");
lcd.setCursor(10, 1);
lcd.print("MAS >*");
}

void accion_1() {
if (pulsacion == '*') contador = 2;
}

void menu_2() {
lcd.setCursor(0, 0);
lcd.print("Humd >1 ");
lcd.setCursor(8, 0);
lcd.print("Temp >2");
lcd.setCursor(0, 1);
lcd.print("MENU >#");
lcd.setCursor(8, 1);
lcd.print("GPS >3");
}

void accion_2() {
if (pulsacion == '1') contador = 3;
if (pulsacion == '2') contador = 4;
if (pulsacion == '3') contador = 5;
if (pulsacion == '#') contador = 1;
}

void menu_3() {
lcd.setCursor(0, 0);
lcd.print("Humd ");
lcd.setCursor(5, 0);
lcd.print(humedad);
lcd.print(" %");
lcd.setCursor(0, 1);
lcd.print("MENU># <--0");
}

void accion_3() {
if (pulsacion == '#') contador = 1;
if (pulsacion == '0') contador = 2;
}

void menu_4() {
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.setCursor(6, 0);
lcd.print(temperatura);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("MENU># <--0");
}

void accion_4() {
if (pulsacion == '#') contador = 1;
if (pulsacion == '0') contador = 2;
}

void menu_5() {
lcd.setCursor(0, 0);
lcd.print("LAT ");
lcd.setCursor(4, 0);
lcd.print(latitude);
lcd.setCursor(0, 1);
lcd.print("MENU># <--0");
}

void accion_5() {
if (pulsacion == '#') contador = 1;
if (pulsacion == '0') contador = 2;
}

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Basicamente Retira " [Me podrian ayudar"
Ver en las normas punto 5.
5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYUDA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!
Edita también tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en <CODE/>

Intenta cambiar el while por un if. Es posible que si el dispositivo está en movimiento envíe continuamente nuevas coordenadas al Arduino mientras se está escribiendo en la tarjeta SD y no libere el procesador para atender al servo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.