Olá, pessoal!
Estou abrindo esse tópico pra compartilhar com vcs a minha experiência (em andamento) com a construção desse projeto. Se trata de um Arduíno controlando uma solenóide (12V, 500mA) pra molhar 7 fruteiras aqui do meu quintal.
Sou iniciante em eletrônica e programação. Tenho estado fascinado com o espírito colaborativo da comunidade e com o mundo de possibilidades tecnológicas que está se abrindo!
Seguem aí as etapas de elaboração, algumas soluções e, no fim, minhas dúvidas do momento:
v 0.1 - Primeiros testes
Arduíno Nano, protoboard, fonte 9v, fonte 12v e código usando Delay()
-> Acionamento com um Mosfet IRF640N e um Optoisolador 4n25
(http://www.pighixxx.com/test/portfolio-items/connect-a-solenoid/ - esse site é excelente!)
v 0.2 - Proteção e eliminação da fonte 9V [e treino de solda.. rs..]
Protoboard substituída por uma placa ilhada 10x10 numa marmita de plástico (da Spoleto.. rs)
-> Regulador de voltagem 5v com LM7805
(http://www.pighixxx.com/test/portfolio-items/simple-5v-power-supply/)
Em implementação..
v 0.3 - Baixar o custo ($) e abrir a possibilidade de outras entradas e saídas
Usar um "Arduíno Pro Mini" e código sem Delay()
Desafio de ontem (solucionado): Programar o "Arduíno Pro Mini" com adaptador "USB to TTL D-SUN". O "segredo": ficar com o dedo pronto no reset, quando a luz azul piscar, aperte rapidamente o reset.
Desafio de hoje (sem solução): Pq o "If" não redireciona pro seu "else"? Teste lógico furado? Estrutura errada?
Abraços!
/* Baseado no "Blink without Delay" created 2005 by David A. Mellis modified 8 Feb 2010 by Paul Stoffregen modified 11 Nov 2013 by Scott Fitzgerald
Controlador de irrigação
em Arduino Pro Mini
1. LED da saída 13 pisca nos segundos iniciais para permitir conexão dos fios
2. A solenoide funciona com LOW no pino 10
3. Funciona pela quantidade de horas definidas em "tempIrri"
Futuras melhorias:
A. Evitar reinício após falta de luz
B. Evitar falta d'água
C. RTC
This example code is in the public domain.
*/
// constants won't change. Used here to set a pin number :
const int ledPin = 13; // the number of the LED pin
const int solePino = 10; //pino que comanda a solenoide
// Variables will change :
int ledState = LOW; // ledState used to set the LED
int solenoideEstado = HIGH;
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change :
const long interval = 500; // interval at which to blink (milliseconds)
// const long tempIrri = 1000*60*60*5; // horas
const long tempIrri = 1000*60; // segundos (teste)
void setup() {
// set the digital pins as output:
pinMode(ledPin, OUTPUT);
pinMode(solePino, OUTPUT);
digitalWrite(solePino, HIGH); // garante a solenoide fechada no início
}
void loop()
{
unsigned long currentMillis = millis();
/* LED pisca durante conexão dos fios. Funciona bem.
if(currentMillis <= (1000*15)) {
if(currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
}
*/
if((currentMillis > (1000*20)) && (currentMillis < (1000*60))) { //AQUI ESTÁ MEU PROBLEMA: TESTE LOGICO OU ESTRUTURA DO "ELSE"???
digitalWrite(solePino, LOW);
/* para debug somente
digitalWrite(9, HIGH);
delay(500);
digitalWrite(9, LOW);
*/
}
else
{
digitalWrite(solePino, HIGH);
}
/* para debug somente
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW);
*/
}