27
27
#include < FS.h>
28
28
#if defined(ARDUINO_ARCH_ESP32)
29
29
#include " SPIFFS.h"
30
- #define MAX_GPIO 16
31
- #else
32
30
#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
33
34
#endif
34
35
#ifdef TIMESTAMP_FEATURE
35
36
#include < time.h>
@@ -468,7 +469,7 @@ bool COMMAND::execute_command (int cmd, String cmd_params, tpipe output, level_a
468
469
469
470
#ifdef DIRECT_PIN_FEATURE
470
471
// 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>
472
473
case 201 :
473
474
parameter = get_param (cmd_params, " " , true );
474
475
#ifdef AUTHENTICATION_FEATURE
@@ -488,52 +489,148 @@ bool COMMAND::execute_command (int cmd, String cmd_params, tpipe output, level_a
488
489
response = false ;
489
490
} else {
490
491
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
+ }
493
513
// check if is set or get
494
514
parameter = get_param (cmd_params, " V" , false );
495
515
// it is a get
496
516
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
+ }
516
539
}
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
517
547
}
518
- int value = digitalRead (pin);
519
548
LOG (" Read:" );
520
549
LOG (String (value).c_str () )
521
550
LOG (" \n " );
522
551
ESPCOM::println (String (value).c_str (), output, espresponse);
523
552
} else {
524
553
// it is a set
525
554
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
+ }
534
568
} 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
+ }
537
634
}
538
635
}
539
636
} else {
0 commit comments