OK

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie. Více informací

Úvodní stránka » IoT - Internet of Things » Konstrukce reálného čidla SIGFOX s WISOL Arduino II.

Konstrukce reálného čidla SIGFOX s WISOL Arduino II.

Zdravím po nějaké době příznivce SIGFOXu a díky za přízeň vyjádřenou tím, že se po prvních 20-ti kouscích WISOL Arduina jen zaprášilo :-). Mnoho z Vás mně kontaktovalo, abych pokračoval v dopsání druhého dílu článku kolem reálné konstrukce čidla, jak jsem slíbil minule. OK, tak tady to je. Pro reálné čidlo jsem zvolil notoricky známý senzor teploty DS18B20 a 3 dráty jej propojil k modulku SIGFOX WISOL Arduino. Je nutné poznamenat, že jsem použil hotový modulek DS18B20, který má už na sobě potřebný pullup rezistor tak, aby mohl fungovat na 1Wire sběrnici. Celá ta paráda pak vypadá takto:

Propojení je velmi jednoduché:

  • VCC - VCC
  • GND - GND
  • DQ - pin D9

Sketch vychází z minulého článku, kdy jsme do backendu posílali pouze nicneříkající 2 byte 0101. Nyní tyto 2 byte nahradíme údajem o teplotě. Takže přimícháme do sketche obsluhu sběrnice 1Wire a teploměru DS18B20, dále si vytvoříme funkci createPayload(), ve které si do globální proměnné payload sestavíme to, co chceme do backendu poslat. Kód je opět selfexplaining, komentářů netřeba. Možná se někdo zamyslí, co to tam čaruji s tím payloadem při sestavování - je potřeba si uvědomit, že na backend je třeba posílat bajty a nikoliv znaky, takže jsem použil takovou obezličku, aby jsme dostáli pravidlům. Teplotu přenáším jako reálnou hodnotu vynásobenou 10, abych přenesl i desetiny. V aplikaci, která bude teplotu interpretovat je pak potřeba ji podělit 10, aby jste obdrželi reálný údaj.

Sketch je ke stažení zde.

Sketch - reálné čidlo s DS18B20 pro SIGFOX

#include <DallasTemperature.h>
#include <OneWire.h>
#include <LowPower.h>
#include <NeoSWSerial.h>

#define PERIODE 10
NeoSWSerial WISOL(4,5);
char c;
unsigned int timer = 0x00;
unsigned int periodeCounter = 0x00;
unsigned int uplinkCounter = 0x00;
String response;
String payload;

OneWire oneWire(9);
DallasTemperature sensors(&oneWire);

void printStars()
{
	Serial.println F("**********************************");
}
void checkResponse()
{
	response = "";
	while(WISOL.available()==0);
	while(WISOL.available()>0)
	{
		delay(5);
		c = WISOL.read();
		response = response + c;
	}
	response = response.substring(0,(response.length()-2));
}
void checkTRX()
{
	response = "";
	c=0x00;
	while(WISOL.available()>0)
	{
		WISOL.read();
		delay(5);
	}
	while(response.substring(0,2) !="OK")
	{
		WISOL.println("AT");
		delay(5);
		response = "";
		while(WISOL.available()>0)
		{
			delay(5);
			c = WISOL.read();
			response = response + c;
		}
		//Serial.println("WISOL response:");
		//Serial.print(response);
	}
}
void getID()
{
	printStars();
	WISOL.println("AT$I=10");
	delay(5);
	response = "";
	while(WISOL.available()>0)
	{
		delay(5);
		c = WISOL.read();
		response = response + c;
	}
	Serial.print("ID:" + response);
	WISOL.println("AT$I=11");
	delay(5);
	response = "";
	while(WISOL.available()>0)
	{
		delay(5);
		c = WISOL.read();
		response = response + c;
	}
	Serial.print("PAC:" + response);
	printStars();
}
void getVersion()
{
	WISOL.println("AT$I=0");
	delay(5);
	response = "";
	while(WISOL.available()>0)
	{
		delay(5);
		c = WISOL.read();
		response = response + c;
	}
	Serial.print("TRX version:" + response);
}
void send(String payload)
{
	Serial.println("Sending payload ...");
	WISOL.print("AT$SF=");
	WISOL.println(payload);
	delay(1000);
	//po�kej na OK
	checkResponse();
	if (response == "OK") Serial.println("Payload sent!");
	else Serial.println("Sending Error!");
	return;
}
bool parseCommand(String resp)
{
	if (resp == "sendTest")
	{
		Serial.println("Test message sending...");
		send("ABBA1234");
		return 1;
	}
	if (resp.substring(0,5) == "send:")
	{
		resp = resp.substring(5,resp.length());
		Serial.println("Payload:" + resp);
		send(resp);
		return 1;
	}
	Serial.println F("Unknown command");
	return 0;
}
void transceiverWakeUp()
{
	digitalWrite(13,HIGH);
	delay(100);
	digitalWrite(13,LOW);
	checkTRX();
	Serial.println("TRX ready!");
}
void createPayload()
{
  float temperature = 0.0;
  char buff[10]= {0x00};
  unsigned char i = 0;
  unsigned intT = 0x00;
  String temp; 
  sensors.requestTemperatures(); //ziskej teplotu
  temperature = sensors.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.println(temperature);
  intT = (int)(temperature*10);
  temp = String(intT,HEX);
  payload = "0000";
  for(i=0;i<4;i++) if(temp[i] !=0) payload[i] = temp[i];
  Serial.println("Payload:" + payload);
}

