29 Commits
Author SHA1 Message Date
schmidtsi76327 22f141e2cd version model 1.29 added state for inaktiv = LDR ... 2021-07-03 17:44:46 +02:00
schmidtsi76327 f5d6e376c6 FSM2: rm rtm code, change print, add ldr_schwelle 2021-07-03 17:36:10 +02:00
bartschdo76253 eeac10c66f new FSM 2021-07-03 17:09:35 +02:00
schmidtsi76327 e9d16a80d4 FSM 2.0 einfacher xD lol: ) 2021-07-03 13:52:52 +02:00
schmidtsi76327 dcae074b55 pushpull sensor logik 2021-07-03 12:56:58 +02:00
schmidtsi76327 472eba7977 updates to state machine with print function 2021-07-03 12:48:17 +02:00
schmidtsi76327 6a398d9ba0 simulink stateflow compiling 2021-07-03 11:33:20 +02:00
schmidtsi76327 f28aa2df8b stripped out RTM Model interface and custom types from matlab 2021-07-03 11:31:46 +02:00
schmidtsi76327 754da9f931 added simulink stateflow c++ fsm 2021-07-03 11:21:18 +02:00
schmidtsi76327 df2a8fa1e3 delete remove .vscode folder 2021-07-02 18:23:51 +02:00
schmidtsi76327 dc159a35d0 readded submodule 2021-07-02 18:21:32 +02:00
schmidtsi76327 2378ca80b9 gitignore 2021-07-02 17:53:31 +02:00
schmidtsi76327 79ff1f0d33 Merge branch 'master' of https://git.efi.th-nuernberg.de/gitea/schmidtsi76327/ESP8266_Treppenlicht 2021-07-02 17:51:31 +02:00
schmidtsi76327 6a36971406 small corrections 2021-07-02 17:51:16 +02:00
bartschdo76253 714fcb4b18 tested interrupts on GPIOs 2, 12 2021-07-02 16:25:54 +02:00
schmidtsi76327 712acf3541 all right 2021-06-30 20:33:51 +02:00
schmidtsi76327 df89c9716c Merge branch 'master' of https://git.efi.th-nuernberg.de/gitea/schmidtsi76327/ESP8266_Treppenlicht 2021-06-30 20:33:26 +02:00
schmidtsi76327 66e8ddb2d9 updates to http terminal 2021-06-30 20:33:16 +02:00
bartschdo76253 5b197288bc back to normal 2021-06-30 16:50:00 +02:00
bartschdo76253 a9f098097c switched to linear phase balance 2021-06-30 16:09:46 +02:00
bartschdo76253 a0f6a5aec3 pin optimizations 2021-06-30 11:23:56 +02:00
schmidtsi76327 633b99f818 missing ret val 2021-06-30 09:34:11 +02:00
bartschdo76253 5d32392844 merged treppe.cpp 2021-06-28 15:49:07 +02:00
bartschdo76253 50e714e5f8 Merge branch 'master' of https://git.efi.th-nuernberg.de/gitea/schmidtsi76327/ESP8266_Treppenlicht 2021-06-28 15:48:29 +02:00
bartschdo76253 e0bc75826f added OE Pin for PCB 2021-06-28 15:47:10 +02:00
schmidtsi76327 3d13e761f4 update templ.ini and doku 2021-06-27 02:01:25 +02:00
schmidtsi76327 3c824bfc92 much simpler callback approach due to serveStatic with directories !!! 2021-06-27 01:56:30 +02:00
schmidtsi76327 9ea541a1b4 lambda error 2021-06-26 21:11:19 +02:00
schmidtsi76327 b89604edc3 simple serial monitor in httpserver 2021-06-26 10:49:29 +02:00
19 changed files with 655 additions and 268 deletions

No files matched your search

