working on it ...

Filters

Explore Public Snippets

Sort by

Found 5 snippets

    public by tomsim  1379  2  6  0

    ESP8266 wifi web server setup

    Lambda style Wifi web server with DHT22 data upload to ThingSpeak
    /* DHTServer - ESP8266 Webserver with a DHT sensor as an input
    
       Based on ESP8266Webserver, DHTexample, and BlinkWithoutDelay (thank you)
    
       Version 1.0  5/3/2014  Version 1.0 Mike Barela for Adafruit Industries
    */
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <DHT.h>
    #include <TimeLib.h>
    #include "ThingSpeak.h"
    
    #define DHTTYPE DHT22
    
    const int DHTPIN = D4;
    
    const char* ssid     = "mySSID";
    const char* password = "myPassword";
    
    ESP8266WebServer server(80);
    
    /*============ ThingSpeak setup ==================*/
    // Note:  Each channel has its own number and write API key
    // API key is what get used - wrong channel number doesn't matter
    
    // Temperature Humidity Channel
    static unsigned long myChannelNumber = 123456;
    static const char 	*myWriteAPIKey = "AB1CDEF6HIJKLMNO";
    static WiFiClient  client;
    
    /*============ End ThingSpeak setup ==============*/
    
    
    // Initialize DHT sensor 
    // NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
    // you need to increase the threshold for cycle counts considered a 1 or 0.
    // You can do this by passing a 3rd parameter for this threshold.  It's a bit
    // of fiddling to find the right value, but in general the faster the CPU the
    // higher the value.  The default for a 16mhz AVR is a value of 6.  For an
    // Arduino Due that runs at 84mhz a value of 30 works.
    // This is for the ESP8266 processor on ESP-01 
    DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266
     
    float lastHumdty, lastTempF;  // Values read from sensor
    static int nextSampleMinute = 15;
    static int minuteSampleInterval = 15;
    
    // Generally, you should use "unsigned long" for variables that hold time
    unsigned long previousMillis = 0;        // will store last temp was read
    const long interval = 2000;              // interval at which to read sensor
    
    void getTemperature() {
      // Wait at least 2 seconds seconds between measurements.
      // if the difference between the current time and last time you read
      // the sensor is bigger than the interval you set, read the sensor
      // Works better than delay for things happening elsewhere also
      unsigned long currentMillis = millis();
     
      if(currentMillis - previousMillis >= interval) {
        // save the last time you read the sensor 
        previousMillis = currentMillis;   
    
        // Reading temperature for humidity takes about 250 milliseconds!
        // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
        lastHumdty = dht.readHumidity();          // Read humidity (percent)
        lastTempF = dht.readTemperature(true);     // Read temperature as Fahrenheit
        // Check if any reads failed and exit early (to try again).
        if (isnan(lastHumdty) || isnan(lastTempF)) {
          Serial.println("Failed to read from DHT sensor!");
          return;
        }
      }
    }
    
    static int uploadData(void)
    {
    	ThingSpeak.setField( 1, lastTempF);
    	ThingSpeak.setField( 2, lastHumdty);
    	int rc = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    //	Serial.println(String("Post rc=")+rc);
    	return rc;
    }
    
     
    const String HTML_TYPE = "text/html";
    
    void handle_null() {
        Serial.println("Handle null");
    	server.send(200,HTML_TYPE,"");
    	delay(100);
    }
    void handleRoot()
    {
    	String wstr = 
    	"<p>Hello from the weather esp8266, read from /temp or /humidity"
    	"<br>set <a href=/set?minuteSampleInterval=5>5 minute</a> sample interval"
    	", <a href=/set?nextSampleMinute=15>sample at 15 </a> minute"
    	"<br>Take <a href=/sample>sample Data</a> and upload to ThingSpeak"
    	"<br><a href=/temp>Get Temperature</a>"
    	"<br><a href=/humidity>Get Humidity</a>";
    	wstr += "<br>Last temperature: " + String(lastTempF)+"F";
    	wstr += " humidity: " + String(lastHumdty)+"%";
    	wstr += "<br>Current minute: " + String(minute(now()));
    	wstr += " next sample time: " + String(nextSampleMinute)+" min.";
    	wstr += " sample interval: " + String(minuteSampleInterval)+" min.";
    	server.send(200,HTML_TYPE, wstr);
    	delay(100);
    }
    void doSample()
    {
    	Serial.println("DoSample");
    	getTemperature();
    	int rc = uploadData();
    	String wstr = "<p>Take sample data:  ";
    	wstr += "<br>Temperature " + String(lastTempF);
    	wstr += "<br>Humidity " + String(lastHumdty);
    	wstr += "<br>Upload thingspeak rc=" + String(rc);
    	server.send(200,HTML_TYPE, wstr);
    }
     
    // Web Server Service Definition structure
    // =======================================
    typedef struct s_WebServiceDef
    {
    	const char *urlName;
    	void (*doit)(void);
    } WebServiceDef;
    
    /* =======================================================================
    	Define web service definition here
    	Each entry has a URL name and a lambda function to service the request
       =======================================================================
    */
    static WebServiceDef wsd[] = {
    	{ "/", handleRoot },
    	{ "/favicon", handle_null },
    	{ "/temp",			// url name
    		[] ()				// lambda function
    		{
    			getTemperature();       // read sensor
    			String wstr="Temperature: "+String((int)lastTempF)+" F";
    			server.send(200, "text/plain", wstr);   // send to someones browser when asked
    		}
    	},
    	{ "/humidity", []()
    		{ 
    			getTemperature();
    			String wstr="Humidity: "+String((int)lastHumdty)+"%";
    			server.send(200, "text/plain", wstr);
    		}
    	},
    	{ "/sample", doSample },
    	{ "/set", []()
    		{
    			String n = String("minuteSampleInterval");
    			if (server.hasArg(n))
    			{
    				int v = server.arg(n).toInt();
    				if (v)
    					minuteSampleInterval = v;
    			}
    			n = String("nextSampleMinute");
    			if (server.hasArg(n))
    			{
    				int v = server.arg(n).toInt();
    				if (v)
    					nextSampleMinute = v;
    			}
    			server.send(200, "text/plain", "ok");
    		}
    	},
     	{0,0}
    };
    
    static void setupServerHandler(void)
    {
    	for (int i; wsd[i].urlName; i++)
    	{
    		server.on( wsd[i].urlName, wsd[i].doit);
    	}
    	server.onNotFound(handleRoot);
    }
    
    static int nextAlarmMin(int sampleInterval)
    {
    	int nextMin = minute(now());
    	nextMin = ((nextMin + sampleInterval) % 60);	// alarm every 5 min
    	return nextMin;
    }
    
    
    
    void setup(void)
    {
    	// You can open the Arduino IDE Serial Monitor window to see what the code is doing
    	Serial.begin(115200);  // Serial connection from ESP-01 via 3.3v console cable
    	dht.begin();           // initialize temperature sensor
    
    	// Connect to WiFi network
    	WiFi.begin(ssid, password);
    	Serial.print("\n\r \n\rWorking to connect");
    
    	// Wait for connection
    	while (WiFi.status() != WL_CONNECTED) {
    	delay(500);
    	Serial.print(".");
    	}
    	Serial.println("");
    	Serial.println("DHT Weather Reading Server");
    	Serial.print("Connected to ");
    	Serial.println(ssid);
    	Serial.print("IP address: ");
    	Serial.println(WiFi.localIP());
    
    	ThingSpeak.begin(client);
    
    	setupServerHandler();
    
    	server.begin();
    	Serial.println("HTTP server started");
    }
     
    void loop(void)
    {
    	int currentMinute = minute(now());
    
    	if (currentMinute == nextSampleMinute)
    	{
    		// trigger sample at set interval
    		Serial.println("Regular sample");
    		getTemperature();
    		int rc = uploadData();
    		Serial.println("rc=" + String(rc));
    
    		nextSampleMinute = nextAlarmMin(minuteSampleInterval);
    		delay(1000);
    	}
    
    	server.handleClient();
    } 
    
    

    public by tomsim  2211  0  5  0

    Rotary Encoder State table

    Read Rotary Encoder using state table instead of interrupt
    /* Common 2 pins rotary encoder (ignore push button pin)
      Default pin output = (0,0)
      Read each pin and combine them into one value
      then use it to index the state table to advance to next state
      State sequence 00->01->11->10->00 return -1
          Next state  0   1   3   2   0
                     00->10->11->01->00 return +1
                      0   2   3   1   0
    */
    const int ENC_A = 2;
    const int ENC_B = 3;
    
    // State table
    static uint8_t stb[][4] =
    {
    //       0 1 2 3
            {8,2,1,8}, //0 start here v=0
            {0,8,1,3}, //1 0*2(-3-1-0 -1
            {0,8,2,4}, //2 0*1(-3-2-0
            {8,5,1,3}, //3 0-2*3(-1-0 -1
            {8,2,6,4}, //4 0-1*3(-2-0
            {7,5,8,3}, //5 0-2-3*1(-0 -1
            {9,8,6,4}, //6 0-1-3*2(-0
    };
    static int encRead( int pa, int pb)
    {
    	int8_t cx = 0; 			// initial state 0
    	int errCnt = 0;
    	while (errCnt < 1550)
    	{
    		uint8_t v = digitalRead(pa) | digitalRead(pb)<<1;
    
    		if (v < 4)
    		{
    			uint8_t nx = stb[cx][v];
    
    			if (nx > 6)
    			{
    		    if (nx == 8)
    		      errCnt++;
    				else
    					return (8 - (int)nx);
    			}
    			else
    			{
    				cx = nx;
    			}
    		}
    		else
    		{
    			cx = 0;
    			errCnt++;
    		}
    	}
    
    	return 0;
    }
    
    void setup()
    {
    	Serial.begin(9600);
    
    	pinMode( ENC_A, INPUT_PULLUP);
    	pinMode( ENC_B, INPUT_PULLUP);
    
    }
    
    const int MAX_VAL = 64*6 -1;
    
    int lastPos = 0;
    
    void loop() {
    
    	unsigned long 	sampleTime = millis();
    	int rv = encRead(ENC_A,ENC_B);
    	sampleTime = millis() - sampleTime;
    
    	if (rv == 0)
    	{
    		delay(50);
    	}
    	else
    	{
    		lastPos += rv;
    		if (sampleTime < 20)
    			sampleTime = 20;
    		// simulate acceleration
    		lastPos += rv*int(9000.0/(sampleTime*sampleTime));
    
    		if (lastPos < 0) lastPos = 0;
    		if (lastPos > MAX_VAL) lastPos = MAX_VAL;
    
    		Serial.print(lastPos); Serial.print(" "); Serial.println(sampleTime);
    
    	}
    
    }
    
    
    
    
    
                                        

    public by tomsim  1972  1  5  0

    Dallas sensor to thingspeak

    /* Code snippet to use Dallas sensor with ThingSpeak
     * Use lib Arduino manager to install ThingSpeak and DallasTemperature libraries
     */
    
    #include "ThingSpeak.h"
    #include <ESP8266WiFi.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    
    ...
    /*============ Dallas device setup ==================*/
    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);
    
    // Pass our oneWire reference to Dallas Temperature. 
    DallasTemperature tempSensor(&oneWire);
    
    const int MAX_DEVICES = 3;
    static int nDeviceCount = 0;
    static DeviceAddress tempDev[MAX_DEVICES];
    
    static void findDeviceAddr(void)
    {
    	tempSensor.begin();
    	nDeviceCount = tempSensor.getDeviceCount();
    
    	if (nDeviceCount > MAX_DEVICES)
    		nDeviceCount = MAX_DEVICES;
    
    	for (int i=0; i < nDeviceCount; i++)
    	{
      		uint8_t *devAddr = tempDev[i];
    		if (tempSensor.getAddress(devAddr,i))
    			Serial.println("getAddress ok");
    	}
    }
    static float getTempF( DeviceAddress deviceAddress)
    {
    	float tempF = DallasTemperature::toFahrenheit( tempSensor.getTempC(deviceAddress));
    	return tempF;
    }
    
    ...
    /*============ ThingSpeak setup ==================*/
    // Note:  Each channel has its own number and write API key
    // API key is what get used - wrong channel number doesn't matter
    
    static unsigned long myChannelNumber = YOUR_CHANNEL_NUMBER;	// Customize
    static const char 	*myWriteAPIKey = "Your API KEY";		// Customize
    ...
    
    /*== Global client for ThingSpeak */
    static WiFiClient  client;
    
    static void sampleTemperature()
    {
    	// request to all devices on the bus
    	tempSensor.requestTemperatures(); // Send the command to get temperatures
    
    	for (int i=0; i < nDeviceCount; i++)
    	{
    		float tempF = getTempF(tempDev[i]);
    		Serial.print(String(i+1)+": "+tempF+"F ");
    		ThingSpeak.setField( i+1, tempF);
    	}
    	Serial.println();
    	if (nDeviceCount > 0)
    	{
    		int rc = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    		Serial.println(String("Post rc=")+rc);
    	}
    }
    
    
    void setup () 
    {
      Serial.begin(115200);
    
    	/* Must Do Wifi setup first... */
    ...
    	/* Wifi should be ready after this */
    ...
    	ThingSpeak.begin(client);	// initialize ThingSpeak lib
    ...
    	findDeviceAddr();  	// locate OneWire devices on the bus
    ...
    }
    
    void loop () 
    {
    ...
    			if (itsTimeToSample)
    				sampleTemperature();
    ...
    }            

    public by tomsim  3174  39  5  0

    ESP8266 WiFi auto-config

    Use WiFiManager library to auto config SSID
    #include <EEPROM.h>
    #include <ESP8266WiFi.h>
    #include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
    ...
    
    /*====== WiFiManager support stuff ========*/
    void configModeCallback (WiFiManager *myWiFiManager) {
      Serial.println("In WiFi config mode");
      Serial.println(WiFi.softAPIP());
      //if you used auto generated SSID, print it
      Serial.println(myWiFiManager->getConfigPortalSSID());
    }
    
    void setup () 
    {
      Serial.begin(115200);
      delay(200);
    ...
    	/* WiFi setup */
    	WiFiManager wifiManager;
    	wifiManager.setDebugOutput(false);
    //wifiManager.resetSettings(); /* reset settings - for testing */
    	//set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode
    	wifiManager.setAPCallback(configModeCallback);
    
    	//fetches ssid and pass and tries to connect
    	//if it does not connect it starts an access point with the specified name
    	//here  "AutoConnectAP"
    	//and goes into a blocking loop awaiting configuration
      if (!wifiManager.autoConnect("AutoConnectAP"))
    	{
    		Serial.println("failed to connect and hit timeout");
    		//reset and try again, or maybe put it to deep sleep
    		ESP.reset();
    		delay(1000);
    	}
    
    	/*if you get here you have connected to the WiFi*/
    	Serial.println("");
    	Serial.println("WiFi connected");
    	Serial.println(WiFi.localIP());
    ...
    }
    
    void loop()
    {
    ...
    }
    
    
    
                

    public by tomsim  1760  3  5  0

    C Array Initialization

    char tab[][4] =
    {
    // 	 0 1 2 3
    	{7,1,2,0}, //0 start here v=3
    	{3,1,7,0}, //1 3*1(-0-2-3 -1
    	{4,7,2,0}, //2 3*2(-0-1-3
    	{3,1,5,7}, //3 3-1*0(-2-3 -1
    	{4,6,2,7}, //4 3-2*0(-1-3
    	{3,7,5,8}, //5 3-1-0*2(-3 -1
    	{4,6,7,9}, //6 3-2-0*1(-3
    };

    List Complete ( 5 snippets total )

    • Public Snippets
    • Channels Snippets