ESP8266 arduino a thingspeak

Odpovědět
boss19866

ESP8266 arduino a thingspeak

Příspěvek od boss19866 » 25 čer 2015, 23:44

Dobrý den.Mám arduino deu. a k nemu připojeno ESP8266 a dallas čidlo teploty.
Chtěl jsem se zeptat co mám upravit v kodu aby se mi teplota odesílala na thingspeak.com
Děkuji za radu.

Kód: Vybrat vše

#include <TextFinder.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>

//ESP 8266 je na portu 2,3 - připomínám, že je potřeba mít flashlou verzi, která podporuje rychlost 9600b/s - SoftwareSerial nelze použít s vyšší rychlostí, než 19200!!!


SoftwareSerial espSerial(2,3); // RX, TX

//#define DEBUG   
//Dále inicializujeme komponenty pro zacházení s 1Wire rozhraním a teploměry DS18B20

//pro teploměr
#define ONE_WIRE_BUS 6
#define TEMPERATURE_PRECISION 9 
#define IP "184.106.153.149" // thingspeak.com
String GET = "GET /update?key=[8O2BV9V8YJ3WQSDY]&field1=";



OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer, outsideThermometer; 
float teplota;
//Definujeme SSID a Heslo pro Wifi a pár dalších nezbytností ...

//pro WiFi
#define SSID "kuwifi"
#define PASS "arakain"
#define RESET 5
#define LED 13 //ledka na Arduinu

bool wifiConnected;
uint8_t cnt;
String addr;
char channel;

TextFinder finder(espSerial);
//... a jdeme na úvodní nastavení systému...

void setup() 
{ 
	
  wifiConnected = false;
  pinMode(LED, OUTPUT);
  digitalWrite(LED,LOW);
  pinMode(RESET,OUTPUT);
  delay(500);
  reset();
      
  Serial.begin(115200); // Serial monitor
  espSerial.begin(9600); // ESP8266

  //espSerial.println("AT+RST");
//Po zapnutí napájení si počkáme, až se nám ESP8266 ohlásí ...

  Serial.println(F("ESP8266 & DS18B20 Web."));
  for (int i = 0; i < 5; i++)
  {
	  delay(1000);
	  if (espSerial.find("ready")) break;
	  clearSerialBuffer();
  }
  //otestuj dostupnost ESP8266
  Serial.print("AT : ");
  Serial.println(ATCommandSend("AT",500) );
  clearSerialBuffer();
//Pokusíme se připojit k WiFi jako klient.

  wifiInit();
 
  //ESP8266 je od této chvíle viditelný na síti
  Serial.println(F("Webserver bezi"));
  digitalWrite(LED,HIGH);
//Pohledáme teploměry ...

  //teploměr
  sensors.begin(); 
  Serial.println("***************************************************");
  Serial.print("Pocet teplomeru: "); 
  Serial.println(sensors.getDeviceCount(), DEC);
  //zjisti adresy
  oneWire.reset_search(); 
  if (!oneWire.search(insideThermometer)) Serial.println("Vnitrni teplomer nenalezen!"); 
  if (!oneWire.search(outsideThermometer)) Serial.println("Vnejsi teplomer nenalezen!"); 
  Serial.print("Adresa teplomeru 1: ");
  printAddress(insideThermometer);
  Serial.println();

  Serial.print("Adresa teplomeru 2: ");
  printAddress(outsideThermometer);
  Serial.println(); 

  //nastav rozlišení
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION); 

  //načti všechny teploměry
  sensors.requestTemperatures();

  //vytiskni data na seriák
  printData(insideThermometer);
  printData(outsideThermometer); 

  //vyčisti buffery
  if (Serial.available()>0) Serial.flush();
  clearSerialBuffer();
  cnt = 0;

}
//... a jedem do smyčky, kde čekáme na příchod sekvence +IPD - to je odezva na dotaz od webového prohlížeče, resp. její začátek. Další znak, který z ESP8266 dorazí je číslo kanálu, na který budeme "tisknout" HTML kód stránky.

 
void loop() 








