Rastreador solar 2 eixos, com 3 modos de operacao

Boa noite! Estou com uma certa dificuldade para realizar a mudança de modo do meu rastreador solar! O objetivo é o seguinte: com 1 botão eu pretendo fazer o arduino executar 3 códigos diferentes, sendo o primeiro o modo estaconário, o segundo o modo LDR, e o terceiro entra no modo RTC DS 1302.

A lógica é a seguinte: no modo LDR ele faz a varredura pela diferença entre os LDRs e faz o movimento dos motores de modo a posicionar o módulo em direção ao sol, (essa parte está ok). O modo RTC vai ter 12 posicoes pré determinadas, dependendo apenas da hora do dia (ESSA PARTE É O PROBLEMA), já o modo estacionário vai ficar parado em uma inclinação especifica(ESSA PARTE ESTÀ OK). A idéia por tras disso é a seguinte: a cada hora vou medir corrente e tensão no módulo, e quero comparar a eficiencia dos 3 modos distintos. Estou utilizando Arduino UNO, DVR 8825 controlador de motor de passo LDRs e DS 1302 RTC. O Código está assim por enquanto; 

#include <AccelStepper.h>
#include <ThreeWire.h>
#include <RtcDS1302.h>

// Pinos dos sensores LDR

int ldrLeftTopPin = A2; // ama
int ldrLeftBottomPin = A0; // ver
int ldrRightTopPin = A3; // lar
int ldrRightBottomPin = A1; // pre
int limiar = 20; // Valor para corrigir diferença entre os LDR's
int Vel = 500; // Velocidade do motor em passos por segudo
int MaxSpeed = 1000; // Velocidade máxima que o motor pode atingir
int Acelera = 500; // Aceleração dos motores
int modo = 0;// 0 = Estacionário, 1 = LDR, 2 = DS1302
int BUTTON_PIN = 7; // Pino do botão
const int NUM_MODOS = 3;

// Pinos dos motores de passo
#define azimuthDirPin 2
#define azimuthStepPin 3
#define elevationDirPin 4
#define elevationStepPin 5
#define motorInterfaceType 1 //Motor com dois fios para cada bobina (2 bobinas)

// Pinos RTC
#define DS1302_RST 8
#define DS1302_DAT 9
#define DS1302_CLK 10

// Instância da ligação e do RTC
ThreeWire ligacao(DS1302_DAT, DS1302_CLK, DS1302_RST);
RtcDS1302<ThreeWire> rtc(ligacao);
bool buttonWasPressed = false;
bool buttonState = false;
bool lastButtonState = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;


// Instância da classe AccelStepper para cada motor
AccelStepper azimuthStepper(motorInterfaceType, azimuthStepPin, azimuthDirPin);
AccelStepper elevationStepper(motorInterfaceType, elevationStepPin, elevationDirPin);

void setup() {
// Inicia a comunicação serial
Serial.begin(9600);
// Velocidade máxima em passos por segundo para ambos os motores
azimuthStepper.setMaxSpeed(MaxSpeed);
azimuthStepper.setAcceleration(Acelera);
elevationStepper.setMaxSpeed(MaxSpeed);
elevationStepper.setAcceleration(Acelera);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Inicia a comunicação com o RTC
rtc.Begin();
// Desabilita a proteção contra escrita para gravar a hora e data
if (rtc.GetIsWriteProtected())
{
rtc.SetIsWriteProtected(false);
}

// Se não estava rodando, começa a funcionar
if (!rtc.GetIsRunning())
{
rtc.SetIsRunning(true);
// Obtém o valor da hora quando o código foi compilado
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
rtc.SetDateTime(compiled);
// Para definir um formato personalizado, você pode fazer o seguinte:
// O mês precisa ter 3 letras abreviando o nome do mês em inglês (no exemplo abaixo é fevereiro)
//RtcDateTime teste = RtcDateTime("Feb 12 2022", "19:32:45");
//rtc.SetDateTime(teste);
}
}

void loop() {
unsigned long currentMillis = millis();
buttonState = digitalRead(BUTTON_PIN);

if (buttonState != lastButtonState) {
lastDebounceTime = currentMillis;
}

if ((currentMillis - lastDebounceTime) > debounceDelay) {
if (buttonState != buttonWasPressed) {
buttonWasPressed = buttonState;

if (buttonWasPressed) {
// Botão pressionado, alterna entre os modos
modo = (modo + 1) % NUM_MODOS;
}
}
}

lastButtonState = buttonState;
switch (modo) {
case 0: // Modo Estacionário
// Coloque o código para o modo estacionário aqui
Serial.print("MODO : " ); // Mostra o valor no monitor serial
Serial.println(modo);
break;

case 1: // Modo LDR
Serial.print("MODO : " ); // Mostra o valor no monitor serial
Serial.println(modo);
// Leitura dos sensores LDR
int ldrLeftTopValue = analogRead(ldrLeftTopPin);
int ldrLeftBottomValue = analogRead(ldrLeftBottomPin);
int ldrRightTopValue = analogRead(ldrRightTopPin);
int ldrRightBottomValue = analogRead(ldrRightBottomPin);

// Calculando as diferenças para ambos os eixos
int azimuthDifference = (ldrLeftTopValue - ldrRightTopValue) + (ldrLeftBottomValue - ldrRightBottomValue);
int elevationDifference = (ldrLeftTopValue - ldrLeftBottomValue) + (ldrRightTopValue - ldrRightBottomValue);

// Ajustando a posição dos motores de passo com base nas diferenças dos sensores
if (abs(azimuthDifference) > limiar) { // Limiar de diferença para evitar pequenos movimentos
if (azimuthDifference > 0) {
// Mova o motor de passo de azimuth para a esquerda
azimuthStepper.setSpeed(Vel);
azimuthStepper.runSpeed(); // Move o motor
} else {
// Mova o motor de passo de azimuth para a direita
azimuthStepper.setSpeed(-Vel); // (sentido inverso)
azimuthStepper.runSpeed(); // Move o motor
}
}

if (abs(elevationDifference) > limiar) { // Limiar de diferença para evitar pequenos movimentos
if (elevationDifference > 0) {
// Mova o motor de passo de elevação para cima
elevationStepper.setSpeed(Vel); //
elevationStepper.runSpeed(); // Move o motor
} else {
// Mova o motor de passo de elevação para baixo
elevationStepper.setSpeed(-Vel); // (sentido inverso)
elevationStepper.runSpeed(); // Move o motor
}
}
break;
case 2: // Modo DS1302
Serial.print("MODO : " ); // Mostra o valor no monitor serial
Serial.println(modo);
// Obtem a data e hora e imprime os valores
RtcDateTime now = rtc.GetDateTime();

Serial.print(now.Day());
Serial.print("/");
Serial.print(now.Month());
Serial.print("/");
Serial.println(now.Year());

Serial.print(now.Hour());
Serial.print(":");
Serial.print(now.Minute());
Serial.print(":");
Serial.println(now.Second());

// Dia da semana (1 a 7, sendo 1 = segunda e 7 = domingo)
Serial.println(now.DayOfWeek());

delay(50);
break;
}
}

Exibições: 91

Responder esta

Respostas a este tópico

Olá, Jânio!

   Sugestão para agilizar a solução:

   Dar uma olhada no tópico Como postar, por mineirin RV.

Sds.

D. T. Ribeiro.

Quer ajuda?

Então ajude-nos a ajuda-lo.

Siga as recomendações do amigo D.T. Ribeiro.

RV mineirin.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço