Servo Motor + RTC

Galera, to batendo cabeça faz um tempo já com o RTC DS1307.

Tenho um servo motor e quero que ele gire ao meio dia e as 7 horas da noite. Mas não consigo fazer o RTC funcionar de jeito nenhuma.

Usei a RTC libray:

Ele parece estar funcionando, a cada 1 seg ele manda isso no serial monitor:
"A¡ñ4¡HsÂáj?? BrH'F'bÂbà@ãrA1fñ4©C±1"

Alguém já viu isso?

Achei esse exemplo também:

Mas é para cristal liquido e não consigo editar para funcionar no serial monitor e não no lcd.

Olá!
Configurou a taxa de transmissão do serial monitor (baud)?
Pode mostrar o código?
Abraço.

Como faço essa configuração de baud??

O código é esse:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
Serial.begin(57600);
Wire.begin();
RTC.begin();

if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(DATE, TIME));
}
}

void loop () {
DateTime now = RTC.now();

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");

// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.unixtime() + 7 * 86400L + 30);

Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();

Serial.println();
delay(3000);
}

Olá!

Você precisa sempre olhar no "Setup" a taxa.
Neste caso:

Serial.begin(57600);

Abraço.

O programa esta funcionando, o problema é que estou tendo conflito entre o Ethernet Shield e RTC.
Estou procurando uma solução e vi que eles utilizam o i2c ao mesmo tempo. Estou matando o ethernet para rodar o programa. Existe algum jeito de corrigir isso?

Já verificou quais os pinos usados pelo ethershield e se não está usando os mesmos para o RTC?

Qual Ethernet shield estás a usar? O normal com o W5100 não usa pinos que estejas a usar para o I2C.

Já experimentaste código só com o RTC ligado ao arduino? Funciona?

Como e onde ligaste o motor de passo? Tens um esquema de todas as ligações?

Esta tudo funcionando. Mas para isso tive que anular a parte do código do Ethernet shield. Transformei em texto.
Motor, sensor ultrassônico, sensor resistivo, RTC.... tudo funciona. Mas hora que coloco o Ethernet no código, trava tudo.

// INCLUSÃO DAS BIBLIOTECAS

#include <SPI.h>       //Biblioteca geral  
#include <Ethernet.h> // Bibiblioteca Ethernet Shield
#include <Servo.h> //Biblioteca para Servo Motor
#include <Ultrasonic.h> //Biblioteca para o sensor ultrasonico
#include <Wire.h> // Biblioteca para o Real Time Clock
#include <RTClib.h> //Biblioteca para o Real Time Clock

RTC_DS1307 RTC;

// CONFIGURAÇÃO DO SENSOR ULTRASSOM

#define echoPin 9   //Pino 1 recebe o pulso do echo
#define trigPin 8   //Pino 2 envia o pulso para gerar o echo
Ultrasonic ultrasonic(8,9);

// CONFIGURAÇÃO ETHERNET

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   // Endereço MAC do controlador
byte ip[] = { 192, 168, 0, 4 };                        // IP usado pelo Arduino na rede - VERIFICAR!!!
byte server[] = { 200, 98, 199, 90 };                  // IP do servidor SMTP UOL Host para envio de emails - VERIFICAR!!!

// CONFIGURAÇÃO DE HORÁRIO INICIAL PARA ALIMENTAÇÃO

int hconst = 11;  // constante para definição de hora 00 hrs - 23 hrs (08 = octal constant)
int mconst = 40;  // constante para definição de minuto 00 min - 59 min


// VARIÁVEIS DO SISTEMA

int horas = 0;            // Variável de armazenamento horas recebidas
int minutos = 0;          // Variável de armazenamento minutos recebidas
int distancia;            // Variável de armazenamento distância do sensor ultrassom
int pos = 0;              // Variavel para armazenar a posição do servo
int time = 5000;          // Constante de tempo 1
int wait = 2000;          // Constante de tempo 2
Servo myservo;            // Cria um objeto do tipo myservo para acessar os metodos
EthernetClient client;    // Ethernet shield como cliente

// VARIÁVEIS DO SENSOR RESISTIVO

int fsrPin = 0;                 // Sensor Resistivo e resistor de pulldown conectados ao a0
int fsrReading;                 // Leitura analógica do divisor FSR - resistor
int fsrVoltage;                 // Leitura analógica convertido em voltagem
unsigned long fsrResistance;    // Voltagem convertida para resistância
unsigned long fsrConductance;   // Voltagem convertida para condutância
long fsrForce;                  // Finalmente, a resistência convertida em força

// CONFIGURAÇÕES DE SETUP

void setup() 
{ 
// CONFIGURAÇÃO SENSOR ULTRASSOM E SERVO MOTOR
 
  pinMode(echoPin, INPUT); // define o pino 9 como entrada (recebe)
  pinMode(trigPin, OUTPUT); // define o pino 8 como saida (envia)
  myservo.attach(5);  // atribui o pino 5 do arduino para ser controlado pelo objeto
  
// ABRIR COMUNICAÇÃO SERIAL

  Serial.begin(57600);
  
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));

  }

// INICIANDO ETHERNET 

 /* if (Ethernet.begin(mac) == 0) 
  {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }*/
}

// CONFIGURAÇÃO LOOP DA PARTE LÓGICA DE PROGRAMAÇÃO

void loop()
{ 
   DateTime now = RTC.now();
   
   horas = now.hour();
   Serial.print(horas, DEC);
   Serial.print("h:");
   minutos = now.minute();
   Serial.print(minutos, DEC);
   Serial.println("m");

// COMPARAÇÃO DE HORÁRIO ADQUIRIDO COM O PROGRAMADO NAS VARIÁVEIS HCONST E MCONST
    
  if (horas == hconst)//Primeiro verifica a hora
  {
    if (minutos == mconst)//Em seguida é feito a verificação dos minutos
    {
     
// APÓS COMPARAÇÃO DO HORARIO, É INICIADA A ALEITURA DO NÍVEL DE RAÇÃO NO RESERVATÓRIO

    //seta o pino 6 com um pulso baixo "LOW" ou desligado ou ainda 0
    digitalWrite(trigPin, LOW);
    // delay de 2 microssegundos
    delayMicroseconds(2);
    //seta o pino 6 com pulso alto "HIGH" ou ligado ou ainda 1
    digitalWrite(trigPin, HIGH);
    //delay de 10 microssegundos
    delayMicroseconds(10);
    //seta o pino 6 com pulso baixo novamente
    digitalWrite(trigPin, LOW);
    // função Ranging, faz a conversão do tempo de
    //resposta do echo em centimetros, e armazena
    //na variavel distancia
    distancia = (ultrasonic.Ranging(CM));

    Serial.print("Distancia em CM: ");//Exibe mensagem da distancia
    
    Serial.println(distancia);//Exibe o valor da distancaia
    Serial.flush();
    delay(1000);
    
// IDENTIFICANDO RAÇÃO NA BANDEJA

fsrReading = analogRead(fsrPin);  
  Serial.print("Analog reading = ");
  Serial.println(fsrReading);
 
  // analog voltage reading ranges from about 0 to 1023 which maps to 0V to 5V (= 5000mV)
  fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);
  Serial.print("Voltage reading in mV = ");
  Serial.println(fsrVoltage);  
 
  if (fsrVoltage == 0) {
    Serial.println("No pressure");  
  } else {
    // The voltage = Vcc * R / (R + FSR) where R = 10K and Vcc = 5V
    // so FSR = ((Vcc - V) * R) / V        yay math!
    fsrResistance = 5000 - fsrVoltage;     // fsrVoltage is in millivolts so 5V = 5000mV
    fsrResistance *= 100000;                // 10K resistor
    fsrResistance /= fsrVoltage;
    Serial.print("FSR resistance in ohms = ");
    Serial.println(fsrResistance);
 
    fsrConductance = 1000000;           // we measure in micromhos so 
    fsrConductance /= fsrResistance;
    Serial.print("Conductance in microMhos: ");
    Serial.println(fsrConductance);
 
    // Use the two FSR guide graphs to approximate the force
    if (fsrConductance <= 1000) {
      fsrForce = fsrConductance / 80;
      Serial.print("Force in Newtons: ");
      Serial.println(fsrForce);      
    } else {
      fsrForce = fsrConductance - 1000;
      fsrForce /= 30;
      Serial.print("Force in Newtons: ");
      Serial.println(fsrForce);            
    }
  }
  Serial.println("--------------------");
  Serial.flush();
  delay(1000);

Más práticas de programação:

#define echoPin 9   //Pino 1 recebe o pulso do echo
#define trigPin 8   //Pino 2 envia o pulso para gerar o echo
Ultrasonic ultrasonic(8,9);

Se fizeste um define, usa o define. Não um valor numérico. Não é isto o teu problema, mas um dia mais tarde nunca se sabe.

Quando dizes que trava tudo o que acontece? Recebes algo pela porta série? Faz um Serial.println("setup complete"); no final da setup e vê o que acontece.

Outra coisa que reparei:

Defines o mac, ip, etc, etc... e depois só usas o mac? Sem a gateway, não pode haver DHCP, né?

Experimenta isto:

Ethernet.begin(mac, ip, gateway, subnet); E claro, define isso correctamente para o teu caso.