#include <stdio.h>
#include <Wire.h>
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <SoftwareSerial.h>
#define DEVICE_ADDRESS 0x3E // address of AQM1602XA-GBW-IIC
#define AHT25_ADDRESS 0x38 // address of AHT25
IPAddress myIP;

char line0[] = "AQM1602XA-GBW-II";
char line1[] = " yoshikon.com ";
char test0[] = "1234567890123456";
char test1[] = "6543210987654321";

static const char* ssid = "elecom-79b877";
static const char* password = "wvdmneht8u47";
ESP8266WebServer Server(80);

char tempera[15];
char ip_string[15];
char TTT[8];
char HHH[8];
int cnt = 0;

void handleRoot(void){
int cnt = 0;
char* data1;
char* data2;
 cnt++;
 Serial.print(cnt);
 Serial.print(" ");
 readData();
 data1 = TTT;
 data2 = HHH;
 Serial.print(tempera);
 Serial.println("handleRoot()");
 String message = "\
  <html lang=\"ja\">\n\
  <head>\n\
  <meta charset=\"utf-8\">\n\
  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\
  <title>ESP-f test Sending</title>\n\
  </head>\n\
  <body style=\"font-family: sans-serif; background-color: #ffeeaa;\">\n\
  <h2>温度・湿度(by ESP-f)</h2>\n\
  <h3>温度: "+ String(data1) +"℃</h3>\n\
  <h3>湿度: "+ String(data2) +"%</h3>\n\
  <h3>アクセス回数 "+ String(cnt) +"</h3>\n\
  </body>\n\
  </html>\n";
 Server.send(200, "text/html", message);
 writeCommand(0x02);
 for(int i = 0; i < 16; i++){writeData(tempera[i]);}
}
void handleNotFound(void){
 Serial.println("handleNotFound()");
 Server.send(404, "text/plain", "File not Found in Dongbeino...");
}

void setup(void){
 Wire.setClock(115200);
 Wire.begin();
 init_LCD();
 writeLCDclear();
 delay(100);
 writeComment1();
 delay(2000);
 writeComment2();
 delay(1000);
 Serial.begin(9600);
 delay(100);
 Serial.println("\n*** ESP-f ***");
 WiFi.mode(WIFI_STA);
 WiFi.begin(ssid, password);
 Serial.println("\nConnecting....");
 while(WiFi.status() != WL_CONNECTED){
  delay(1000);
  Serial.print(".");
 }
Serial.println("Connected");
Serial.println(WiFi.localIP());
myIP = WiFi.localIP();
sprintf(ip_string,"%s.%s.%s.%s",String(myIP[0]),String(myIP[1]),String(myIP[2]),String(myIP[3]));
for(int i= 0; i>16; i++){
 writeCommand(0x40 + 0x80 + i);
 writeData(ip_string);
}
 Server.on("/", handleRoot);
 Server.onNotFound(handleNotFound);
 Server.begin();
}

void loop(void){
 Server.handleClient();
 }

void led_off(){
 digitalWrite(0, HIGH);
 digitalWrite(14, HIGH);
 delay(2000);
 delay(2000);
}

void writeCommand(char t_command){
 Wire.beginTransmission(DEVICE_ADDRESS);
 Wire.write(0x00);
 Wire.write(t_command);
 Wire.endTransmission();
 delay(10);
}

void writeData(char t_data){
 Wire.beginTransmission(DEVICE_ADDRESS);
 Wire.write(0x40);
 Wire.write(t_data);
 Wire.endTransmission();
 delay(10);
}

void writeLCDclear(){
 Wire.beginTransmission(DEVICE_ADDRESS);
 Wire.write(0x20);
 Wire.write(0x01);
 Wire.endTransmission();
}

void writeComment1(){
 writeCommand(0x02);
 for(int i=0; i<16; i++){
  writeData(test0[i]);
  delay(2);
 }
 for(int i=0; i<16; i++){
  writeCommand(0x40 + 0x80 + i);
 writeData(test1[i]);
  delay(2);
 }
}

void writeComment2(){
 writeCommand(0x02);
 for(int i=0; i<16; i++){
  writeData(line0[i]);
  delay(2);
 }
 for(int i=0; i<16; i++){
  writeCommand(0x40 + 0x80 + i);
  writeData(line1[i]);
  delay(2);
 } }

void readData(void){
byte digraw[8];
char humidi[15];
char data_t[] = "Temp:";
char data_h[] = "Humi:";
uint32_t hum_raw, temp_raw, hhh, ttt;
float T;
float H;
int t;
int tt;
int i;

 Wire.beginTransmission(AHT25_ADDRESS);
 Wire.write(0xAC);
 Wire.write(0x33);
 Wire.write(0x00);
 Wire.endTransmission();
 delay(80);
 Wire.requestFrom(AHT25_ADDRESS, 7);
 for(i = 0; i < 7; i++){digraw[i] = Wire.read();}
 hum_raw = ((uint32_t)digraw[1] << 12) | ((uint32_t)digraw[2] << 4) | (((uint32_t)digraw[3] >> 4) & 0x0F);
 temp_raw = (((uint32_t)digraw[3] & 0x0F) << 16 ) | ((uint32_t)digraw[4] << 8) | (uint32_t)digraw[5];
 H = (hum_raw / 1048576.0 * 100);
 T = (temp_raw / 1048576.0 * 200 ) - 50;  sprintf(tempera, "T:%2.1fdC H:%2.1f%s ", T, H, "%");
 sprintf(TTT, "%2.1f", T);
 sprintf(HHH, "%2.1f", H);
 //writeCommand(0x02);
 //for(int i = 0; i < 16; i++){writeData(tempera[i]);}
 delay(10);
}

void init_LCD(){
 delay(100);
 writeCommand(0x38); // Function set
 delay(20);
 writeCommand(0x39); // IS=1
 delay(20);
 writeCommand(0x14); // INT OSC FREQUENCY
 delay(20);
 writeCommand(0x73); // CONTRUST Set 0,1,2,3,
 delay(20);
 writeCommand(0x56); // CONTRUST Set 4,5
 delay(20);
 writeCommand(0x6C); // FOLLOWER Control
 delay(20);
 writeCommand(0x38); //IS=0
 delay(20);
 writeCommand(0x01); // Clear Display
 delay(20);
 writeCommand(0x06); // Entry Mode
 delay(20);
 writeCommand(0x0C); // Display ON
 delay(20);
}