+2
View File
@@ -1,5 +1,7 @@
.pio .pio
.vscode .vscode
.vscode/*
.vscode/**
compress compress
data_gz data_gz
platformio.ini platformio.ini
-7
View File
@@ -1,7 +0,0 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}
-53
View File
@@ -1,53 +0,0 @@
{
"files.associations": {
"random": "cpp",
"array": "cpp",
"*.tcc": "cpp",
"deque": "cpp",
"list": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"string_view": "cpp",
"memory": "cpp",
"ranges": "cpp",
"initializer_list": "cpp",
"utility": "cpp",
"atomic": "cpp",
"bit": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"compare": "cpp",
"concepts": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"map": "cpp",
"set": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"iosfwd": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp"
},
"python.pythonPath": "C:\\Users\\simon\\AppData\\Local\\Programs\\Python\\Python37\\python.exe"
}
-12
View File
@@ -1,12 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Ich bin ein komrpimierter Test</title>
I bims der Head
</head>
<body>
I bims der Body
</body>
</html>
+7
View File
@@ -60,6 +60,13 @@
</div> </div>
</div> </div>
<div class="terminal">
<input type="button" id="clear_term" value="clear" onclick="clearTerminal();">
<input type="checkbox" id="scroll" name="scroll" value="scroll" checked>
<label for="scroll"> autoscroll </label>
<textarea id="term">waiting for log messages ...&#10;</textarea>
</div>
</body> </body>
<script src="/input.js"></script> <script src="/input.js"></script>
+38 -6
View File
@@ -1,8 +1,40 @@
var slider = document.getElementById("range1"); // var slider = document.getElementById("helligkeit");
var output = document.getElementById("l_pwm"); // var output = document.getElementById("l_pwm");
output.innerHTML = slider.value; // Display the default slider value // output.innerHTML = slider.value; // Display the default slider value
// Update the current slider value (each time you drag the slider handle) // // Update the current slider value (each time you drag the slider handle)
slider.oninput = function() { // slider.oninput = function() {
output.innerHTML = this.value; // output.innerHTML = this.value;
// }
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4) {
if (xhr.status == 200){
console.log(xhr.responseText);
terminal = document.getElementById("term");
autoscroll = document.getElementById("scroll");
terminal.innerHTML += xhr.responseText;
if(autoscroll.checked)
terminal.scrollTop = terminal.scrollHeight;
}
else {
console.log("status:", xhr.status);
}
}
}
function reloadTerminal() {
xhr.open("POST", "/app=terminal", true);
xhr.send();
setTimeout(reloadTerminal, 1000);
};
reloadTerminal();
function clearTerminal() {
document.getElementById("term").innerHTML = '';
} }
+19 -3
View File
@@ -3,7 +3,7 @@ html {
font-family: sans-serif, Arial, Helvetica; font-family: sans-serif, Arial, Helvetica;
background-color: #d4d4d4; background-color: #d4d4d4;
height: 100%; height: 100%;
background-image: url('Background.png'); /* background-image: url('Background.png'); */
background-repeat: repeat; background-repeat: repeat;
background-size: 150% 150%; background-size: 150% 150%;
} }
@@ -67,8 +67,6 @@ input[type=range]::-webkit-slider-thumb{
} }
/*-------------------------------------------------------*/ /*-------------------------------------------------------*/
@@ -103,4 +101,22 @@ input:checked + .slider:before {
-ms-transform: translateX(26px); -ms-transform: translateX(26px);
transform: translateX(26px); transform: translateX(26px);
} }
*/
.terminal {
margin:5%;
padding: 1%;
width: 80%;
border: 1px solid black;
border-radius: 5px;
}
#term {
font-size: large;
width: 100%;
height: 20em;
}
#clear_term {
margin: 2px;
}
+4
View File
@@ -75,8 +75,12 @@ PlatformIO Library veraltet !!
### TIMER in OTA unterbrechen !!!!! ### TIMER in OTA unterbrechen !!!!!
### further improvments ### further improvments
with streamFile gzip encoded Files can be sent with streamFile gzip encoded Files can be sent
this reduces space on fs ! this reduces space on fs !
new easier script needed to just convert to .gz new easier script needed to just convert to .gz
maybe measure timings on ESP maybe measure timings on ESP
__=> use serveStatic because way simpler !__
-46
View File
@@ -1,46 +0,0 @@
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
-7
View File
@@ -1,12 +1,5 @@
#include "filesys.h" #include "filesys.h"
// listDir("/");
// deleteFile("/hello.txt");
// writeFile("/hello.txt", "Hello ");
// appendFile("/hello.txt", "World!\n\r");
// printFile("/hello.txt");
// listDir("/");
FSInfo fsinfo; FSInfo fsinfo;
bool mount_fs() { bool mount_fs() {
+2
View File
@@ -2,6 +2,8 @@
#include <LittleFS.h> #include <LittleFS.h>
// some usefull wrappers for Filesystem
bool mount_fs(); bool mount_fs();
bool format_fs(); bool format_fs();
+61 -10
View File
@@ -1,17 +1,68 @@
#include "httpserver.h" #include "httpserver.h"
bool HTTPServer::addRootFileHandler() { bool HTTPServer::start() {
if(!mount_fs()) {
logf("cant mount filesystem, EXIT !\n\r");
return false;
}
logf("LittleFS mounted !\n\r");
logf("root:\n\r");
this->listRoot();
logf("\n\r");
// //experimental, see doku.md // default handler
// server.serveStatic("/compressed", LittleFS, "/compressed.html.gzip"); this->onNotFound([this]() {
String message = "File Not Found\n\n";
message += "URI: ";
message += uri();
message += "\nMethod: ";
message += (method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += args();
message += "\n";
this->serveStatic("", LittleFS, "/index.html"); for (uint8_t i = 0; i < args(); i++) {
this->serveStatic("/", LittleFS, "/index.html"); message += " " + argName(i) + ": " + arg(i) + "\n";
this->serveStatic("/#", LittleFS, "/index.html"); }
this->serveStatic("/style.css", LittleFS, "/style.css"); send(404, "text/plain", message);
this->serveStatic("/input.js", LittleFS, "/input.js"); });
this->serveStatic("/favicon.png", LittleFS, "/favicon.png");
// add static root file handler for http
this->serveStatic("/", LittleFS, "/");
this->begin();
Serial.printf("Server active on Port 80 !\n\r");
return true;
}
void HTTPServer::logf(const char *format, ...) {
va_list args;
va_start(args, format);
char temp[64];
size_t len = vsnprintf(temp, sizeof(temp), format, args);
Serial.print(log_prefix);
Serial.write(temp, len);
va_end(args);
}
void HTTPServer::logt(const char *format, ...) {
va_list args;
va_start(args, format);
// append logging string to local buffer
if(tbuf_head < TBUF_LEN) {
size_t len = vsnprintf(tbuf+tbuf_head, TBUF_LEN-tbuf_head, format, args);
tbuf_head += len;
}
va_end(args);
}
void HTTPServer::start_apps() {
// application handler
this->on("/app=terminal", HTTP_POST, [this]() {
if(tbuf_head) {
send(200, "text/plain", tbuf);
tbuf_head = 0;
}
});
return true;
} }
+21 -65
View File
@@ -1,16 +1,26 @@
// Wrapper for ESP8266WebServer with Filesystem as HTTP source
#pragma once #pragma once
#include "filesys.h"
#include <ESP8266WebServer.h> #include <ESP8266WebServer.h>
#include <stdarg.h>
#include "filesys.h"
// debug log <ESP8266WebServer.h>
// #define DEBUGV(f,...) do { Serial.printf(PSTR(f), ##__VA_ARGS__); } while (0)
#define TBUF_LEN 256
class HTTPServer : public ESP8266WebServer { class HTTPServer : public ESP8266WebServer {
private:
const char* rootDir;
bool addRootFileHandler(); private:
bool formatFS() { const char* rootDir = "/";
return format_fs(); const char* log_prefix = "[HTTPServer] ";
}
size_t tbuf_head = 0;
char tbuf[TBUF_LEN];
void listRoot() { void listRoot() {
ls(rootDir); ls(rootDir);
} }
@@ -24,63 +34,9 @@ public:
Serial.printf("[HTTPServer] shut down ...\n\r"); Serial.printf("[HTTPServer] shut down ...\n\r");
} }
bool start() { bool start();
if(!mount_fs()) void start_apps();
return false;
Serial.printf("[HTTPServer] LittleFS mounted !\n\r");
Serial.printf("[HTTPServer] root:\n\r"); void logf(const char *format, ...);
this->listRoot(); void logt(const char *format, ...);
Serial.printf("\n\r");
// https://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11
on("/compress.html", [this]() {
File f = open("/compress.html.gz");
if (!f) {
Serial.println("Failed to open file for reading");
}
else
{
Serial.println("Streaming /compress.html.gz to client");
const String cont = "text/html";
streamFile(f, cont);
}
});
on("/comp.html", [this]() {
File f = open("/comp.html.gz");
if (!f) {
Serial.println("Failed to open file for reading");
}
else
{
Serial.println("Streaming /comp.html.gz to client");
const String cont = "text/html";
streamFile(f, cont);
}
});
onNotFound([this]() {
String message = "File Not Found\n\n";
message += "URI: ";
message += uri();
message += "\nMethod: ";
message += (method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += args();
message += "\n";
for (uint8_t i = 0; i < args(); i++) {
message += " " + argName(i) + ": " + arg(i) + "\n";
}
send(404, "text/plain", message);
});
if( this->addRootFileHandler() ){
this->begin();
Serial.printf("[HTTPServer] Server active on Port 80 !\n\r");
return true;
}
Serial.printf("[HTTPServer] Not starting Server, something went wrong !\n\r");
return false;
}
}; };
+237
View File
@@ -0,0 +1,237 @@
//
// Academic License - for use in teaching, academic research, and meeting
// course requirements at degree granting institutions only. Not for
// government, commercial, or other organizational use.
//
// File: FSMTreppe.cpp
//
// Code generated for Simulink model 'FSMTreppe'.
//
// Model version : 1.29
// Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
// C/C++ source code generated on : Sat Jul 3 17:39:25 2021
//
// Target selection: ert.tlc
// Embedded hardware selection: ARM Compatible->ARM Cortex-M
// Code generation objectives: Unspecified
// Validation result: Not run
//
#include "FSMTreppe2.h"
#include <stdint.h>
// Named constants for Chart: '<Root>/FSMTreppe'
const uint8_t FSMTreppe_IN_abdimmen_hoch = 1U;
const uint8_t FSMTreppe_IN_abdimmen_runter = 2U;
const uint8_t FSMTreppe_IN_aufdimmen_hoch = 3U;
const uint8_t FSMTreppe_IN_aufdimmen_runter = 4U;
const uint8_t FSMTreppe_IN_inaktiv = 5U;
const uint8_t FSMTreppe_IN_ruhezustand = 6U;
const uint8_t FSMTreppe_IN_warten_hoch = 7U;
const uint8_t FSMTreppe_IN_warten_runter = 8U;
// Model step function
void FSMTreppeModelClass::step()
{
// Chart: '<Root>/FSMTreppe' incorporates:
// Inport: '<Root>/anim_beendet'
// Inport: '<Root>/ldr_schwelle'
// Inport: '<Root>/sensor_oben'
// Inport: '<Root>/sensor_unten'
if (FSMTreppe_DW.temporalCounter_i1 < 511U) {
FSMTreppe_DW.temporalCounter_i1 = static_cast<uint16_t>
(FSMTreppe_DW.temporalCounter_i1 + 1U);
}
if (FSMTreppe_DW.is_active_c3_FSMTreppe == 0U) {
FSMTreppe_DW.is_active_c3_FSMTreppe = 1U;
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_inaktiv;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 0U;
} else {
switch (FSMTreppe_DW.is_c3_FSMTreppe) {
case FSMTreppe_IN_abdimmen_hoch:
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 0U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 4U;
if (FSMTreppe_U.anim_beendet || (FSMTreppe_DW.temporalCounter_i1 >= 500U))
{
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_ruhezustand;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 1U;
}
break;
case FSMTreppe_IN_abdimmen_runter:
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 0U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 7U;
if (FSMTreppe_U.anim_beendet || (FSMTreppe_DW.temporalCounter_i1 >= 500U))
{
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_ruhezustand;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 1U;
}
break;
case FSMTreppe_IN_aufdimmen_hoch:
// Outport: '<Root>/laufrichtung'
FSMTreppe_Y.laufrichtung = 1U;
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 1U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 2U;
if (FSMTreppe_U.anim_beendet || (FSMTreppe_DW.temporalCounter_i1 >= 500U))
{
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_warten_hoch;
FSMTreppe_DW.temporalCounter_i1 = 0U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 3U;
}
break;
case FSMTreppe_IN_aufdimmen_runter:
// Outport: '<Root>/laufrichtung'
FSMTreppe_Y.laufrichtung = 0U;
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 1U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 5U;
if (FSMTreppe_U.anim_beendet || (FSMTreppe_DW.temporalCounter_i1 >= 500U))
{
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_warten_runter;
FSMTreppe_DW.temporalCounter_i1 = 0U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 6U;
}
break;
case FSMTreppe_IN_inaktiv:
// Outport: '<Root>/status'
FSMTreppe_Y.status = 0U;
if (FSMTreppe_U.ldr_schwelle == 1.0) {
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_ruhezustand;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 1U;
}
break;
case FSMTreppe_IN_ruhezustand:
// Outport: '<Root>/status'
FSMTreppe_Y.status = 1U;
if (FSMTreppe_U.sensor_unten) {
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_aufdimmen_hoch;
FSMTreppe_DW.temporalCounter_i1 = 0U;
// Outport: '<Root>/laufrichtung'
FSMTreppe_Y.laufrichtung = 1U;
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 1U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 2U;
} else if (FSMTreppe_U.sensor_oben) {
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_aufdimmen_runter;
FSMTreppe_DW.temporalCounter_i1 = 0U;
// Outport: '<Root>/laufrichtung'
FSMTreppe_Y.laufrichtung = 0U;
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 1U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 5U;
} else if (FSMTreppe_U.ldr_schwelle == 0.0) {
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_inaktiv;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 0U;
}
break;
case FSMTreppe_IN_warten_hoch:
// Outport: '<Root>/status'
FSMTreppe_Y.status = 3U;
if (FSMTreppe_U.sensor_oben || (FSMTreppe_DW.temporalCounter_i1 >= 500U))
{
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_abdimmen_hoch;
FSMTreppe_DW.temporalCounter_i1 = 0U;
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 0U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 4U;
}
break;
default:
// Outport: '<Root>/status'
// case IN_warten_runter:
FSMTreppe_Y.status = 6U;
if (FSMTreppe_U.sensor_unten || (FSMTreppe_DW.temporalCounter_i1 >= 500U))
{
FSMTreppe_DW.is_c3_FSMTreppe = FSMTreppe_IN_abdimmen_runter;
FSMTreppe_DW.temporalCounter_i1 = 0U;
// Outport: '<Root>/dimmrichtung'
FSMTreppe_Y.dimmrichtung = 0U;
// Outport: '<Root>/status'
FSMTreppe_Y.status = 7U;
}
break;
}
}
// End of Chart: '<Root>/FSMTreppe'
}
// Model initialize function
void FSMTreppeModelClass::initialize()
{
// (no initialization code required)
}
// Model terminate function
void FSMTreppeModelClass::terminate()
{
// (no terminate code required)
}
// Constructor
FSMTreppeModelClass::FSMTreppeModelClass() :
FSMTreppe_DW(),
FSMTreppe_U(),
FSMTreppe_Y()
{
// Currently there is no constructor body generated.
}
// Destructor
FSMTreppeModelClass::~FSMTreppeModelClass()
{
// Currently there is no destructor body generated.
}
//
// File trailer for generated code.
//
// [EOF]
//
+119
View File
@@ -0,0 +1,119 @@
//
// Academic License - for use in teaching, academic research, and meeting
// course requirements at degree granting institutions only. Not for
// government, commercial, or other organizational use.
//
// File: FSMTreppe.h
//
// Code generated for Simulink model 'FSMTreppe'.
//
// Model version : 1.28
// Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
// C/C++ source code generated on : Sat Jul 3 13:50:17 2021
//
// Target selection: ert.tlc
// Embedded hardware selection: ARM Compatible->ARM Cortex-M
// Code generation objectives: Unspecified
// Validation result: Not run
//
#ifndef RTW_HEADER_FSMTreppe_h_
#define RTW_HEADER_FSMTreppe_h_
#include <stdint.h>
// Class declaration for model FSMTreppe
class FSMTreppeModelClass {
// public data and function members
public:
// Block states (default storage) for system '<Root>'
struct DW_FSMTreppe_T {
uint16_t temporalCounter_i1; // '<Root>/FSMTreppe'
uint8_t is_active_c3_FSMTreppe; // '<Root>/FSMTreppe'
uint8_t is_c3_FSMTreppe; // '<Root>/FSMTreppe'
};
// External inputs (root inport signals with default storage)
struct ExtU_FSMTreppe_T {
bool sensor_unten; // '<Root>/sensor_unten'
bool sensor_oben; // '<Root>/sensor_oben'
bool anim_beendet; // '<Root>/anim_beendet'
double ldr_schwelle; // '<Root>/ldr_schwelle'
};
// External outputs (root outports fed by signals with default storage)
struct ExtY_FSMTreppe_T {
uint8_t laufrichtung; // '<Root>/laufrichtung'
uint8_t status; // '<Root>/status'
uint8_t dimmrichtung; // '<Root>/dimmrichtung'
};
// model initialize function
void initialize();
// model step function
void step();
// model terminate function
void terminate();
// Constructor
FSMTreppeModelClass();
// Destructor
~FSMTreppeModelClass();
// Root-level structure-based inputs set method
// Root inports set method
void setExternalInputs(const ExtU_FSMTreppe_T* pExtU_FSMTreppe_T)
{
FSMTreppe_U = *pExtU_FSMTreppe_T;
}
// Root-level structure-based outputs get method
// Root outports get method
const FSMTreppeModelClass::ExtY_FSMTreppe_T & getExternalOutputs() const
{
return FSMTreppe_Y;
}
// private data and function members
private:
// Block states
DW_FSMTreppe_T FSMTreppe_DW;
// External inputs
ExtU_FSMTreppe_T FSMTreppe_U;
// External outputs
ExtY_FSMTreppe_T FSMTreppe_Y;
};
//-
// The generated code includes comments that allow you to trace directly
// back to the appropriate location in the model. The basic format
// is <system>/block_name, where system is the system number (uniquely
// assigned by Simulink) and block_name is the name of the block.
//
// Note that this particular code originates from a subsystem build,
// and has its own system numbers different from the parent model.
// Refer to the system hierarchy for this subsystem below, and use the
// MATLAB hilite_system command to trace the generated code back
// to the parent model. For example,
//
// hilite_system('FSM_Treppenlicht/FSMTreppe') - opens subsystem FSM_Treppenlicht/FSMTreppe
// hilite_system('FSM_Treppenlicht/FSMTreppe/Kp') - opens and selects block Kp
//
// Here is the system hierarchy for this model
//
// '<Root>' : 'FSM_Treppenlicht'
// '<S1>' : 'FSM_Treppenlicht/FSMTreppe'
#endif // RTW_HEADER_FSMTreppe_h_
//
// File trailer for generated code.
//
// [EOF]
//
+48 -38
View File
@@ -86,7 +86,7 @@ void Treppe::rampe()
{ {
if(state) { if(state) {
finish = 0; finish = 0;
state = 0; // set parameter memory state = 0;// set parameter memory
} }
if(!finish) { if(!finish) {
@@ -132,66 +132,76 @@ void Treppe::rampe()
} }
void Treppe::setup(){ void Treppe::setup(){
Serial.printf("differenz_pwm_pro_tick %f\n", differenz_pwm_pro_tick);
pwmController.resetDevices(); pwmController.resetDevices();
// Deactive PCA9685 Phase Balancer due to LED Flickering // Deactive PCA9685 Phase Balancer due to LED Flickering
// https://github.com/NachtRaveVL/PCA9685-Arduino/issues/15 // https://github.com/NachtRaveVL/PCA9685-Arduino/issues/15
// see also lib/PCA9685-Arduin/PCA9685.h:204 // see also lib/PCA9685-Arduin/PCA9685.h:204
pwmController.init(PCA9685_PhaseBalancer_None); pwmController.init(PCA9685_PhaseBalancer_None);
pwmController.setPWMFrequency(200); //pwmController.init(PCA9685_PhaseBalancer_Linear);
pwmController.setPWMFrequency(100);
pwmController.setAllChannelsPWM(idle_brightness); pwmController.setAllChannelsPWM(idle_brightness);
pinMode(SENSOR1, INPUT); pinMode(A0, INPUT);
pinMode(SENSOR2, INPUT); pinMode(SENSOR_OBEN, INPUT);
pinMode(SENSOR_UNTEN, INPUT);
pinMode(OE, OUTPUT);
digitalWrite(OE, 0);
Serial.printf("differenz_pwm_pro_tick %f\n", differenz_pwm_pro_tick);
Serial.println("Hello from Treppe"); Serial.println("Hello from Treppe");
Serial.print("Treppe: initial parameters: stairs="); Serial.print("Treppe: initial parameters: stairs=");
Serial.println(stairs); Serial.println(stairs);
} }
void Treppe::print_state_on_change() {
static FSMTreppeModelClass::ExtU_FSMTreppe_T last_in;
static FSMTreppeModelClass::ExtY_FSMTreppe_T last_out;
if(
fsm_inputs.anim_beendet != last_in.anim_beendet ||
fsm_inputs.sensor_oben != last_in.sensor_oben ||
fsm_inputs.sensor_unten != last_in.sensor_unten ||
fsm_outputs.dimmrichtung != last_out.dimmrichtung ||
fsm_outputs.laufrichtung != last_out.laufrichtung ||
fsm_outputs.status != last_out.status
) {
last_in.anim_beendet = fsm_inputs.anim_beendet;
last_in.sensor_oben = fsm_inputs.sensor_oben;
last_in.sensor_unten = fsm_inputs.sensor_unten;
Serial.printf("FSM IN: s_u: %d, s_o: %d, beendet: %d =>",
fsm_inputs.sensor_oben, fsm_inputs.sensor_unten, fsm_inputs.anim_beendet);
Serial.print(" step => ");
Serial.printf("OUT: LR: %d DR: %d ST: %d\n",
fsm_outputs.laufrichtung, fsm_outputs.dimmrichtung, fsm_outputs.status);
}
}
void Treppe::task(){ void Treppe::task(){
//Serial.printf("LDR: %f\n", ((float)analogRead(A0))/1023.*3.68);
if(finish){ if(finish){
direction = switch_direction; direction = switch_direction;
state = switch_state; state = switch_state;
} }
static uint8_t last_sensor_state[2] = {0,0};
uint8_t current_sensor_state[2] = {0,0};
current_sensor_state[0] = digitalRead(SENSOR1);
current_sensor_state[1] = digitalRead(SENSOR2);
if(current_sensor_state[0] && !last_sensor_state[0] && state == 0){ fsm_inputs.ldr_schwelle = true;
setTick(0); fsm_inputs.sensor_oben = read_sensor(SENSOR_OBEN);
setAnAus(1); fsm_inputs.sensor_unten = read_sensor(SENSOR_UNTEN);
setDirection(1); fsm_inputs.anim_beendet = static_cast<bool>(finish);
setState(1);
}
if(current_sensor_state[1] && !last_sensor_state[1] && state == 0){ FSMTreppe_Obj.setExternalInputs(&fsm_inputs);
setTick(0); FSMTreppe_Obj.step();
setAnAus(0); fsm_outputs = FSMTreppe_Obj.getExternalOutputs();
setDirection(0); print_state_on_change();
setState(1);
}
// first switch - off approach, use timer later direction = fsm_outputs.laufrichtung;
if(!current_sensor_state[0] && last_sensor_state[0] && state == 1){ state = fsm_outputs.dimmrichtung;
setTick(ticks_treppe);
setAnAus(1);
setDirection(1);
setState(0);
}
if(!current_sensor_state[1] && last_sensor_state[1] && state == 1){ // setTick(ticks_treppe);
setTick(ticks_treppe); // setAnAus(1);
setAnAus(1); // setDirection(0);
setDirection(0); // setState(0);
setState(0);
}
last_sensor_state[0] = current_sensor_state[0];
last_sensor_state[1] = current_sensor_state[1];
ledsequence(); ledsequence();
} }
+30 -8
View File
@@ -1,24 +1,27 @@
#pragma once #pragma once
#include "FSMTreppe/FSMTreppe2.h"
#include "PCA9685.h" #include "PCA9685.h"
#define SENSOR1 15 #define SENSOR_OBEN 2
#define SENSOR2 12 #define SENSOR_UNTEN 12
#define OE 14
#define INT_TIME 20 // interrupt intervall [ms] #define INT_TIME 20 // interrupt intervall [ms]
class Treppe { class Treppe {
private: private:
uint8_t stairs; uint8_t stairs;
uint16_t time_per_stair = 300; // dimmtime per stair [ms] uint16_t time_per_stair = 300; // dimmtime per stair [ms]
uint16_t idle_brightness = 0; uint16_t idle_brightness = 100;
uint16_t active_brightness = 500; uint16_t active_brightness = 300;
uint8_t direction = 0; uint8_t direction = 0;
uint8_t switch_direction = 0; uint8_t switch_direction = 0;
uint8_t state = 0; uint8_t state = 0;
uint8_t switch_state = 0; uint8_t switch_state = 0;
uint8_t finish = 1; bool finish = 1;
// alternative // alternative
uint32_t tick = 0; uint32_t tick = 0;
@@ -30,21 +33,40 @@ private:
float differenz_pwm_pro_tick = 0.0; float differenz_pwm_pro_tick = 0.0;
// alternative // alternative
// initialize with i2c-Address 0, use Wire Library // initialize with i2c-Address 0, use Wire Library
PCA9685 pwmController; PCA9685 pwmController;
FSMTreppeModelClass FSMTreppe_Obj;
FSMTreppeModelClass::ExtU_FSMTreppe_T fsm_inputs;
FSMTreppeModelClass::ExtY_FSMTreppe_T fsm_outputs;
void print_state_on_change();
const uint8_t FSMTreppe_IN_animation_down = 1U;
const uint8_t FSMTreppe_IN_animation_up = 2U;
const uint8_t FSMTreppe_IN_idle = 3U;
uint8_t softstart_led(uint8_t led, uint16_t startval, uint16_t stopval); uint8_t softstart_led(uint8_t led, uint16_t startval, uint16_t stopval);
void ledsequence(); void ledsequence();
void rampe(); void rampe();
bool read_sensor(int sensor) {
int pegel = digitalRead(sensor);
return static_cast<bool>(pegel);
}
public: public:
Treppe(uint8_t _stairs) : stairs(_stairs){ Treppe(uint8_t _stairs) : stairs(_stairs){
FSMTreppe_Obj.initialize();
ticks_pro_stufe = time_per_stair / 20; // [ms] ticks_pro_stufe = time_per_stair / 20; // [ms]
ticks_treppe = ticks_pro_stufe * stairs; ticks_treppe = ticks_pro_stufe * stairs;
differenz_pwm_pro_tick = (float) (active_brightness - idle_brightness) differenz_pwm_pro_tick = (float) (active_brightness - idle_brightness)
/ (float) ticks_pro_stufe; / (float) ticks_pro_stufe;
} }
~Treppe() {
FSMTreppe_Obj.terminate();
}
void setup(); void setup();
void task(); // call periodically void task(); // call periodically
+25 -10
View File
@@ -27,6 +27,13 @@ Treppe stairs(16);
const char* ssid = STASSID; const char* ssid = STASSID;
const char* password = STAPSK; const char* password = STAPSK;
// port 80, root directory of server '/'
HTTPServer httpServer(80, "/");
uint32_t _t=0;
#define SP_US(_str,_a) Serial.print(_str); Serial.print(" took: "); Serial.print(_a); Serial.println("us")
#define TIMEIF_US(_f, _l, _str) _t=micros(); _f; _t=micros()-_t; if(_t > _l) { SP_US(_str, _t); }
void timerCallback(void *pArg) void timerCallback(void *pArg)
{ {
@@ -34,27 +41,23 @@ void timerCallback(void *pArg)
stairs.task(); stairs.task();
} }
// port 80, root directory of server '/'
HTTPServer httpServer(80, "/");
uint32_t _t=0;
#define SP_US(_str,_a) Serial.print(_str); Serial.print(" took: "); Serial.print(_a); Serial.println("us")
#define TIMEIF_US(_f, _l, _str) _t=micros(); _f; _t=micros()-_t; if(_t > _l) { SP_US(_str, _t); }
// =============================================== // ===============================================
uint8_t inter = 0;
ICACHE_RAM_ATTR void int_test(){
inter = 1;
}
void setup() { void setup() {
#ifdef WITH_DEBUGGING_ON #ifdef WITH_DEBUGGING_ON
Serial.begin(460800); Serial.begin(460800);
gdbstub_init(); gdbstub_init();
#else #else
Serial.begin(115200); Serial.begin(76800);
#endif #endif
Serial.println(F("Booting ....")); Serial.println(F("Booting ...."));
pinMode(NODEMCU_LED, OUTPUT); //pinMode(NODEMCU_LED, OUTPUT);
pinMode(ESP12_LED, OUTPUT); pinMode(ESP12_LED, OUTPUT);
Wire.begin(); // Wire must be started first Wire.begin(); // Wire must be started first
@@ -78,10 +81,14 @@ void setup() {
ota_setup(); ota_setup();
httpServer.start(); httpServer.start();
httpServer.start_apps();
Serial.println("HTTP server started !"); Serial.println("HTTP server started !");
stairs.setup(); stairs.setup();
Serial.println("PCA9685 connected !"); Serial.println("PCA9685 connected !");
//attachInterrupt(digitalPinToInterrupt(2), int_test, RISING);
//attachInterrupt(digitalPinToInterrupt(12), int_test, RISING);
os_timer_setfn(&timer1, timerCallback, &timer_flag); os_timer_setfn(&timer1, timerCallback, &timer_flag);
os_timer_arm(&timer1, 20, true); os_timer_arm(&timer1, 20, true);
@@ -89,6 +96,8 @@ void setup() {
#include <random> #include <random>
uint32_t c = 0;
void loop() { void loop() {
// if(stairs.getState() == 0) { // if(stairs.getState() == 0) {
// delay(1000); // delay(1000);
@@ -102,6 +111,12 @@ void loop() {
// stairs.setDirection(!stairs.getDirection()); // stairs.setDirection(!stairs.getDirection());
// stairs.setState(1); // stairs.setState(1);
// } // }
if(inter){
Serial.printf("interrupt\n");
inter = 0;
}
if(c++%1000000 == 0)
httpServer.logt("[%d] starting :)\n", c);
TIMEIF_US(ArduinoOTA.handle(), 10000, "OTA"); TIMEIF_US(ArduinoOTA.handle(), 10000, "OTA");
TIMEIF_US(httpServer.handleClient(), 10000, "HTTP"); TIMEIF_US(httpServer.handleClient(), 10000, "HTTP");
+42 -3
View File
@@ -8,23 +8,29 @@
; Please visit documentation for the other options and examples ; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[env] [platformio]
description = ESP8266 Treppenlicht Steuerung
default_envs = ota
; test_dir = test
data_dir = data_gz
[env:hardware]
platform = espressif8266 platform = espressif8266
board = nodemcuv2 board = nodemcuv2
framework = arduino framework = arduino
; for http files
board_build.filesystem = littlefs board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m1m.ld board_build.ldscript = eagle.flash.4m1m.ld
extra_scripts = pre:create_gz_files.py extra_scripts = pre:create_gz_files.py
monitor_speed = 115200 monitor_speed = 115200
[env:serial] [env:serial]
extends = env:hardware
upload_protocol = esptool upload_protocol = esptool
upload_speed = 921600 upload_speed = 921600
[env:ota] [env:ota]
extends = env:hardware
; OTA => https://docs.platformio.org/en/latest/platforms/espressif8266.html#over-the-air-ota-update ; OTA => https://docs.platformio.org/en/latest/platforms/espressif8266.html#over-the-air-ota-update
upload_protocol = espota upload_protocol = espota
upload_port = <!! IP ADDRESS !!> upload_port = <!! IP ADDRESS !!>
@@ -33,13 +39,46 @@ upload_flags =
--host_port=<!! PORT !!> --host_port=<!! PORT !!>
--auth=admin --auth=admin
[env:debug] [env:debug]
extends = env:hardware
; look at doku.md ; look at doku.md
build_flags = -DWITH_DEBUGGING_ON -Os -g3 -ggdb3 build_flags = -DWITH_DEBUGGING_ON -Os -g3 -ggdb3
upload_protocol = esptool upload_protocol = esptool
upload_speed = 921600 upload_speed = 921600
# This file is used compile and run tests located in the `unit` directory.
# For more info, see:
# https://docs.platformio.org/en/latest/plus/unit-testing.html
# https://github.com/ThrowTheSwitch/Unity
# https://github.com/ThrowTheSwitch/Unity/blob/master/docs/UnityAssertionsReference.md
# To prepare coverage data for lcov, add ${coverage.build_flags} to env:test build flags
# To actually generate coverage report:
# $ `pio test` / run the test `program` manually
# $ lcov --include (readlink -f ../espurna)'/*' --capture --directory .pio/build/test/ --output-file test.info
# $ genhtml --ignore-errors source test.info --output-directory out
[coverage]
build_flags = -lgcov -fprofile-arcs -ftest-coverage
[env:test]
extends = env:hardware
[env:native]
platform = native
test_build_project_src = true
build_flags =
-DMANUFACTURER="PLATFORMIO"
-DDEVICE="TEST"
-std=gnu++11
-g
-Os
-I lib/treppe
-I lib/PCA9685-Arduino