{
  
  if (espSerial.available()>0)
  {
    if( finder.find("+IPD,") ) 
    {            
        delay(20);
		channel=espSerial.read();
		homepage(channel-'0');
		homepage(channel-'0'+1);
		delay(20);
		clearSerialBuffer();


#ifdef DEBUG
	  Serial.println("WEB! "+String(channel));
	  Serial.print(F("AT+CIPMUX=1 : "));
	  Serial.println( ATCommandSend("AT+CIPMUX=1", 100) );
	  Serial.print(F("AT+CIPSERVER=1,8888 : "));
	  Serial.println( ATCommandSend("AT+CIPSERVER=1,8888", 100) );
	  delay(20);
	  clearSerialBuffer();
#endif // DEBUG

    }
  }
  keepAlive();
}
//Osvědčilo se do hlavní smyčky vložit takový keepAlive() - masáž srdce, kdyby náhodou modul vytuhnul, což se občas stane. Tato utilitka jej udrží při životě.

void keepAlive()
{
	delay(100);
	cnt++;
	if (cnt>50)
	{
		cnt = 0;
		espSerial.println("AT");
		delay(50);
		if (!finder.find("OK")) 
		{
	#ifdef DEBUG
		  Serial.println("ESP8266 ERROR!");
	#endif // DEBUG
			wifiInit();
		}
		espSerial.println("AT+CIPSERVER=1,8888");
		delay(50);
		if (!finder.find("nochange")) wifiInit();
	}
}
 
//Ta/dy poskládáme WWW stránku, která je pak dostupná na IP adrese vypisující se v úvodní inicializaci a na portu 8888, což je zřejmé z inicializační procedury modulku.


void homepage(int ch_id) 
{
  
  sensors.requestTemperatures();
  teplota = sensors.getTempC(insideThermometer);
  String term = String(teplota,2);
  clearSerialBuffer();

  String Header;
  Header =  "HTTP/1.1 200 OK\r\n";
  Header += "Content-Type: text/html\r\n";
  Header += "Connection: close\r\n";  

  String Content;
  Content = "<h1>Teplota = ";
  Content += term;
  char degree = 176;
  Content += String(degree);
  Content += "C</h1>";
  
  Header += "Content-Length: ";
  Header += (int)(Content.length());
  Header += "\r\n\r\n";
  
  espSerial.print("AT+CIPSEND=");
  espSerial.print(String(ch_id));
#ifdef DEBUG
  Serial.println("Kanal: "+String(ch_id));
#endif // DEBUG

  espSerial.print(",");
  espSerial.println(Header.length()+Content.length());
  delay(1000);
  
  if (espSerial.find(">")) 
  {
      espSerial.print(Header);
      espSerial.print(Content);
	  delay(20);
	  clearSerialBuffer();
	  //espSerial.println("AT+CIPCLOSE");
	  //delay(50);
	  //clearSerialBuffer();
   }
  
 
}
//Touto funkcí s ESP8266 komunikuji - posílám do něho AT příkazy...

//AT příkaz s odpovědí a vyčasováním
String ATCommandSend(String AT_Command, int wait)
{
  String tmpData = "";
  
  espSerial.println(AT_Command);
  delay(wait);
  while (espSerial.available() >0 )  {
    char c = espSerial.read();
    tmpData += c;
    
    if ( tmpData.indexOf(AT_Command) > -1 )         
      tmpData = "";
    else
      tmpData.trim();       
          
   }
   return tmpData;
}
//Funkce pro HW reset - ten je tedy třeba na začátku po zapnutí napájení a taky při zmíněném vytuhnutí modulku.

