Go Down

Topic: Indoor con comunicación gprs que funcione en desconectado (Read 271 times) previous topic - next topic

luismg145

Primero que nada me presento, soy  nuevo en esto de Arduino pero tengo algo de experiencia en programación. este proyecto nace desde que cree mi propio indoor que controlaba las variables ambientales a través de productos Sonoff que activa un switch de 4 canales de acuerdo a sensores de temperatura y humedad (del mismo sonoff), el tema es que donde esta el indoor ( a unas tres cuadras de mi casa) la señal de inernet no es buena por lo que no se accionan los dispositivos ni logro ver el estado de los switch (que accionan el humidificador, extractor, calefactor y extractor). Sonoff permite crear reglas  de acuerdo a las variables y estados pero tampoco permite integrar mas sensores.
Lo que pretendo es crear un indoor con sensores de:
Humedad Interior
Humedad exterior
temperatura interior
temperatura exterior
humedad del sustrato
intensidad de la luz
nivel de CO2
estado de la puerta (abierta o cerrada)
también me gustaría determinar el tamaño de la planta

y de acuerdo a ciertas reglas que se enviaran desde una App Android accinará reles que actuaran
calefactor
ventilador
humidificador
intractor
extractor
luces
ozonificador (elimina olores)
bomba para riego y bombas peristálticas para el fertilizante
motor que suba o baje la lámpara

Para lograr hacer esto en un principio pensé en usar Rapaberry Pi pero hacerlo con arduino me parece un desafió mayor (sobre todo para mi que soy un neófito en esto). El primer tema que abordé fue la lectura de los sensores, hasta ahora me compré un arduino Mega y estoy leyendo sensores de humedad de sustrato, humedad, temperatura, intensidad de la luz.
El siguiente obstáculo es hacer que el arduino guarde las reglas para que funcione en desconectado pero que el usuario pueda cambiar estas reglas a discreción, para ello guardo estas reglas, estados de los reles y valores de variables en la memoria EEPROM pero pronto será en una tarjeta SD.
El siguiente paso será enviar los datos  guardados en el arduino a un servidor SQL Server al que tengo acceso y desde donde la App buscará los datos para gratificarlos (sensores) , cambiar estados de reles y crear reglas.
Para lograr esto es necesario enviar y recibir información desde arduino con un shield SIM9000 creo, pero no se como configurarlo. El otro tema es que el seteo del dispositivo debe ser lo mas fácil posible por lo que los datos no pueden estar a fierro en el código del arduino. ojala me puedan ayudar con mi proyecto, como verán ya hay proyectos parecidos a esto pero con estas mismas especificaciones no. Adjunto mi código hasta ahora


surbyte

Ese código requiere mucha optimización!!

Esto por ejemplo

Code: [Select]
char *  ActualizaEstados(char EstadosAntiguos[17],char EstadosNuevos[17])
{
  if ((EstadosNuevos[0]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[0]='0'; }
  if ((EstadosNuevos[0]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[0]='1'; }   
  if ((EstadosNuevos[1]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[1]='0'; }
  if ((EstadosNuevos[1]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[1]='1'; } 
  if ((EstadosNuevos[2]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[2]='0'; }
  if ((EstadosNuevos[2]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[2]='1'; } 
  if ((EstadosNuevos[3]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[3]='0'; }
  if ((EstadosNuevos[3]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[3]='1'; } 
  if ((EstadosNuevos[4]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[4]='0'; }
  if ((EstadosNuevos[4]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[4]='1'; } 
  if ((EstadosNuevos[5]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[5]='0'; }
  if ((EstadosNuevos[5]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[5]='1'; } 
  if ((EstadosNuevos[6]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[6]='0'; }
  if ((EstadosNuevos[6]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[6]='1'; } 
  if ((EstadosNuevos[7]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[7]='0'; }
  if ((EstadosNuevos[7]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[7]='1'; } 
  if ((EstadosNuevos[8]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[8]='0'; }
  if ((EstadosNuevos[8]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[8]='1'; } 
  if ((EstadosNuevos[9]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[9]='0'; }
  if ((EstadosNuevos[9]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[9]='1'; } 
  if ((EstadosNuevos[10]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[10]='0'; }
  if ((EstadosNuevos[10]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[10]='1'; } 
  if ((EstadosNuevos[11]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[11]='0'; }
  if ((EstadosNuevos[11]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[11]='1'; } 
  if ((EstadosNuevos[12]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[12]='0'; }
  if ((EstadosNuevos[12]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[12]='1'; } 
  if ((EstadosNuevos[13]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[13]='0'; }
  if ((EstadosNuevos[13]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[13]='1'; } 
  if ((EstadosNuevos[14]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[14]='0'; }
  if ((EstadosNuevos[14]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[14]='1'; } 
  if ((EstadosNuevos[15]=='0')&& (EstadosAntiguos[0]=='1')) { EstadosAntiguos[15]='0'; }
  if ((EstadosNuevos[15]=='1')&& (EstadosAntiguos[0]=='0')) { EstadosAntiguos[15]='1'; } 
  return EstadosAntiguos;
}


podrias ser notablemente mas simple

Esto podria simplificar bastante

Code: [Select]
char *  ActualizaEstados(char EstadosAntiguos[17],char EstadosNuevos[17])
{
  for (int i=0; i<15; i++) {
      int newState = EstadosNuevos[i]-48;
      int oldState = EstadosAntiguos[i]-48;
      if (newState && !oldState)
          EstadosAntiguos[i] = EstadosNuevos[i];
  }
 
  return EstadosAntiguos;
}


Pero si en lugar de usar EstadosNuevos y EstadosAntiguos como char lo hicieras como un vector de bool será mas economico en RAM también y no tendria que usar la resta de 48 para convertirlo en 1 y 0 enteros.

Bien.. esa no es tu pregunta. Tu pregunta esta relacionada con el SIM900

You uso esta librería GSMSHIELD para trabajar con el SIM900.



Go Up