First Commit
This commit is contained in:
parent
86fb445ab6
commit
fe1f82fc40
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
10
.vscode/extensions.json
vendored
Normal file
10
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
||||
39
include/README
Normal file
39
include/README
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
||||
46
lib/README
Normal file
46
lib/README
Normal file
@ -0,0 +1,46 @@
|
||||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
||||
6
lib/SHT1x-master/CHANGES.txt
Normal file
6
lib/SHT1x-master/CHANGES.txt
Normal file
@ -0,0 +1,6 @@
|
||||
2011-09-20
|
||||
* Conditionally include Arduino.h for compatibility with Arduino 1.0
|
||||
|
||||
2010-07-23
|
||||
* Added SHT7x to list of supported sensors.
|
||||
* Fixed temperature offset in humidity calculation.
|
||||
9
lib/SHT1x-master/DISTRIBUTION
Normal file
9
lib/SHT1x-master/DISTRIBUTION
Normal file
@ -0,0 +1,9 @@
|
||||
Copyright 2009 Jonathan Oxer <jon@oxer.com.au> / <www.practicalarduino.com>
|
||||
Copyright 2008 Maurice Ribble <ribblem@yahoo.com> / <www.glacialwanderer.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
http://www.gnu.org/licenses/
|
||||
63
lib/SHT1x-master/README.markdown
Normal file
63
lib/SHT1x-master/README.markdown
Normal file
@ -0,0 +1,63 @@
|
||||
SHT1x Temperature / Humidity Sensor Library for Arduino
|
||||
=======================================================
|
||||
Copyright 2009 Jonathan Oxer jon@oxer.com.au / http://www.practicalarduino.com
|
||||
Copyright 2008 Maurice Ribble ribblem@yahoo.com / http://www.glacialwanderer.com
|
||||
|
||||
Provides a simple interface to the SHT1x series (SHT10, SHT11, SHT15)
|
||||
and SHT7x series (SHT71, SHT75) temperature / humidity sensors from
|
||||
Sensirion, http://www.sensirion.com. These sensors use a "2-wire"
|
||||
communications buss that is similar to I2C and can co-exist on the same
|
||||
physical wire as I2C devices.
|
||||
|
||||
Installation
|
||||
------------
|
||||
Download the directory "SHT1x" and move it into the "libraries"
|
||||
directory inside your sketchbook directory, then restart the Arduino
|
||||
IDE. You will then see it listed under File->Examples->SHT1x.
|
||||
|
||||
Usage
|
||||
-----
|
||||
The library is instantiated as an object with methods provided to read
|
||||
relative humidity and temperature. Include it in your sketch and then
|
||||
create an object, specifying the pins to use for communication with the
|
||||
sensor:
|
||||
|
||||
#include <SHT1x.h>
|
||||
#define dataPin 10
|
||||
#define clockPin 11
|
||||
SHT1x sht1x(dataPin, clockPin);
|
||||
|
||||
You can then call methods on that object within your program. In this
|
||||
example we created an object called "sht1x", but it could have been
|
||||
called whatever you like. A complete example program is included with
|
||||
the library and can be accessed from the File->Examples->SHT1x menu.
|
||||
|
||||
### readTemperatureC() ###
|
||||
|
||||
Returns a float within the valid range of the sensor of -40 to +123.8C.
|
||||
A value of -40 is returned in the event of a communication error with
|
||||
the sensor.
|
||||
|
||||
Example:
|
||||
|
||||
float tempC = sht1x.readTemperatureC();
|
||||
|
||||
### readTemperatureF() ###
|
||||
|
||||
Returns a float within the valid range of the sensor of -40 to +254.9F.
|
||||
A value of -40 is returned in the event of a communication error with
|
||||
the sensor.
|
||||
|
||||
Example:
|
||||
|
||||
float tempF = sht1x.readTemperatureF();
|
||||
|
||||
### readHumidity() ###
|
||||
|
||||
Returns a float within the valid range of the sensor of 0 to 100%.
|
||||
A negative value is returned in the event of a communication error with
|
||||
the sensor.
|
||||
|
||||
Example:
|
||||
|
||||
float humidity = sht1x.readHumidity();
|
||||
243
lib/SHT1x-master/SHT1x.cpp
Normal file
243
lib/SHT1x-master/SHT1x.cpp
Normal file
@ -0,0 +1,243 @@
|
||||
/**
|
||||
* SHT1x Library
|
||||
*
|
||||
* Copyright 2009 Jonathan Oxer <jon@oxer.com.au> / <www.practicalarduino.com>
|
||||
* Based on previous work by:
|
||||
* Maurice Ribble: <www.glacialwanderer.com/hobbyrobotics/?p=5>
|
||||
* Wayne ?: <ragingreality.blogspot.com/2008/01/ardunio-and-sht15.html>
|
||||
*
|
||||
* Manages communication with SHT1x series (SHT10, SHT11, SHT15)
|
||||
* temperature / humidity sensors from Sensirion (www.sensirion.com).
|
||||
*/
|
||||
#if (ARDUINO >= 100)
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
#include "SHT1x.h"
|
||||
|
||||
SHT1x::SHT1x(int dataPin, int clockPin)
|
||||
{
|
||||
_dataPin = dataPin;
|
||||
_clockPin = clockPin;
|
||||
}
|
||||
|
||||
|
||||
/* ================ Public methods ================ */
|
||||
|
||||
/**
|
||||
* Reads the current temperature in degrees Celsius
|
||||
*/
|
||||
float SHT1x::readTemperatureC()
|
||||
{
|
||||
int _val; // Raw value returned from sensor
|
||||
float _temperature; // Temperature derived from raw value
|
||||
|
||||
// Conversion coefficients from SHT15 datasheet
|
||||
const float D1 = -40.0; // for 14 Bit @ 5V
|
||||
const float D2 = 0.01; // for 14 Bit DEGC
|
||||
|
||||
// Fetch raw value
|
||||
_val = readTemperatureRaw();
|
||||
|
||||
// Convert raw value to degrees Celsius
|
||||
_temperature = (_val * D2) + D1;
|
||||
|
||||
return (_temperature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the current temperature in degrees Fahrenheit
|
||||
*/
|
||||
float SHT1x::readTemperatureF()
|
||||
{
|
||||
int _val; // Raw value returned from sensor
|
||||
float _temperature; // Temperature derived from raw value
|
||||
|
||||
// Conversion coefficients from SHT15 datasheet
|
||||
const float D1 = -40.0; // for 14 Bit @ 5V
|
||||
const float D2 = 0.018; // for 14 Bit DEGF
|
||||
|
||||
// Fetch raw value
|
||||
_val = readTemperatureRaw();
|
||||
|
||||
// Convert raw value to degrees Fahrenheit
|
||||
_temperature = (_val * D2) + D1;
|
||||
|
||||
return (_temperature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads current temperature-corrected relative humidity
|
||||
*/
|
||||
float SHT1x::readHumidity()
|
||||
{
|
||||
int _val; // Raw humidity value returned from sensor
|
||||
float _linearHumidity; // Humidity with linear correction applied
|
||||
float _correctedHumidity; // Temperature-corrected humidity
|
||||
float _temperature; // Raw temperature value
|
||||
|
||||
// Conversion coefficients from SHT15 datasheet
|
||||
const float C1 = -4.0; // for 12 Bit
|
||||
const float C2 = 0.0405; // for 12 Bit
|
||||
const float C3 = -0.0000028; // for 12 Bit
|
||||
const float T1 = 0.01; // for 14 Bit @ 5V
|
||||
const float T2 = 0.00008; // for 14 Bit @ 5V
|
||||
|
||||
// Command to send to the SHT1x to request humidity
|
||||
int _gHumidCmd = 0b00000101;
|
||||
|
||||
// Fetch the value from the sensor
|
||||
sendCommandSHT(_gHumidCmd, _dataPin, _clockPin);
|
||||
waitForResultSHT(_dataPin);
|
||||
_val = getData16SHT(_dataPin, _clockPin);
|
||||
skipCrcSHT(_dataPin, _clockPin);
|
||||
|
||||
// Apply linear conversion to raw value
|
||||
_linearHumidity = C1 + C2 * _val + C3 * _val * _val;
|
||||
|
||||
// Get current temperature for humidity correction
|
||||
_temperature = readTemperatureC();
|
||||
|
||||
// Correct humidity value for current temperature
|
||||
_correctedHumidity = (_temperature - 25.0 ) * (T1 + T2 * _val) + _linearHumidity;
|
||||
|
||||
return (_correctedHumidity);
|
||||
}
|
||||
|
||||
|
||||
/* ================ Private methods ================ */
|
||||
|
||||
/**
|
||||
* Reads the current raw temperature value
|
||||
*/
|
||||
float SHT1x::readTemperatureRaw()
|
||||
{
|
||||
int _val;
|
||||
|
||||
// Command to send to the SHT1x to request Temperature
|
||||
int _gTempCmd = 0b00000011;
|
||||
|
||||
sendCommandSHT(_gTempCmd, _dataPin, _clockPin);
|
||||
waitForResultSHT(_dataPin);
|
||||
_val = getData16SHT(_dataPin, _clockPin);
|
||||
skipCrcSHT(_dataPin, _clockPin);
|
||||
|
||||
return (_val);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
int SHT1x::shiftIn(int _dataPin, int _clockPin, int _numBits)
|
||||
{
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
for (i=0; i<_numBits; ++i)
|
||||
{
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
delay(10); // I don't know why I need this, but without it I don't get my 8 lsb of temp
|
||||
ret = ret*2 + digitalRead(_dataPin);
|
||||
digitalWrite(_clockPin, LOW);
|
||||
}
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
void SHT1x::sendCommandSHT(int _command, int _dataPin, int _clockPin)
|
||||
{
|
||||
int ack;
|
||||
|
||||
// Transmission Start
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
pinMode(_clockPin, OUTPUT);
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
digitalWrite(_dataPin, LOW);
|
||||
digitalWrite(_clockPin, LOW);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
digitalWrite(_clockPin, LOW);
|
||||
|
||||
// The command (3 msb are address and must be 000, and last 5 bits are command)
|
||||
shiftOut(_dataPin, _clockPin, MSBFIRST, _command);
|
||||
|
||||
// Verify we get the correct ack
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
pinMode(_dataPin, INPUT);
|
||||
ack = digitalRead(_dataPin);
|
||||
if (ack != LOW) {
|
||||
//Serial.println("Ack Error 0");
|
||||
}
|
||||
digitalWrite(_clockPin, LOW);
|
||||
ack = digitalRead(_dataPin);
|
||||
if (ack != HIGH) {
|
||||
//Serial.println("Ack Error 1");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
void SHT1x::waitForResultSHT(int _dataPin)
|
||||
{
|
||||
int i;
|
||||
int ack;
|
||||
|
||||
pinMode(_dataPin, INPUT);
|
||||
|
||||
for(i= 0; i < 100; ++i)
|
||||
{
|
||||
delay(10);
|
||||
ack = digitalRead(_dataPin);
|
||||
|
||||
if (ack == LOW) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ack == HIGH) {
|
||||
//Serial.println("Ack Error 2"); // Can't do serial stuff here, need another way of reporting errors
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
int SHT1x::getData16SHT(int _dataPin, int _clockPin)
|
||||
{
|
||||
int val;
|
||||
|
||||
// Get the most significant bits
|
||||
pinMode(_dataPin, INPUT);
|
||||
pinMode(_clockPin, OUTPUT);
|
||||
val = shiftIn(_dataPin, _clockPin, 8);
|
||||
val *= 256;
|
||||
|
||||
// Send the required ack
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
digitalWrite(_dataPin, LOW);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
digitalWrite(_clockPin, LOW);
|
||||
|
||||
// Get the least significant bits
|
||||
pinMode(_dataPin, INPUT);
|
||||
val |= shiftIn(_dataPin, _clockPin, 8);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
void SHT1x::skipCrcSHT(int _dataPin, int _clockPin)
|
||||
{
|
||||
// Skip acknowledge to end trans (no CRC)
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
pinMode(_clockPin, OUTPUT);
|
||||
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
digitalWrite(_clockPin, LOW);
|
||||
}
|
||||
40
lib/SHT1x-master/SHT1x.h
Normal file
40
lib/SHT1x-master/SHT1x.h
Normal file
@ -0,0 +1,40 @@
|
||||
/**
|
||||
* SHT1x Library
|
||||
*
|
||||
* Copyright 2009 Jonathan Oxer <jon@oxer.com.au> / <www.practicalarduino.com>
|
||||
* Based on previous work by:
|
||||
* Maurice Ribble: <www.glacialwanderer.com/hobbyrobotics/?p=5>
|
||||
* Wayne ?: <ragingreality.blogspot.com/2008/01/ardunio-and-sht15.html>
|
||||
*
|
||||
* Manages communication with SHT1x series (SHT10, SHT11, SHT15)
|
||||
* temperature / humidity sensors from Sensirion (www.sensirion.com).
|
||||
*/
|
||||
#ifndef SHT1x_h
|
||||
#define SHT1x_h
|
||||
|
||||
#if (ARDUINO >= 100)
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
class SHT1x
|
||||
{
|
||||
public:
|
||||
SHT1x(int dataPin, int clockPin);
|
||||
float readHumidity();
|
||||
float readTemperatureC();
|
||||
float readTemperatureF();
|
||||
private:
|
||||
int _dataPin;
|
||||
int _clockPin;
|
||||
int _numBits;
|
||||
float readTemperatureRaw();
|
||||
int shiftIn(int _dataPin, int _clockPin, int _numBits);
|
||||
void sendCommandSHT(int _command, int _dataPin, int _clockPin);
|
||||
void waitForResultSHT(int _dataPin);
|
||||
int getData16SHT(int _dataPin, int _clockPin);
|
||||
void skipCrcSHT(int _dataPin, int _clockPin);
|
||||
};
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* ReadSHT1xValues
|
||||
*
|
||||
* Read temperature and humidity values from an SHT1x-series (SHT10,
|
||||
* SHT11, SHT15) sensor.
|
||||
*
|
||||
* Copyright 2009 Jonathan Oxer <jon@oxer.com.au>
|
||||
* www.practicalarduino.com
|
||||
*/
|
||||
|
||||
#include <SHT1x.h>
|
||||
|
||||
// Specify data and clock connections and instantiate SHT1x object
|
||||
#define dataPin 10
|
||||
#define clockPin 11
|
||||
SHT1x sht1x(dataPin, clockPin);
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(38400); // Open serial connection to report values to host
|
||||
Serial.println("Starting up");
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
float temp_c;
|
||||
float temp_f;
|
||||
float humidity;
|
||||
|
||||
// Read values from the sensor
|
||||
temp_c = sht1x.readTemperatureC();
|
||||
temp_f = sht1x.readTemperatureF();
|
||||
humidity = sht1x.readHumidity();
|
||||
|
||||
// Print the values to the serial port
|
||||
Serial.print("Temperature: ");
|
||||
Serial.print(temp_c, DEC);
|
||||
Serial.print("C / ");
|
||||
Serial.print(temp_f, DEC);
|
||||
Serial.print("F. Humidity: ");
|
||||
Serial.print(humidity);
|
||||
Serial.println("%");
|
||||
|
||||
delay(2000);
|
||||
}
|
||||
4
lib/SHT1x-master/keywords.txt
Normal file
4
lib/SHT1x-master/keywords.txt
Normal file
@ -0,0 +1,4 @@
|
||||
SHT1x KEYWORD1
|
||||
readHumidity KEYWORD2
|
||||
readTemperatureC KEYWORD2
|
||||
readTemperatureF KEYWORD2
|
||||
18
platformio.ini
Normal file
18
platformio.ini
Normal file
@ -0,0 +1,18 @@
|
||||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
board = nodemcuv2
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
greiman/SSD1306Ascii@^1.3.3
|
||||
thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 displays@^4.3.0
|
||||
knolleary/PubSubClient@^2.8
|
||||
306
src/main.cpp
Normal file
306
src/main.cpp
Normal file
@ -0,0 +1,306 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
//#include <Sensirion.h>
|
||||
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <SHT1x.h>
|
||||
#include <PubSubClient.h>
|
||||
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
|
||||
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
|
||||
|
||||
// jfs NodeMCU 1.0
|
||||
// Display
|
||||
|
||||
SSD1306 display(0x3c, D6, D5);
|
||||
// IC
|
||||
char output = 0;
|
||||
char IC = 0x20;
|
||||
byte i = 0;
|
||||
byte ALTWERT;
|
||||
byte WERT=0;
|
||||
|
||||
// Timing
|
||||
unsigned long readTime;
|
||||
unsigned long pubTime;
|
||||
// Data
|
||||
float temp_c;
|
||||
float humidity;
|
||||
char buffer[10];
|
||||
String line0;
|
||||
String line1;
|
||||
String line2;
|
||||
|
||||
|
||||
|
||||
// Specify data and clock connections and instantiate SHT1x object
|
||||
#define dataPin D3
|
||||
#define clockPin D4
|
||||
SHT1x sht1x(dataPin, clockPin);
|
||||
//#define SLEEP_DELAY_IN_SECONDS 300
|
||||
const char* host = "192.168.2.71";
|
||||
const char* ssid = "pipanet";
|
||||
const char* password = "passatvr6";
|
||||
WiFiClient net;
|
||||
PubSubClient mqtt(net);
|
||||
|
||||
const int mxSize=2;
|
||||
String ssids[mxSize] ={"pipanet","pipanetMicro"};
|
||||
String ssidp[mxSize] = {"passatvr6","passatvr6",};
|
||||
boolean conok =false;
|
||||
String netid;
|
||||
|
||||
int netfound(int n){
|
||||
String vs;
|
||||
int max = 0;
|
||||
int wer = 0;
|
||||
display.clear();
|
||||
if (n==0){
|
||||
display.drawString(0,0,"No Network Found");
|
||||
} else {
|
||||
for (int i=0; i < n; i++){
|
||||
if (WiFi.RSSI(i) < max) {
|
||||
max = WiFi.RSSI(i);
|
||||
wer = i;
|
||||
}
|
||||
vs = String(WiFi.SSID(i)+ " RSSI "+WiFi.RSSI(i));
|
||||
Serial.println(vs);
|
||||
display.drawString(0,i*12+14,vs);
|
||||
}
|
||||
}
|
||||
display.display();
|
||||
Serial.println(wer);
|
||||
delay(5000);
|
||||
display.clear();
|
||||
display.display();
|
||||
|
||||
return wer;
|
||||
}
|
||||
|
||||
boolean init_wifi(){
|
||||
boolean ok = false;
|
||||
String vs ="";
|
||||
int wer =0;
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.disconnect();
|
||||
delay(100);
|
||||
int n = WiFi.scanNetworks();
|
||||
Serial.println("scan done");
|
||||
if (n == 0) {
|
||||
Serial.println("no networks found");
|
||||
netfound(0);
|
||||
} else {
|
||||
Serial.print(n);
|
||||
Serial.println(" networks found");
|
||||
wer = netfound(n);
|
||||
String pp = ssidp[wer];
|
||||
String ss = WiFi.SSID(wer);
|
||||
Serial.println(pp+" "+ss);
|
||||
WiFi.begin(ss.c_str(), pp.c_str());
|
||||
ok = true;
|
||||
/*
|
||||
for (int i = 0; i < n; ++i) {
|
||||
for (int p=0;p<mxSize;p++){
|
||||
if (WiFi.SSID(i).equals(ssids[p])){
|
||||
String pp = ssidp[p];
|
||||
String ss = WiFi.SSID(i);
|
||||
WiFi.begin(ss.c_str(), pp.c_str());
|
||||
netid = ss;
|
||||
i=n;
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
delay(10);
|
||||
}
|
||||
*/
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void connect();
|
||||
|
||||
void callback(char* topic, byte* payload, unsigned int length) {
|
||||
Serial.print("Message arrived [");
|
||||
Serial.print(topic);
|
||||
Serial.print("] ");
|
||||
line0=topic;
|
||||
// welches Realis ist betroffen
|
||||
i=0x05;
|
||||
if (line0.endsWith("r1")) {
|
||||
i=0x00;
|
||||
}
|
||||
if (line0.endsWith("r2")) {
|
||||
i=0x01;
|
||||
}
|
||||
if (line0.endsWith("r3")) {
|
||||
i=0x02;
|
||||
}
|
||||
if (line0.endsWith("r4")) {
|
||||
i=0x03;
|
||||
}
|
||||
if (line0.endsWith("r5")) {
|
||||
i=0x04;
|
||||
}
|
||||
// an oder aus
|
||||
String s;
|
||||
boolean ok =false;
|
||||
int inByte1 = payload[0];
|
||||
int inByte2 = payload[1];
|
||||
if ((inByte1 == 'o') && (inByte2 == 'n'))
|
||||
{
|
||||
Serial.print(i);
|
||||
Serial.println(" on");
|
||||
ok = true;
|
||||
s = "on";
|
||||
bitSet(output,i);
|
||||
Wire.beginTransmission(IC);
|
||||
Wire.write(~output);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
if ((inByte1 == 'o') && (inByte2 == 'f'))
|
||||
{
|
||||
Serial.print(i);
|
||||
Serial.println(" of");
|
||||
ok = true;
|
||||
s= "off";
|
||||
bitClear(output,i);
|
||||
Wire.beginTransmission(IC);
|
||||
Wire.write(~output);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
if (ok == false){
|
||||
Serial.println("Error");
|
||||
s = "Error";
|
||||
}
|
||||
|
||||
|
||||
line2 = topic;
|
||||
line2 = line2 + s;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
String s = "Hi There";
|
||||
Serial.begin(115200);
|
||||
delay(100);
|
||||
display.init();
|
||||
display.clear();
|
||||
display.flipScreenVertically();
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
display.setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
|
||||
display.drawString(0,0,"Booting...");
|
||||
display.display();
|
||||
Serial.println();
|
||||
Serial.println("Booting...");
|
||||
|
||||
//WiFi.mode(WIFI_AP_STA);
|
||||
//WiFi.begin(ssid, password);
|
||||
|
||||
while (!init_wifi()){
|
||||
delay(200);
|
||||
}
|
||||
display.drawString(0, 10, "Connecting to WiFi...");
|
||||
display.display();
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
display.drawString(0, 20, "\nWiFi connected, IP address: ");
|
||||
display.drawString(0, 30, WiFi.localIP().toString());
|
||||
display.display();
|
||||
|
||||
mqtt.setServer(host,1883);
|
||||
mqtt.setCallback(callback);
|
||||
connect();
|
||||
|
||||
readTime = 0;
|
||||
pubTime = 0;
|
||||
//strcpy(line1,s.c_str());
|
||||
long rssi = WiFi.RSSI();
|
||||
line0 = WiFi.localIP().toString();
|
||||
line0 = line0 + " "+String(rssi);
|
||||
Serial.println(line0);
|
||||
//relais
|
||||
Wire.begin(D6,D5);
|
||||
Wire.beginTransmission(IC); // Start Übertragung zum PCF8574
|
||||
Wire.write(~output); // Alle Bits sind Eingänge
|
||||
Wire.endTransmission();
|
||||
}
|
||||
void disp_Temp(){
|
||||
String s;
|
||||
long rssi = WiFi.RSSI();
|
||||
line0 = WiFi.localIP().toString();
|
||||
line0 = line0 + " "+String(rssi)+" db";
|
||||
display.clear();
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
display.drawString(0,0,line0);
|
||||
line1=String(temp_c)+" C ";
|
||||
s = String(humidity);
|
||||
s = s + " %";
|
||||
line1=line1 +s ;
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
display.drawString(0,14,line1);
|
||||
line2 = String(" SSID " + WiFi.SSID());
|
||||
display.drawString(0,32,line2);
|
||||
display.display();
|
||||
}
|
||||
|
||||
|
||||
void pub_Temp(){
|
||||
pubTime = millis();
|
||||
mqtt.publish("/Handy/temp", buffer);
|
||||
dtostrf(humidity, 6, 2, buffer);
|
||||
mqtt.publish("/Handy/humidity", buffer);
|
||||
Serial.print("Sending... ");
|
||||
Serial.print("Temp: ");
|
||||
Serial.print(String(temp_c));
|
||||
Serial.print(" Humidity: ");
|
||||
Serial.print(String(humidity));
|
||||
long rssi = WiFi.RSSI();
|
||||
String s = String(rssi);
|
||||
Serial.print(" RSSI: ");
|
||||
Serial.print(s);
|
||||
s.toCharArray(buffer,10);
|
||||
mqtt.publish("/Handy/rssi", buffer);
|
||||
netid.toCharArray(buffer,10);
|
||||
mqtt.publish("/Handy/ssid", buffer);
|
||||
}
|
||||
|
||||
void readTemp(){
|
||||
readTime = millis();
|
||||
temp_c = sht1x.readTemperatureC();
|
||||
humidity = sht1x.readHumidity();
|
||||
dtostrf(temp_c, 6, 2, buffer);
|
||||
disp_Temp();
|
||||
}
|
||||
|
||||
void connect() {
|
||||
while(WiFi.waitForConnectResult() != WL_CONNECTED) {
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.println("WiFi connection failed. Retry.");
|
||||
}
|
||||
Serial.print("Wifi connection successful - IP-Address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
while (!mqtt.connect("arduinoHandy")) {
|
||||
Serial.print(".");
|
||||
}
|
||||
mqtt.subscribe("/Handy/in/");
|
||||
Serial.println("MQTT connected!");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
mqtt.loop();
|
||||
|
||||
if (!mqtt.connected()) {
|
||||
connect();
|
||||
}
|
||||
if(millis() > readTime+500){
|
||||
readTemp();
|
||||
}
|
||||
if(millis() > pubTime+1000){
|
||||
pub_Temp();
|
||||
}
|
||||
}
|
||||
|
||||
11
test/README
Normal file
11
test/README
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
This directory is intended for PlatformIO Test Runner and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
|
||||
1
test/SHT1x.h
Normal file
1
test/SHT1x.h
Normal file
@ -0,0 +1 @@
|
||||
|
||||
276
test/jfs_esp8266_mqtt_handy.ino
Normal file
276
test/jfs_esp8266_mqtt_handy.ino
Normal file
@ -0,0 +1,276 @@
|
||||
//#include <Sensirion.h>
|
||||
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <SHT1x.h>
|
||||
#include <PubSubClient.h>
|
||||
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
|
||||
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
|
||||
|
||||
// jfs NodeMCU 1.0
|
||||
// Display
|
||||
|
||||
SSD1306 display(0x3c, D6, D5);
|
||||
// IC
|
||||
char output = 0;
|
||||
char IC = 0x20;
|
||||
byte i = 0;
|
||||
byte ALTWERT;
|
||||
byte WERT=0;
|
||||
|
||||
// Timing
|
||||
unsigned long readTime;
|
||||
unsigned long pubTime;
|
||||
// Data
|
||||
float temp_c;
|
||||
float humidity;
|
||||
char buffer[10];
|
||||
String line0;
|
||||
String line1;
|
||||
String line2;
|
||||
|
||||
|
||||
|
||||
// Specify data and clock connections and instantiate SHT1x object
|
||||
#define dataPin D3
|
||||
#define clockPin D4
|
||||
SHT1x sht1x(dataPin, clockPin);
|
||||
//#define SLEEP_DELAY_IN_SECONDS 300
|
||||
const char* host = "192.168.2.71";
|
||||
const char* ssid = "pipanet";
|
||||
const char* password = "passatvr6";
|
||||
WiFiClient net;
|
||||
PubSubClient mqtt(net);
|
||||
|
||||
const int mxSize=2;
|
||||
String ssids[mxSize] ={"pipanet","pipanetMicro"};
|
||||
String ssidp[mxSize] = {"passatvr6","passatvr6",};
|
||||
boolean conok =false;
|
||||
String netid;
|
||||
void netfound(int i){
|
||||
display.clear();
|
||||
display.setColor(BLACK);
|
||||
display.fillRect(0, 0, 128, 10);
|
||||
display.setColor(WHITE);
|
||||
display.drawString(0,0,String(i));
|
||||
display.drawString(20,0,"networks found");
|
||||
display.display();
|
||||
}
|
||||
boolean init_wifi(){
|
||||
boolean ok = false;
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.disconnect();
|
||||
delay(100);
|
||||
int n = WiFi.scanNetworks();
|
||||
Serial.println("scan done");
|
||||
if (n == 0) {
|
||||
Serial.println("no networks found");
|
||||
netfound(0);
|
||||
} else {
|
||||
Serial.print(n);
|
||||
Serial.println(" networks found");
|
||||
netfound(n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
for (int p=0;p<mxSize;p++){
|
||||
if (WiFi.SSID(i).equals(ssids[p])){
|
||||
String pp = ssidp[p];
|
||||
String ss = WiFi.SSID(i);
|
||||
WiFi.begin(ss.c_str(), pp.c_str());
|
||||
netid = ss;
|
||||
i=n;
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
delay(10);
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void connect();
|
||||
|
||||
void callback(char* topic, byte* payload, unsigned int length) {
|
||||
Serial.print("Message arrived [");
|
||||
Serial.print(topic);
|
||||
Serial.print("] ");
|
||||
line0=topic;
|
||||
// welches Realis ist betroffen
|
||||
i=0x05;
|
||||
if (line0.endsWith("r1")) {
|
||||
i=0x00;
|
||||
}
|
||||
if (line0.endsWith("r2")) {
|
||||
i=0x01;
|
||||
}
|
||||
if (line0.endsWith("r3")) {
|
||||
i=0x02;
|
||||
}
|
||||
if (line0.endsWith("r4")) {
|
||||
i=0x03;
|
||||
}
|
||||
if (line0.endsWith("r5")) {
|
||||
i=0x04;
|
||||
}
|
||||
// an oder aus
|
||||
String s;
|
||||
boolean ok =false;
|
||||
int inByte1 = payload[0];
|
||||
int inByte2 = payload[1];
|
||||
if ((inByte1 == 'o') && (inByte2 == 'n'))
|
||||
{
|
||||
Serial.print(i);
|
||||
Serial.println(" on");
|
||||
ok = true;
|
||||
s = "on";
|
||||
bitSet(output,i);
|
||||
Wire.beginTransmission(IC);
|
||||
Wire.write(~output);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
if ((inByte1 == 'o') && (inByte2 == 'f'))
|
||||
{
|
||||
Serial.print(i);
|
||||
Serial.println(" of");
|
||||
ok = true;
|
||||
s= "off";
|
||||
bitClear(output,i);
|
||||
Wire.beginTransmission(IC);
|
||||
Wire.write(~output);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
if (ok == false){
|
||||
Serial.println("Error");
|
||||
s = "Error";
|
||||
}
|
||||
|
||||
|
||||
line2 = topic;
|
||||
line2 = line2 + s;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
String s = "Hi There";
|
||||
Serial.begin(115200);
|
||||
delay(100);
|
||||
display.init();
|
||||
display.clear();
|
||||
display.flipScreenVertically();
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
display.setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
|
||||
display.drawString(0,0,"Booting...");
|
||||
display.display();
|
||||
Serial.println();
|
||||
Serial.println("Booting...");
|
||||
|
||||
//WiFi.mode(WIFI_AP_STA);
|
||||
//WiFi.begin(ssid, password);
|
||||
|
||||
while (!init_wifi()){
|
||||
delay(200);
|
||||
}
|
||||
display.drawString(0, 10, "Connecting to WiFi...");
|
||||
display.display();
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
display.drawString(0, 20, "\nWiFi connected, IP address: ");
|
||||
display.drawString(0, 30, WiFi.localIP().toString());
|
||||
display.display();
|
||||
|
||||
mqtt.setServer(host,1883);
|
||||
mqtt.setCallback(callback);
|
||||
connect();
|
||||
|
||||
readTime = 0;
|
||||
pubTime = 0;
|
||||
//strcpy(line1,s.c_str());
|
||||
long rssi = WiFi.RSSI();
|
||||
line0 = WiFi.localIP().toString();
|
||||
line0 = line0 + " "+String(rssi);
|
||||
Serial.println(line0);
|
||||
//relais
|
||||
Wire.begin(D6,D5);
|
||||
Wire.beginTransmission(IC); // Start Übertragung zum PCF8574
|
||||
Wire.write(~output); // Alle Bits sind Eingänge
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
mqtt.loop();
|
||||
|
||||
if (!mqtt.connected()) {
|
||||
connect();
|
||||
}
|
||||
if(millis() > readTime+500){
|
||||
readTemp();
|
||||
}
|
||||
if(millis() > pubTime+1000){
|
||||
pub_Temp();
|
||||
}
|
||||
}
|
||||
|
||||
void disp_Temp(){
|
||||
String s;
|
||||
long rssi = WiFi.RSSI();
|
||||
line0 = WiFi.localIP().toString();
|
||||
line0 = line0 + " "+String(rssi)+" db";
|
||||
display.clear();
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
display.drawString(0,0,line0);
|
||||
line1=String(temp_c)+" C ";
|
||||
s = String(humidity);
|
||||
s = s + " %";
|
||||
line1=line1 +s ;
|
||||
display.setFont(ArialMT_Plain_10);
|
||||
display.drawString(0,18,line1);
|
||||
line2 = WiFi.SSID().toString;
|
||||
display.drawString(0,30,line2);
|
||||
display.display();
|
||||
}
|
||||
|
||||
|
||||
void pub_Temp(){
|
||||
pubTime = millis();
|
||||
mqtt.publish("/Handy/temp", buffer);
|
||||
dtostrf(humidity, 6, 2, buffer);
|
||||
mqtt.publish("/Handy/humidity", buffer);
|
||||
Serial.print("Sending... ");
|
||||
Serial.print("Temp: ");
|
||||
Serial.print(String(temp_c));
|
||||
Serial.print(" Humidity: ");
|
||||
Serial.print(String(humidity));
|
||||
long rssi = WiFi.RSSI();
|
||||
String s = String(rssi);
|
||||
Serial.print(" RSSI: ");
|
||||
Serial.print(s);
|
||||
s.toCharArray(buffer,10);
|
||||
mqtt.publish("/Handy/rssi", buffer);
|
||||
netid.toCharArray(buffer,10);
|
||||
mqtt.publish("/Handy/ssid", buffer);
|
||||
}
|
||||
|
||||
void readTemp(){
|
||||
readTime = millis();
|
||||
temp_c = sht1x.readTemperatureC();
|
||||
humidity = sht1x.readHumidity();
|
||||
dtostrf(temp_c, 6, 2, buffer);
|
||||
disp_Temp();
|
||||
}
|
||||
|
||||
void connect() {
|
||||
while(WiFi.waitForConnectResult() != WL_CONNECTED) {
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.println("WiFi connection failed. Retry.");
|
||||
}
|
||||
Serial.print("Wifi connection successful - IP-Address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
while (!mqtt.connect("arduinoHandy")) {
|
||||
Serial.print(".");
|
||||
}
|
||||
mqtt.subscribe("/Handy/in/");
|
||||
Serial.println("MQTT connected!");
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user