Hola a todos que tal, antes que nada gracias por pasarte por mi post y tomarte la molestia de ayudarme.
me encuentro realizando una alarma de temperatura para un site, para eso estoy utilizando los siguientes materiales:
-Sensor ds18b20
-Arduino Uno
-Ethernet Shield
-Cable rj45
- Cable USB
una vez que la temp llega a cierto nivel(50°C por ejemplo) el sistema debe enviar un mail hacía una cuenta destino ya establecida para eso estoy usando SMTP, Especificamente smtp2go, ya que trabajo con cuentas gmail y pues es el unico servicio que me convenció ya que también vi temboo pero no quise hacerlo con eso.
Ahora, el problema es que según yo ya hice todo bien, pero al energizar la placa en el conector rj45 de la shield, solo se enciende el led verde y el naranja queda apagado, no se a que se deba esto sinceramente y por eso vine aquí a ver si alguien de ustedes puede orientarme puesto que en redes no soy nada bueno.
Añado el código que estoy usando y si se me olvido dar algún detalle agradecería que me dijesen.
Saludos.
#include <SPI.h> //Incluimos las librerías necesarias para trabajar con el
#include <Ethernet.h> //módulo Ethernet.
#include <OneWire.h> //Se importan las librerías necesarias para
#include <DallasTemperature.h> //el sensor de temperatura.
//OJO: Al usar esta shield, los siguientes pines quedan sin poderse usar; 10, 11, 12, y 13.
#define ONE_WIRE_BUS 2 //"Attach" del sensor al pin 2 de nuestro arduino.
OneWire conexion(ONE_WIRE_BUS); //Se crea una instancia de la librería "onewire" a la cual llamamos "conexion" y le decimos que el sensor estará en el pin 2.
DallasTemperature sensor(&conexion); //Iniciamos la librería del sensor, creamos una instancia llamada "sensor" y le pasamos los parametros de "onewire"
//
byte mac[] = {0x90,0xA2,0xDA,0x00,0x59,0x67}; //Se le asigna una mac al shield la cual puede ser aleatoria.
IPAddress ip(172,18,xxx,xxx); //Se le asigna una ip al shield.
IPAddress gateway(172,18,xxx,xxx); //Gateway de la red.
IPAddress mascara(255,255,0,0); //Mascara de red.
char server[] = "mail.smtp2go.com";
int port = 2525;
EthernetClient cliente; //Creamos una instancia de la librería ethernet, mediante la cual se realizarán las peticiones que se necesiten.
float temperatura = 0; //Variable donde se guardará el dato
void setup(){
Serial.begin(9600);
Ethernet.begin(mac,ip,gateway,mascara); //Inicializamos el shield, pasandole los parametros que se ingresaron anteriormente.
delay(2000); //Realizamos una espera de 2 seg.
sensor.begin(); //Iniciamos el sensor.
}
void loop(){
sensor.requestTemperatures(); //Le "decimos" al sensor que realizaremos tomas de temperatura.
temperatura = sensor.getTempCByIndex(0); //obtenemos la temp en grados Celsius mediante el metodo.
Serial.println(temperatura);
delay(500);
if(temperatura >= 30){
if(sendEmail()) Serial.println(F("Correo Enviado"));
else Serial.println(F("Correo Fallido"));
}
}
byte sendEmail(){
byte thisByte = 0;
byte respCode;
if(cliente.connect(server,port) == 1){
Serial.println(F("Conectado :)"));
}
else{
Serial.println(F("Conexion Fallida :("));
return 0;
}
if(!eRcv()) return 0;
Serial.println(F("Sending Hello"));
cliente.println(F("EHLO 172.18.xxx.xxx"));
if(!eRcv()) return 0;
Serial.println(F("Sending auth login"));
cliente.println(F("auth login"));
if(!eRcv()) return 0;
Serial.println(F("Sending User"));
cliente.println("xxxxxxxxxxxxxxxxxxxxxxxxx"); correo del que se envia, code64
if(!eRcv()) return 0;
Serial.println(F("Sending Pass"));
cliente.println("yyyyyyyyyyyyyyyyyyyyyyy"); //pass del correo code64
Serial.println(F("Sending From"));
cliente.println("MAIL From: <xxxxxx@xxxxxx.com>"); //correo del que envia
Serial.println(F("Sending To"));
cliente.println("RCPT To: xxxxxxx@xxxxxx.com"); //destinatario
if(!eRcv()) return 0;
Serial.println(F("Sending DATA"));
cliente.println("DATA");
if(!eRcv()) return 0;
Serial.println(F("Sending EMAIL"));
cliente.println("To: You <xxxxxxx@xxxxxx.com>");
cliente.println("From: Me <xxxxxxx@xxxxxx.com>");
cliente.println("Subject: Alarma\r\n");
cliente.println("Hola mundo");
cliente.println(".");
if(!eRcv()) return 0;
Serial.println(F("Sending QUIT"));
cliente.println("QUIT");
if(!eRcv()) return 0;
cliente.stop();
Serial.println(F("Desconectado"));
return 1;
}
byte eRcv(){
byte respCode;
byte thisByte;
int contador = 0;
while(!cliente.available()){
delay(1);
contador++;
if(contador > 10000){
cliente.stop();
Serial.println(F("\r\nTimeout"));
return 0;
}
}
respCode = cliente.peek();
while(cliente.available()){
thisByte = cliente.read();
Serial.write(thisByte);
}
if(respCode >= '4'){
efail();
return 0;
}
return 1;
}
void efail(){
byte thisByte = 0;
int contador = 0;
cliente.println(F("QUIT"));
while(!cliente.available()){
delay(1);
contador++;
if(contador > 10000){
cliente.stop();
Serial.println(F("\r\nTimeout"));
return;
}
}
while(cliente.available()){
thisByte = cliente.read();
Serial.write(thisByte);
}
cliente.stop();
Serial.println(F("Desconectado"));
}
Este código lo tomé de playground.arduino.cc/Code/Email
es el segundo ejemplo donde dice SMTP2GO, solo que lo adapte a lo que quería pero no funciona.
Otra cosa que realice fue ejecutar el sketch "DhcpAddressPrinter" y la dir. ip que me dió la coloque en los campos correspondientes, aunque esto tampoco funcionó. Lo curioso es que eso está pasando porque el led naranja del rj45 de la ethernet no está encendido ni parpadeando solo el verde esta encendido.
Espero y pueda ayudarme.
Editado:
El día de hoy, tuve la idea de ponerle una MAC similar a la de mi equipo(Recuerdo haberlo leído en algún foro) y probé el ejemplo "WebServer" que contiene el IDE y finalmente pude ver la temp desde otros equipos que estuviesen en la misma red(ya que probé desde mi móvil usando datos y no pude hacerlo). Dejo el código por si puede ser útil
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
float temp;
char newT[7];
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x00, 0x23, 0xXX, 0xXX, 0xXX, 0xXX
};
IPAddress ip(172, 18, xxx, xxx);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
sensors.begin();
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 5");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
for (int muestra = 0; muestra < 2; muestra++) {
sensors.requestTemperatures(); // Send the command to get temperatures
temp = sensors.getTempCByIndex(0);
dtostrf(temp,5,2,newT);
client.print("La temp es: ");
client.print(newT);
client.print(" Grados ");
client.println("
");
}
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}