Skip to content

Commit 99b892c

Browse files
author
Luc
committed
Add Analog to pin control
fix default values as described in documentation
1 parent 4ae6afc commit 99b892c

File tree

2 files changed

+133
-36
lines changed

2 files changed

+133
-36
lines changed

docs/Commands.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ if authentication is on, need admin password
5151
[ESP112]<header answer>
5252

5353
*Get/Set pin value
54-
[ESP201]P<pin> V<value> [PULLUP=YES RAW=YES]pwd=<admin password>
54+
[ESP201]P<pin> V<value> [PULLUP=YES RAW=YES ANALOG=NO ANALOG_RANGE=255 CLEARCHANNELS=NO]pwd=<admin password>
5555
if no V<value> get P<pin> value
5656
if V<value> 0/1 set INPUT_PULLUP value, but for GPIO16 INPUT_PULLDOWN_16
5757
GPIO1 and GPIO3 cannot be used as they are used for serial

src/command.cpp

Lines changed: 132 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727
#include <FS.h>
2828
#if defined(ARDUINO_ARCH_ESP32)
2929
#include "SPIFFS.h"
30-
#define MAX_GPIO 16
31-
#else
3230
#define MAX_GPIO 37
31+
int ChannelAttached2Pin[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
32+
#else
33+
#define MAX_GPIO 16
3334
#endif
3435
#ifdef TIMESTAMP_FEATURE
3536
#include <time.h>
@@ -468,7 +469,7 @@ bool COMMAND::execute_command (int cmd, String cmd_params, tpipe output, level_a
468469

469470
#ifdef DIRECT_PIN_FEATURE
470471
//Get/Set pin value
471-
//[ESP201]P<pin> V<value> [PULLUP=YES RAW=YES]pwd=<admin password>
472+
//[ESP201]P<pin> V<value> [PULLUP=YES RAW=YES ANALOG=NO ANALOG_RANGE=255 CLEARCHANNELS=NO]pwd=<admin password>
472473
case 201:
473474
parameter = get_param (cmd_params, "", true);
474475
#ifdef AUTHENTICATION_FEATURE
@@ -488,52 +489,148 @@ bool COMMAND::execute_command (int cmd, String cmd_params, tpipe output, level_a
488489
response = false;
489490
} else {
490491
int pin = parameter.toInt();
491-
//check pin is valid and not serial used pins
492-
if ( (pin >= 0) && (pin <= 16) && ! ( (pin == 1) || (pin == 3) ) ) {
492+
//check pin is valid
493+
if ((pin >= 0) && (pin <= MAX_GPIO)) {
494+
//check if analog or digital
495+
bool isdigital = true;
496+
497+
parameter = get_param (cmd_params, "ANALOG=", false);
498+
if (parameter == "YES") {
499+
LOG ("Set as analog\r\n")
500+
isdigital=false;
501+
#ifdef ARDUINO_ARCH_ESP32
502+
parameter = get_param (cmd_params, "CLEARCHANNELS=", false);
503+
if (parameter == "YES") {
504+
for (uint8_t p = 0; p < 16;p++){
505+
if(ChannelAttached2Pin[p] != -1){
506+
ledcDetachPin(ChannelAttached2Pin[p]);
507+
ChannelAttached2Pin[p] = -1;
508+
}
509+
}
510+
}
511+
#endif
512+
}
493513
//check if is set or get
494514
parameter = get_param (cmd_params, "V", false);
495515
//it is a get
496516
if (parameter == "") {
497-
//this is to not set pin mode
498-
parameter = get_param (cmd_params, "RAW=", false);
499-
if (parameter != "YES") {
500-
parameter = get_param (cmd_params, "PULLUP=", false);
501-
if (parameter == "YES") {
502-
//GPIO16 is different than others
503-
if (pin < MAX_GPIO) {
504-
LOG ("Set as input pull up\r\n")
505-
pinMode (pin, INPUT_PULLUP);
506-
}
507-
#ifdef ARDUINO_ARCH_ESP8266
508-
else {
509-
LOG ("Set as input pull down 16\r\n")
510-
pinMode (pin, INPUT_PULLDOWN_16);
511-
}
512-
#endif
513-
} else {
514-
LOG ("Set as input\r\n")
515-
pinMode (pin, INPUT);
517+
int value = 0;
518+
if(isdigital) {
519+
//this is to not set pin mode
520+
parameter = get_param (cmd_params, "RAW=", false);
521+
if (parameter == "NO") {
522+
parameter = get_param (cmd_params, "PULLUP=", false);
523+
if (parameter == "NO") {
524+
LOG ("Set as input\r\n")
525+
pinMode (pin, INPUT);
526+
} else {
527+
//GPIO16 is different than others
528+
if (pin < MAX_GPIO) {
529+
LOG ("Set as input pull up\r\n")
530+
pinMode (pin, INPUT_PULLUP);
531+
}
532+
#ifdef ARDUINO_ARCH_ESP8266
533+
else {
534+
LOG ("Set as input pull down 16\r\n")
535+
pinMode (pin, INPUT_PULLDOWN_16);
536+
}
537+
#endif
538+
}
516539
}
540+
value = digitalRead (pin);
541+
} else {
542+
#ifdef ARDUINO_ARCH_ESP8266 //only one ADC on ESP8266 A0
543+
value = analogRead (A0);
544+
#else
545+
value = analogRead (pin);
546+
#endif
517547
}
518-
int value = digitalRead (pin);
519548
LOG ("Read:");
520549
LOG (String (value).c_str() )
521550
LOG ("\n");
522551
ESPCOM::println (String (value).c_str(), output, espresponse);
523552
} else {
524553
//it is a set
525554
int value = parameter.toInt();
526-
//verify it is a 0 or a 1
527-
if ( (value == 0) || (value == 1) ) {
528-
pinMode (pin, OUTPUT);
529-
LOG ("Set:")
530-
LOG (String ( (value == 0) ? LOW : HIGH) )
531-
LOG ("\r\n")
532-
digitalWrite (pin, (value == 0) ? LOW : HIGH);
533-
ESPCOM::println (OK_CMD_MSG, output, espresponse);
555+
if (isdigital) {
556+
//verify it is a 0 or a 1
557+
if ( (value == 0) || (value == 1) ) {
558+
pinMode (pin, OUTPUT);
559+
LOG ("Set:")
560+
LOG (String ( (value == 0) ? LOW : HIGH) )
561+
LOG ("\r\n")
562+
digitalWrite (pin, (value == 0) ? LOW : HIGH);
563+
ESPCOM::println (OK_CMD_MSG, output, espresponse);
564+
} else {
565+
ESPCOM::println (INCORRECT_CMD_MSG, output, espresponse);
566+
response = false;
567+
}
534568
} else {
535-
ESPCOM::println (INCORRECT_CMD_MSG, output, espresponse);
536-
response = false;
569+
int analog_range= 255;
570+
parameter = get_param (cmd_params, "ANALOG_RANGE=", false);
571+
if (parameter.length() > 0) {
572+
analog_range = parameter.toInt();
573+
}
574+
LOG ("Range ")
575+
LOG(String (analog_range).c_str() )
576+
LOG ("\r\n")
577+
if ( (value >= 0) || (value <= analog_range+1) ) {
578+
LOG ("Set:")
579+
LOG (String ( value) )
580+
LOG ("\r\n")
581+
#ifdef ARDUINO_ARCH_ESP8266
582+
583+
analogWriteRange(analog_range);
584+
pinMode(pin, OUTPUT);
585+
analogWrite(pin, value);
586+
#else
587+
int channel = -1;
588+
for (uint8_t p = 0; p < 16;p++){
589+
if(ChannelAttached2Pin[p] == pin){
590+
channel = p;
591+
}
592+
}
593+
if (channel==-1){
594+
for (uint8_t p = 0; p < 16;p++){
595+
if(ChannelAttached2Pin[p] = -1){
596+
channel = p;
597+
ChannelAttached2Pin[p] = pin;
598+
p = 16;
599+
}
600+
}
601+
}
602+
uint8_t resolution = 0;
603+
analog_range++;
604+
switch(analog_range){
605+
case 8191:
606+
resolution=13;
607+
break;
608+
case 1024:
609+
resolution=10;
610+
break;
611+
case 2047:
612+
resolution=11;
613+
break;
614+
case 4095:
615+
resolution=12;
616+
break;
617+
default:
618+
resolution=8;
619+
analog_range = 255;
620+
break;
621+
}
622+
if ((channel==-1) || (value > (analog_range-1))){
623+
ESPCOM::println (INCORRECT_CMD_MSG, output, espresponse);
624+
return false;
625+
}
626+
ledcSetup(channel, 1000, resolution);
627+
ledcAttachPin(pin, channel);
628+
ledcWrite(channel, value);
629+
#endif
630+
} else{
631+
ESPCOM::println (INCORRECT_CMD_MSG, output, espresponse);
632+
response = false;
633+
}
537634
}
538635
}
539636
} else {

0 commit comments

Comments
 (0)