Untitled
unknown
plain_text
3 years ago
14 kB
3
Indexable
#define TIMER_INTERRUPT_DEBUG 1 #include <LiquidCrystal_I2C.h> #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WiFiMulti.h> #include <ESP8266mDNS.h> #include <ESP8266WebServer.h> // These define's must be placed at the beginning before #include // "ESP8266TimerInterrupt.h" #include "ESP8266TimerInterrupt.h" #include "ESP8266_ISR_Timer.h" #include <Wire.h> #include "Keypad.h" // ::: I2C <<----------------------------------------------------------- unsigned char slaveAddress1 = 8; unsigned char slaveAddress2; void find_First_I2C_Module( void ); LiquidCrystal_I2C lcd(0x27,16,2); // // ::: WiFi <<---------------------------------------------------------- ESP8266WiFiMulti wifiMulti; // Create an instance of the // ESP8266WiFiMulti class, // called 'wifiMulti' ESP8266WebServer server(80); // Create a webserver object that // listens for HTTP request on // port 80 void initWiFi( void ); void handleRoot(); // function prototypes for HTTP // handlers void handleLogin(); void handleNotFound(); void handleUser(); // ::: Timer <<--------------------------------------------------------- ESP8266Timer ITimer; void ICACHE_RAM_ATTR TimerHandler( void ); // ::: uKaos <<--------------------------------------------------------- // This counter is the central part to the ukaos OS. // Each group of tasks running on the same time slot are triggered // by the change on sate of the corresponding bit of this counter. // Time slot by bit position: // // Hi byte //< 33.5s - 16.7s - 8.3s - 4.1s - 2.0s - 1.0s - 524.2ms - 262.1ms > // LO byte //< 131.0ms - 65.5ms - 32.7ms - 16.3ms - 8.1ms - 4.9ms - 2.0ms - 1.0ms > unsigned short usRippleCount = 0; unsigned short usRipplePast = 0; unsigned short usActiveTaskGroup; // ::: Application <<--------------------------------------------------- const int led = LED_BUILTIN; const int in_sw = 16; const int sw_led = 10; unsigned int sw_actual, sw_past; unsigned char water; unsigned char alarm; unsigned int humidity; unsigned char address; void task_list_32ms( void ); void task_list_1s ( void ); void task_list_4s ( void ); //------------------------Keypad----------------------------------------- const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {D3, D4, D5, 10}; byte colPins[COLS] = {D6, D7, D8, 9}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //------------------------------------------------------------------------- void setup() { lcd.init(); lcd.backlight(); lcd.print("Hello"); serial: Serial.begin( 115200 ); while (!Serial); // wait for serial monitor i2c: // slaveAddress1 = 0x08; Wire.begin( 4, 5 ); find_First_I2C_Module(); beat: pinMode( led, OUTPUT ); digitalWrite( led, 0 ); wifi: wifiMulti.addAP("noWIfiForYou", "tacosAlPastor12@"); // add Wi-Fi networks you want toconnect to initWiFi(); tasks: // up to 16 task handlers....... ITimer.attachInterruptInterval( 500, TimerHandler); app: water = 0; sw_actual = 0; sw_past = 0; humidity = 0; alarm = 0; pinMode( in_sw , INPUT ); pinMode( sw_led, OUTPUT ); } void loop() { char key = keypad.getKey(); if (key != NO_KEY){ switch(key){ case '1': // Humedad lcd.clear(); (255 - humidity > 100) ? Serial.println("El nivel de humedad es alto") : Serial.println("El nivel de humedad es bajo"); lcd.print("Humedad"); lcd.setCursor(0, 1); lcd.print(255-humidity); break; case '4': // Nivel de Agua lcd.clear(); digitalRead( in_sw ) ? Serial.println("El Tanque está vacío") : Serial.println("El Tanque tiene agua"); lcd.print("Tanque Agua"); lcd.setCursor(0, 1); digitalRead( in_sw ) ? lcd.print("Vacio") : lcd.print("Lleno"); break; case '7': // Un saludo al master lcd.clear(); Serial.println("Quiubo Profe xD"); lcd.print("Quiubo Profe xD"); break; default: lcd.clear(); Serial.println("No existe función asignada"); lcd.print("No existe funcion asignada"); break; } } web_server: server.handleClient(); // uKaos idle: { // Wait until a time slot passes if ( usRippleCount == usRipplePast ) goto exit; // Find active slot usActiveTaskGroup = usRippleCount; usActiveTaskGroup ^= usRipplePast; usActiveTaskGroup &= usRippleCount; usRipplePast = usRippleCount; } task_32ms: { if ( ( usActiveTaskGroup ^ 0x0020 ) == 0 ) { // Activate tasks running every 32ms task_list_32ms(); } } task_500ms: { if ( ( usActiveTaskGroup ^ 0x0200 ) == 0 ) { // Toggle hearthbeat Built in LED digitalWrite( led, !digitalRead( led ) ); } } task_1s: { if ( ( usActiveTaskGroup ^ 0x0400 ) == 0 ) { // Activate tasks running each second task_list_1s(); } } task_4s: { if ( ( usActiveTaskGroup ^ 0x1000 ) == 0 ) { // Activate tasks running each 4 seconds task_list_4s(); } } exit: return; } // ::: Init section <<-------------------------------------------------- void initWiFi( void ) { Serial.println("Connecting ..."); int i = 0; while (wifiMulti.run() != WL_CONNECTED) { // Wait for the Wi-Fi to connect: scan for Wi-Fi networks, and // connect to the strongest of the networks above delay(250); Serial.print('.'); } Serial.println('\n'); Serial.print("Connected to "); Serial.println(WiFi.SSID()); // Tell us what network we're // connected to Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // Send the IP address of the // ESP8266 to the computer if (MDNS.begin("esp8266")) { // Start the mDNS responder for esp8266.local Serial.println("mDNS responder started"); } else { Serial.println("Error setting up MDNS responder!"); } server.on("/", HTTP_GET, handleRoot); // Call the // 'handleRoot' function when a // client requests URI "/" server.on("/login", HTTP_POST, handleLogin); // Call the // 'handleLogin' function when a POST // request is made to URI "/login" server.on("/user",HTTP_GET, handleUser ); server.onNotFound(handleNotFound); // When a client // requests an unknown URI (i.e. // something other than "/"), call // function "handleNotFound" server.begin(); // Actually start the server Serial.println("HTTP server started"); } // --------------------------------------------------------------------- void find_First_I2C_Module() { byte error; Serial.println ( "\n\nScan for I2C devices on port pair D4(SDA)and D5(SCL)" ) ; Serial.println( "Scanning (SDA : SCL) - D4 : D5 - " ); for ( address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission( address ); error = Wire.endTransmission(); if ( error == 0 ) { Serial.print( "I2C device found at address 0x" ); if ( address < 16 ) Serial.print( "0" ); Serial.print( address, HEX ); Serial.print(" HEX, and "); Serial.print( address ); Serial.print(" b10"); Serial.println(" !"); } } if ( address == 128 ) Serial.println("No I2C devices found"); else Serial.println("**********************************\n"); } // ::: App. tasks section <<-------------------------------------------- void readSwitch( void ) { sw_actual = digitalRead( in_sw ); water = sw_actual & sw_past; sw_past = sw_actual; } void echoSwitch( void ) { digitalWrite( sw_led, water ); } void task_list_32ms( void ) { readSwitch(); echoSwitch(); } // --------------------------------------------------------------------- void alarmLogic( void ) { alarm = 0; // Alarm rules if ( water == 0 ) goto exit; if ( humidity < 0x80 ) goto exit; alarm = 1; exit: return; } void txAlarmLevel( void ) { Wire.beginTransmission( 8 ); // transmit to dev. <address> Wire.write( alarm ); // sends value byte Wire.endTransmission(); // stop transmitting } void task_list_1s( void ) { alarmLogic(); txAlarmLevel(); readHumidity(); } // --------------------------------------------------------------------- void readHumidity( void ) { // request 1 bytes from slave Wire.requestFrom( ( uint8_t )slaveAddress1, ( uint8_t )1 ); if ( Wire.available() ) // read available data { humidity = Wire.read(); // receive a data byte } } void task_list_4s( void ) { } // ::: Event handlers section <<---------------------------------------- void ICACHE_RAM_ATTR TimerHandler( void ) { usRippleCount++; } void handleRoot() { // When URI / is requested, send a web page with a button to toggle // the LED server.send ( 200, "text/html", "<form action=\"/login\" method=\"POST\">" " <input type=\"text\" name=\"username\" " "placeholder=\"Username\">" " </br>" " <input type=\"password\" name=\"password\" " "placeholder=\"Password\">" " </br>" " <input type=\"submit\" value=\"Login\">" "</form>" "<p>Try 'Ulises Davalos' and 'pwd123' ...</p>" ) ; } void handleLogin() { // If a POST request is made to URI /login if ( ! server.hasArg("username") || ! server.hasArg("password") || server.arg ("username") == NULL || server.arg ("password") == NULL ) { // If the POST request doesn't have username and password data // The request is invalid, so send HTTP status 400 server.send(400, "text/plain", "400: Invalid Request"); return; } if ( server.arg( "username" ) == "Ulises Davalos" && server.arg( "password" ) == "pwd123" ) { // If both the username and the password are correct server.send ( 200, "text/html", "<h1>Welcome, " + server.arg("username") + "!</h1>" "<p>Login successful <a href=\"/user\">Go to ESP8266" " I/O!!!</a> </p>" ) ; } else { // Username and password don't match server.send(401, "text/plain", "401: Unauthorized"); } } static char response[ 200 ]; void handleUser() { // When URI / is requested, send a web page with a button to toggle // the LED sprintf (response, "<p>Water Reserve status = %d </p>" "<p>Humidity = %d </p>" "<hr>" "<p><a href=\"/\">Log out!</a></p>", digitalRead( in_sw ), 255 - humidity); server.send(200, "text/html", response); } void handleNotFound() { // Send HTTP status 404 (Not Found) when there's no handler for the // URI in the request server.send ( 404, "text/plain", "404: Not found" ) ; } // ********************************************************************* // ::: END OF FILE <<--------------------------------------------------- // *********************************************************************
Editor is loading...