关于阴阳谜题

来源:互联网 发布:unity3d建立一个ui界面 编辑:程序博客网 时间:2024/04/28 15:20

维基百科“call-with-current-continuation”条目中提到……the yin-yang puzzle … was then being customary to show while discussing call/cc. 所谓的“Yin-Yang Puzzle”就是阴阳谜题。Scheme代码是这样的:

(let* ((yin         ((lambda (cc) (display #\@)(newline) cc) (call/cc (lambda (c) c))))       (yang         ((lambda (cc) (display #\*) cc) (call/cc (lambda (c) c)))))    (yin yang))

等价但更费解的形式:

( ((lambda (cc) (display #\@) cc) (call/cc (lambda (c) c))) ((lambda (cc) (display #\*) cc) (call/cc (lambda (c) c))))
#include <ESP8266WiFi.h>#include <WiFiClient.h>#include <ESP8266WebServer.h>#include "SparkFunBME280.h"#include "Wire.h"const char* ssid = "miku_router";const char* password = "GlgjssyQyhfbqz"; // 著名的一句诗const int port = 80;// Pin Definitionconst int KS = 15;const int PWM = 14;const int Motor = 12;const int LED_R = 5;const int LED_G = 4;const int LED_B = 3;const int BUZZ = 13;// 状态// 0 - 关机(所有灯灭,风机、雾化均不工作)// 1 - 雾化(风机工作,雾化工作)// 2 - 排雾(所有灯灭,风机工作,雾化不工作)// 3 - 故障(KS触发,低水位,此时电源指示红灯闪烁,风机、雾化均不工作)// 计划增加的状态// 4 - 自动(风机工作,雾化跟踪湿度调节功率)#define SHUTDOWN 0#define RUNNING  1#define EXHAUST  2#define LOWLEVEL 3#define AUTO     4static int state = 0;// 颜色定义#define RED    4#define GREEN  2#define BLUE   1#define PURPLE 5#define CYAN   3 // Yanhe Green#define YELLOW 6#define BLACK  0#define WHITE  7// 占空比//   取值0~1024static int duty_ratio = 900;// 湿度int humi = 2;// 待机(SHUTDOWN)状态闪烁的计时器static int sb_counter = 0;ESP8266WebServer server(80);BME280 sensor;// BMP280初始化void BMP280_setup() {    sensor.settings.commInterface = I2C_MODE;    sensor.settings.I2CAddress = 0x76;    sensor.settings.runMode = 3; //Normal mode    sensor.settings.tStandby = 0;    sensor.settings.filter = 0;    sensor.settings.tempOverSample = 1;    sensor.settings.pressOverSample = 1;    sensor.begin();}void buzzer() {    digitalWrite(BUZZ, HIGH);    delay(100);    digitalWrite(BUZZ, LOW);}// 统一的灯光控制(目前只输出开关量)void led_ctrl(int R, int G, int B) {    digitalWrite(LED_R, R);    digitalWrite(LED_G, G);    digitalWrite(LED_B, B);}// 颜色输出void led_out(int color) {    int R = color & RED;    int G = color & GREEN;    int B = color & BLUE;    led_ctrl(R, G, B);}// 读传感器并改变灯的颜色void read_sensor() {    // 暂时先读温度数据代替湿度(方便调试)    humi = sensor.readTempC();    // 湿度低:黄灯    if(humi > 0 && humi <= 20) {        Serial.println("Low Humidity: Yellow");        led_out(YELLOW);    }    // 湿度适宜:绿灯    else if(humi > 20 && humi <= 60) {        Serial.println("Comfortable Humidity: Green");        led_out(GREEN);    }    // 湿度高:蓝灯    else if(humi > 60 && humi <= 100) {        Serial.println("High Humidity: Blue");        led_out(BLUE);    }    // 其他情况:红灯(传感器故障)    else {        Serial.println("Sensor fault: Red");        led_out(RED);    }}// KS中断void water_level_int() {    analogWrite(PWM, 0);  // 立即关闭雾化和风机    digitalWrite(Motor, LOW);    state = LOWLEVEL;}void setup() {    pinMode(KS, INPUT_PULLUP);    pinMode(PWM, OUTPUT);    pinMode(Motor, OUTPUT);    pinMode(LED_R, OUTPUT);    pinMode(LED_G, OUTPUT);    pinMode(LED_B, OUTPUT);    pinMode(BUZZ, OUTPUT);    led_out(BLACK);    Serial.begin(115200);    Serial.println("Debug output");    Wire.begin();    BMP280_setup();    // 注册水位过低中断    attachInterrupt(KS, water_level_int, CHANGE);    sb_counter = 0;    // 灯光全亮    led_out(WHITE);    state = SHUTDOWN;    // 网络初始化与连接    WiFi.begin(ssid, password);    Serial.print("Connecting");    while (WiFi.status() != WL_CONNECTED) {        led_out(BLACK);        delay(80);        led_out(WHITE);        delay(80);        Serial.print(".");    }    Serial.println ( "" );    Serial.print("Connected to ");    Serial.println(ssid);    Serial.print("IP address: ");    Serial.println(WiFi.localIP());    // 注册响应回调    server.on("/",[]() {        char html[400] = "\<html>\<body>\    <iframe id=\"hf\" style=\"display:none\"></iframe>\    <h1>IoT Humidifier</h1>\    <p><a href=\"javascript:void(0);\" onclick=\"document.getElementById('hf').src = './on';\">开机</a></p>\    <p><a href=\"javascript:void(0);\" onclick=\"document.getElementById('hf').src = './off';\">关机</a></p>\</body>\</html>";        server.send ( 404, "text/html", html );        buzzer();    });    server.on("/on",[]() {        if(digitalRead(KS) == LOW) {            duty_ratio = 900;            state = RUNNING;        }        Serial.println("+ request /on");        server.send ( 200, "text/html", "<html><body><h1>I'm running~</h1><p><a href=\"./off\">关机</a></p></body></html>" );        led_out(BLACK);        Serial.println("- request /on");        buzzer();    });    server.on("/off",[]() {        if(state == RUNNING) {            state = EXHAUST;        }        else {            state = SHUTDOWN;        }        Serial.println("+ request /off" );        server.send ( 200, "text/html", "<html><body><h1>SHUTDOWN~</h1><p><a href=\"./on\">开机</a></p></body></html>" );        led_out(BLACK);        Serial.println("- request /off" );        buzzer();    });    server.on("/auto",[]() {        buzzer();        Serial.println( "+ request /auto" );        if(state == RUNNING) {            server.send ( 200, "text/html", "<html><body><h1>humi~</h1></body></html>" );            duty_ratio = 200;        }        led_out(BLACK);        Serial.println( "- request /auto" );        buzzer();    });    server.onNotFound([]() {        server.send ( 404, "text/html", "<html><body><h1>404: Not Found " + server.uri() + "</h1></body></html>" );        buzzer();    });    // 启动服务器    server.begin();    // 灯光全灭    led_out(BLACK);}void loop() {    server.handleClient();    // 状态机    if(state == LOWLEVEL) {        Serial.println( "state LOWLVL" );        // 显式关闭雾化和风机        analogWrite(PWM, 0);        digitalWrite(Motor, LOW);        // 先关闭所有灯光        led_out(BLACK);        // 堵塞式闪烁红灯10次        for(int i = 0; i < 10; i++) {            led_out(BLACK);            delay(200);            led_out(RED);            delay(200);        }        // 闪完之后关机        state = SHUTDOWN;    }    else if(state == EXHAUST) {        Serial.println( "state EXHAUST" );        // 关闭雾化        analogWrite(PWM, 0);        // 关闭除电源蓝灯的全部灯光        led_ctrl(LOW, LOW, LOW, HIGH, LOW);        // 显式启动风机        digitalWrite(Motor, HIGH);        delay(5000); // 延时5秒,堵塞也无妨        // 关闭风机        digitalWrite(Motor, LOW);        // 转SHUTDOWN状态        state = SHUTDOWN;    }    else if(state == SHUTDOWN) {        Serial.print( "state SHUTDOWN " );        Serial.println(sb_counter);        if(sb_counter < 950) {            // 关闭全部灯光(950个cycle)            led_out(BLACK);            sb_counter++;        }        else if(sb_counter >= 950 && sb_counter < 1000){            // 闪一下电源蓝灯(50个cycle)            led_out(BLUE);            sb_counter++;        }        else if(sb_counter >= 1000) {            // 关闭全部灯光            led_out(BLACK);            sb_counter = 0;        }        // 显式关闭风机        digitalWrite(Motor, LOW);        // 显式关闭雾化        analogWrite(PWM,0);        // 维持SHUTDOWN状态        state = SHUTDOWN;    }    else if(state == RUNNING) {        Serial.println( "state RUNNING" );        if(digitalRead(KS) == LOW) {            // 写雾化占空比            analogWrite(PWM, duty_ratio);            // 显式开启风机            digitalWrite(Motor, HIGH);        }        // 读传感器并根据湿度写灯        read_sensor();        Serial.println(humi);        // 维持RUNNING状态        state = RUNNING;    }}
原创粉丝点击