//restart modulu ESP8266
void reset()
{
	digitalWrite(RESET,LOW);
	delay(100);
	digitalWrite(RESET,HIGH);
}
//A tady máme jádro pudla :-). Mrkněte na kód a pochopíte, co se v něm dějí za manévry. Není úplně jednoduché ten ESP8266 donutit korektně komunikovat, zkrátka je rozdíl, když na něj začnete sypat příkazy jeden za druhým z procesoru, nebo si s ním jen hrajete na nějakém převodníku a on má na všechno dost času. Pokud je vše OK, pak obdržíte IP adresu, kterou modul dostane přidělenou z DHCP Vašeho WiFi routeru, nastartuje se interní server a od této chvíle již můžete jít do browseru a mrknout na výsledek.

//inicializace wifi
void wifiInit()
{
  wifiConnected = false;
  digitalWrite(LED,LOW);
  //ověř asociaci na AP dle zvoleného SSID
  for (int i = 0; i < 10; i++)
  {
	  espSerial.println("AT+CWJAP?");
	  if (finder.find(SSID)) 
	  {
		  delay(20);
		  clearSerialBuffer();
		  digitalWrite(LED,HIGH);
		  wifiConnected = true;
		  break;
	  }
	  delay(100);
  }
  delay(1000);
  //není asociace, pokus se připojit na AP
  if (wifiConnected == false)
  {
	  //Serial.print("Timeout: ");
	  //Serial.println(ATCommandSend("AT+CIPSTO=60",100));
	  Serial.print("Mode 1: ");
	  Serial.println(ATCommandSend("AT+CWMODE=1",100));
 
	  for (int i = 0; i < 5; i++)
	  {
		  if (connectWiFi() == true)
		  {
			  wifiConnected = true;
			  clearSerialBuffer();
			  digitalWrite(LED,HIGH);
			  break;
		  }
		  delay(400);
	  }
  }
  
  
  //wifiConnected = true;
  if (wifiConnected == true) 
  {
	  Serial.println("Pripojeno!");
	  clearSerialBuffer();
	  //set the server of port 8888 check "no change" or "OK"
	  Serial.print(F("AT+CIPMUX=1 : "));
	  Serial.println( ATCommandSend("AT+CIPMUX=1", 100) );
	  Serial.print(F("AT+CIPSERVER=1,8888 : "));
	  Serial.println( ATCommandSend("AT+CIPSERVER=1,8888", 100) );
 
	  //set time out
	  //Serial.print("AT+CIPSTO=15 : ");
	  //Serial.println( ATCommandSend("AT+CIPSTO=15",10) );
	   //print the ip addr
	  Serial.print(F("IP addresa : "));
	  addr = ATCommandSend("AT+CIFSR", 1000);
	  addr = addr.substring(0,(addr.length()-2));
	  Serial.println(addr);
	  delay(200);
  }
  //připojení se nezdařilo
  else 
  {
	  Serial.println("WiFi ERROR!");
	  digitalWrite(LED,LOW);
	  while (true);
  }

}
 
 
void clearSerialBuffer(void) {
       while ( espSerial.available() > 0 ) 
	   {
           delay(20);
		   espSerial.flush();
       }
}
         
boolean connectWiFi()
{
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  espSerial.println(cmd);
  delay(2000);
  if(finder.find("OK"))
  {
	  clearSerialBuffer();
	  return true;
  }
  else
  {
    return false;
  }
  return true;
}
//A tady ještě pár funkcí pro obsluhu teploměrů.

//pro teploměry
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
} 

void printData(DeviceAddress deviceAddress)
{
  Serial.print("Adresa teplomeru ");
  printAddress(deviceAddress);
  Serial.print(":");
  printTemperature(deviceAddress);
} 

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Teplota: ");
  Serial.print(tempC);
  Serial.write(176);
  Serial.println("C");
}

Uživatelský avatar
Dex
Administrátor
Příspěvky: 1291
Registrován: 16 úno 2013, 14:26

Re: ESP8266 arduino a thingspeak

Příspěvek od Dex » 26 čer 2015, 07:26

Na zdrojáky tu máme tlačítko "Code", tak ho, prosím, používejte! Tentokrát jsem opravu provedl sám.
"all your robots are belong to us"
robodoupe.cz | rxd.cz | codetory.cz

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti