commit
7612cd4666
@ -0,0 +1 @@ |
|||||||
|
.pio |
@ -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 |
@ -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 |
@ -0,0 +1,15 @@ |
|||||||
|
; 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:esp32dev] |
||||||
|
platform = espressif32 |
||||||
|
board = esp32dev |
||||||
|
framework = arduino |
||||||
|
lib_deps = knolleary/PubSubClient@^2.8 |
@ -0,0 +1,147 @@ |
|||||||
|
#include "Arduino.h" |
||||||
|
#include <WiFiMulti.h> |
||||||
|
#include <Wire.h> //Import the required libraries |
||||||
|
#include <PubSubClient.h> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define DISCHARGE_PIN 23 |
||||||
|
#define CHARGE_PIN 5 |
||||||
|
#define MEASURING_PIN 36 |
||||||
|
#define RESISTOR_VALUE 1e6 |
||||||
|
#define DEVICE "ESP32" |
||||||
|
#define WIFI_SSID "SSID_HERE" // Network Name
|
||||||
|
#define WIFI_PASSWORD "PASSWORD_HERE" // Network Password
|
||||||
|
#define MQTT_SERVER "test.mosquitto.org" |
||||||
|
#define MQTT_PORT 1883 |
||||||
|
#define MQTT_SUBSCRIBE_PUMP "plant/1/pump" |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WiFiMulti wifiMulti; |
||||||
|
WiFiClient espClient; |
||||||
|
PubSubClient client(espClient); |
||||||
|
|
||||||
|
void setup() |
||||||
|
{ |
||||||
|
// initialize LED digital pin as an output.
|
||||||
|
Serial.begin(9600); |
||||||
|
|
||||||
|
pinMode(CHARGE_PIN, OUTPUT); |
||||||
|
digitalWrite(CHARGE_PIN, LOW); |
||||||
|
|
||||||
|
setup_wifi(); |
||||||
|
setup_mqtt(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// =============== LOOP ============
|
||||||
|
void loop() |
||||||
|
{ |
||||||
|
float cap; |
||||||
|
setup_wifi(); |
||||||
|
setup_mqtt(); |
||||||
|
|
||||||
|
|
||||||
|
cap = capacitance(DISCHARGE_PIN, CHARGE_PIN, MEASURING_PIN); |
||||||
|
|
||||||
|
} |
||||||
|
// =============== LOOP END ============
|
||||||
|
|
||||||
|
|
||||||
|
float capacitance(int discharge_pin, int charge_pin, int measuring_pin) { |
||||||
|
unsigned int start_time, elapsed_time; |
||||||
|
float nanoFarads; |
||||||
|
|
||||||
|
// discharge:
|
||||||
|
digitalWrite(charge_pin, LOW); |
||||||
|
pinMode(discharge_pin, OUTPUT); |
||||||
|
digitalWrite(discharge_pin, LOW); |
||||||
|
// wait until the capacitor is fully discharged
|
||||||
|
while(analogRead(measuring_pin) > 0) { |
||||||
|
//Serial.println(analogRead(measuring_pin));
|
||||||
|
//Serial.print("discharging\n");
|
||||||
|
}; |
||||||
|
// stop discharging
|
||||||
|
pinMode(discharge_pin, INPUT); |
||||||
|
|
||||||
|
// Start charging
|
||||||
|
digitalWrite(charge_pin, HIGH); |
||||||
|
start_time = millis(); |
||||||
|
while(analogRead(measuring_pin) < 2588){// 2588 is 63.2% of 4096, which corresponds to full-scale voltage
|
||||||
|
} |
||||||
|
|
||||||
|
elapsed_time = millis() - start_time; |
||||||
|
nanoFarads = ((float)elapsed_time / RESISTOR_VALUE) * 1e6; |
||||||
|
Serial.println((long) nanoFarads); |
||||||
|
delay(1000); |
||||||
|
|
||||||
|
return nanoFarads; |
||||||
|
}; |
||||||
|
|
||||||
|
void setup_wifi() { |
||||||
|
WiFi.mode(WIFI_STA); // Setup wifi connection
|
||||||
|
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD); |
||||||
|
|
||||||
|
Serial.print("Connecting to wifi"); // Connect to WiFi
|
||||||
|
while (wifiMulti.run() != WL_CONNECTED) { |
||||||
|
Serial.print("."); |
||||||
|
delay(100); |
||||||
|
} |
||||||
|
Serial.print("Connected to "); |
||||||
|
Serial.print(WIFI_SSID); |
||||||
|
Serial.println(" Successfully"); |
||||||
|
Serial.print(WiFi.localIP()); |
||||||
|
Serial.println(" isn the local IP"); |
||||||
|
} |
||||||
|
|
||||||
|
void setup_mqtt() { |
||||||
|
client.setServer(MQTT_SERVER, MQTT_PORT); |
||||||
|
client.setCallback(callback); |
||||||
|
} |
||||||
|
|
||||||
|
void callback(char *topic, byte *message, unsigned int length) { |
||||||
|
Serial.print("Message arrived on topic: "); |
||||||
|
Serial.print(topic); |
||||||
|
Serial.print(". Message: "); |
||||||
|
String messageTemp; |
||||||
|
|
||||||
|
for (int i = 0; i < length; i++) { |
||||||
|
Serial.print((char)message[i]); |
||||||
|
messageTemp += (char)message[i]; |
||||||
|
} |
||||||
|
Serial.println(); |
||||||
|
|
||||||
|
if (String(topic) == MQTT_SUBSCRIBE_PUMP) { |
||||||
|
Serial.print("Starting Pump for: "); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void reconnect_mqtt() { |
||||||
|
// Loop until we're reconnected
|
||||||
|
while (!client.connected()) { |
||||||
|
Serial.print("Attempting MQTT connection..."); |
||||||
|
// Attempt to connect
|
||||||
|
if (client.connect("ESP32-1")) { |
||||||
|
Serial.println("connected"); |
||||||
|
// Subscribe
|
||||||
|
client.subscribe(MQTT_SUBSCRIBE_PUMP); |
||||||
|
} else { |
||||||
|
Serial.print("failed, rc="); |
||||||
|
Serial.print(client.state()); |
||||||
|
Serial.println(" try again in 5 seconds"); |
||||||
|
// Wait 5 seconds before retrying
|
||||||
|
delay(5000); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void publish_mqtt(const char *topic, const char *sensor, float value) { |
||||||
|
char buffer[40]; |
||||||
|
sprintf(buffer, "plant1 %s=%.0f", sensor, value); |
||||||
|
Serial.print("Publishing "); |
||||||
|
Serial.println(buffer); |
||||||
|
client.publish(topic, buffer); |
||||||
|
} |
||||||
|
|
||||||
|
|
@ -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 |
Loading…
Reference in new issue