void setup()
{
  Serial.begin(9600);
  WISOL.begin(9600);
  pinMode(13,OUTPUT);
  pinMode(6,OUTPUT);
  printStars();
  Serial.println F("********SIGFOX WISOL Frame********");
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  checkTRX();
  Serial.println("WISOL detected!");
  getVersion();
  getID();
  response = "";
  timer = (PERIODE * 60)/8;	
  //prvotni odeslani payloadu po zapnuti
  periodeCounter = timer + 1;
  //inicializace DS18B20
  sensors.begin();
}

void loop()
{
	Serial.println F("*********Periodic mode************");
	delay(100);
	while(periodeCounter < timer)
	{
		LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 
		periodeCounter++;
	}
	periodeCounter = 0x00;
	pinMode(5,OUTPUT);
	pinMode(13,OUTPUT);
	//probud transceiver
	transceiverWakeUp();
  createPayload();
	send(payload);
	uplinkCounter++;
	Serial.println("Uplink counter:" + String(uplinkCounter));
	//uspi transceiver;
	WISOL.println("AT$P=2");
	delay(10);
	pinMode(5,INPUT);
	pinMode(13,INPUT);
	Serial.println("Sleeping...");
}

Pokud vše funguje jak má, na výpisu z terinálu uvidíte toto:

********SIGFOX WISOL Frame********

WISOL detected!
TRX version:AX-Sigfox 1.1.0-ETSI
**********************************
ID:0021E289
PAC:B879BDF8D3C890D6
**********************************
*********Periodic mode************
TRX ready!
Temperature: 29.69
Payload:1280
Sending payload ...
Payload sent!
Uplink counter:1
Sleeping...
*********Periodic mode************

... a po 10 minutách:

TRX ready!
Temperature: 25.71
Payload:1020
Sending payload ...
Payload sent!
Uplink counter:1
Sleeping...
*********Periodic mode************

Tak máte zase na chvilku nějakou zábavu, zkoušejte, testujte. Přidejte třeba další teploměr, rozšiřte  počet přenášených bajtů o další 2 (nezapomeňte na limit max 12 bajtů!!!), zkuste analogové měření, přenos logického stavu z nějakého pinu atd. Myslím, že možností je nevyčerpatelně a chce se jen rozhlížet kolem sebe. 

PF
petr.foltyn@arduinotech.cz

Přidat komentář

Zvýrazněné položky jsou povinné.

Přehled komentářů

  1. Záporné hodnoty (Mirek, 24.7.2017 12:06:42) Odpovědět

    Zdravím jak v síti Sigfox řešit záporné hodnoty teploměru.
    Děkuji za názory Mirek

    Dobrý den,
    Můžete použít jeden bit v nějakém následujícím byte po teplotě a zde rozlišit třeba, že 0 = kladná a 1 = záporná. Nebo, pokud chcete hodně šetřit, pak v rámci jednoho byte si zvolte offset, třeba -50st. a v aplikaci si jej přičítejte. Do aplikace Vám dojde 75, pŕičtete -50 a vimte, že je 25st. plus. Dojde třeba 45, přićtete -50 a víte, že je -5... Meto je jistě mnoho, patří to spíše na jiné fórum, ale ptal jste se, tak odpovídám, jak to řeším sám.

    S pozdravem,
    Petr Foltýn

  2. Napájení (Mirek, 7.7.2017 20:03:17) Odpovědět

    Děkuji za článek a perfetní typ na seriovou knihovnu funguje perfetně. Jen bych měl poznámku jak řešíte napájení když použiji Li-ion akumulátor tak ten může mít až 4,2V a to je na 3.3V technologii již dost. . Plánuji meteostanici s více čidli a chtěl bych to aspoň trochu dobíjet malým solárním článkem.
    Mirek

  3. Backend (Petr K, 14.6.2017 8:42:35) Odpovědět

    Skvělý článek!!! Není mi jen jasné zobrazení správné teploty v backendu, předpokládám správné kódování v Custom configuration. Mohu se zeptat jak správně zobrazit teplotu v backendu?
    Děkuji

  4. WISOL Arduino (PavelDC, 8.6.2017 18:52:34) Odpovědět

    Tak děkujeme :)


TOP produkty

Arduino MEGA2560

Arduino MEGA2560
424 Kč s DPH

Arduinotech GSM shield

Arduinotech GSM shield
877 Kč s DPH

Kontakt

Ing. Petr Foltýn
Kunčice pod Ondřejníkem 814, 73913
TOPlist