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;
}
