Go Down

Topic: Huerto e Invernadero automatizados con web de control remota (Read 1 time) previous topic - next topic

surbyte

A ver esto es simple y como línea de trabajo nunca te compliques como ahora.
Cuando surge una complicación aisla el problema y crea otro codigo simple resolviéndolo y luego regresa al código grande.
No hagas códigos grandes con cosas sin probar eso es un error GIGANTE!!!

Haz cosas chicas. Vas asegurándote que funcionen y las vas agregando a tu código general del que me gustaría decirte algunas cosas pero luego (recuérdamelo porque me olvido de tantos post que respondo).

Code: [Select]

const int minRpm = 30 ;
const int maxRpm = 150;
int potenciometer = analogRead(potenciometroMotor);
Serial.print("Potenciometro:  "); Serial.print(potenciometer);
//Establecemos la velocidad
int velocity = map(potenciometer, 0, 1023, minRpm, maxRpm);
Serial.print(", Velocidad:  ");
Serial.print(velocity);
Serial.println(" ");


Yo no veo nada problemático acá.
Dices que el valor del potenciometro lo muesta estable pero velocity se modifica?
Revista el resto del código, alguna variable esta interfiriendo.



soket

Hola,

efectivamente hice lo que me indicaste, aislar el código, que funcione y sobre esa base ire construyendo el resto de funciones, tenia programado todo incluso sin los sensores conectados y eso hacia que fallara, actualmente tengo:

- Conectado y funcionando DHT22
- Conectado y funcionando luxometro, ya se cuando es de día y de noche
- Conectado y funcionando el regulador de vueltas del motor.
- Conectado el modulo de radio RF24

Por otro lado tengo un:

- tiny85
- Modulo de radio RF24

Ahora mi idea es centrarme en la comunicaciones entre el master y los slaves, la premisa que tengo es:

- Leer la humedad cada cierto tiempo predefinir ido
- Si se comienza a regar leer cada menos tiempo.
- Cuando se termine de regar volver a timeout original

Para ello tengo 2 aproximaciones:

1)
- El master en un bucle recorre la red de sensores y les solicita la lectura, en cada iteración debería escribir y leer datos.
- No puedo apagar los slaves porque estos no saben cuando se les va a requerir la información
- No tengo colisiones porque el master va uno a uno.


2)
- Los slaves envian los datos cada x tiempo
- Si comienza a regar una zona, comunico que se cambie el tiempo de lectura, cuando finalice el riego lo mismo.
- Podría poner a dormir los slaves porque puedo saber cuando se debe enviar la próxima lectura


Para ello he visto las siguientes librerías http://tmrh20.github.io/RF24Mesh/

Me gusta mas la aproximación 2 porque podría poner a dormir a los slaves pero tengo unas dudas:

- Al ser mono thread Arduino, el master solo podría leer los datos de un solo clave.
- No tendría muchas colisiones?, tendría que implementar algún tipo de reintento en los slave?
- No seria un problema que 30 slaves emitieran al master simultáneamente vía radio?
- podría darse el caso que un sensor nunca puede enviar su información


Un saludo y gracias

surbyte

La red MESH tiene resuelto todo eso
De nuevo trabaja con la red, dominala y no integres hasta entender todo.

Prueba enviando cosas simples, 1 potenciomentro su valor, el estado de un sensor y si quiers accionar un led algo ida y vuelta.
Repite en los demas nodos y que el master lea y accione lo que quiera.

Resuelve eso y lo tienes.

javikani

Me uno al hilo, y aunque soy autodidacta con poca experiencia igual te puedo ayudar algo. Yo tengo un sistema de toma de datos de un sensor HC-SR04 que esta a 3 km y manda los datos a una base de datos cada 30 min a traves de 4g. Envio tipo Get.
Tengo una Raspi en casa con un servidor web y la base de datos donde tengo hecha una pagina web para consultar los datos desde cualquier lugar.
Lo del tema de la batería lo estoy perfeccionando ahora y creo que voy a usar dos plaquitas solares de 6v en serie. con cuatro 18650. Como regulador estoy haciendo pruebas a  un "fdc-2s-2" y de momento parece que va bien pero tengo que probarlo más.

Tu proyecto, al tener tantos nodos clientes, se complica un poco, pero se puede conseguir. Sería interesante saber si en tu proyecto tienes acceso a inernet por wifi, porque si es así, lo mas comodo creo que seŕia utilizar NodeMCU. En fin, estaré atento.

soket

Buenas,

No, no tengo acceso a Wifi, en una primera versión no enviare ninguna información a ningún sitio y solo la utilizar para abrir y cerrar las bombas de agua y ademas.

En una segunda iteración tengo pensado poner un modulo gsm que me permita:

- Enviar datos a un servidor que tengo en casa
- Recibir ordenes por SMS, como por ejemplo cerrar alguna bomba en caso de alerta
- Enviar alertas cuando algo funcione mal.

De momento tengo:

Arduino + DHT22 + Luxometro + Modulo de hora + Potenciometro + Controlador de motor funcionando

Ahora estoy centrado en las comunicaciones via radio, de momentos solo quiero ser capaz de enviar y recibir, cuando lo tenga conseguido subir el código y me dais opiniones.

Un saludo y gracias

soket

Buenas,

Una duda que tengo, voy a hacer pruebas de campo con lo que tengo y voy a conectar el arduino a una bateria de coche de 12v, es posible?, cierto ?, mientras mantenga el voltaje no importan los amperios, o si? , no me gustaría quemar el arduino, esta batería también la conectare al easydriver del motor paso a paso

Un saludo

surbyte

No va a pasar nada en tanto la parte que corresponde a motor no se alimente desde el arduino. Jamás alimentes un motor desde el arduino.
Quote
Arduino + DHT22 + Luxometro + Modulo de hora + Potenciometro + Controlador de motor funcionando
Por los sensores no hay problema.

Asi que adelante.

soket

Buenas,

Después de unis dias sin actualizar estoy centrado en la parte del motor paso a paso.
Para ello he comprado un EasyDriver, que conecto la imagen que adjunto.

Lo alimento con un transformador de 12v y 1 amperio.

El código que utilizo de momento es muy sencillo, un ejemplo encontrado en la web

Code: [Select]

#define STEPS 200
#define NUNVUELTAS 100
const int openDirection = STEPS * NUNVUELTAS;
const int closeDirection = STEPS * NUNVUELTAS * -1;

int DIR_PIN = 6; //Direction pin
int STEP_PIN = 7; //Stepper pin

void setup() {
  Serial.begin(9600);

  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
}

void loop() {
     rotate(openDirection, getVelocity());
   delay(2000);

   rotate(closeDirection, getVelocity());
   delay(4000);

}


void rotate(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);

digitalWrite(DIR_PIN,dir);

float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(usDelay);
  digitalWrite(STEP_PIN, LOW);
  delayMicroseconds(usDelay);
  }
}



He detectado los siguientes problemas:

- El Easydriver se calienta muchísimo, es normal?, creéis que seria mejor poner un rele para cortar la alimentación al EasyDriver cuando no se esta utilizando?

- No puedo modificar la velocidad, Os adjunto 2 videos, uno a velocidad 1 (Se supone que el máximo) donde el motor funciona correctamente. Liu bajo la velocidad a .50, el motor se comporta erróneamente

EDITO: Donde puedo subir las fotos y los videos para poder incrustarlos aquí?
Un saludo y gracias

Go Up