LaserGameV1.ino 4,13 ko
Newer Older
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
DeadMeon's avatar
DeadMeon a validé
#include "arduino_secrets.h"
#define SENSOR_PIN A0
#define TRIGER_PIN D6
#define LASER_PIN D5
#define LED_PIN D4
#define KEY_LENGTH 8
DeadMeon's avatar
DeadMeon a validé
#define TIME_OF_DEATH 5000
#define SEUIL_OF_DEATH 800

IPAddress multicastAddress = IPAddress(230, 185, 192, 108);
//IPAddress multicastAddress = IPAddress(229, 97, 225, 144);
unsigned int localPort = 41848;
//unsigned int localPort = 2390;
DeadMeon's avatar
DeadMeon a validé
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
WiFiUDP Udp;
String localId;
String serverId = String("Server");
char separateur[] = ":";
char packetBuffer[256]; //buffer to hold incoming packet
DeadMeon's avatar
DeadMeon a validé
bool isAlive = true;
int tmpOfDeath = 0;

DeadMeon's avatar
DeadMeon a validé
void setup()
{
	pinMode(SENSOR_PIN, INPUT);
DeadMeon's avatar
DeadMeon a validé
	pinMode(TRIGER_PIN, INPUT);
	pinMode(LASER_PIN, OUTPUT);
	pinMode(LED_PIN, OUTPUT);
DeadMeon's avatar
DeadMeon a validé

DeadMeon's avatar
DeadMeon a validé
	Serial.begin(115200);
	delay(5000);

	/* initialize random seed: */
	srand(time(0));
	localId = hexaGenerator(KEY_LENGTH);
	Serial.print("ID : ");
	Serial.println(localId);
	WiFi.mode(WIFI_STA);
	Serial.print("Attempting to connect to SSID: ");
	Serial.println(ssid);
	Serial.print("Connecting");
	// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
	WiFi.begin(ssid, pass);
	do
	{
		delay(1000);
		Serial.print(".");
	} while (WiFi.status() != WL_CONNECTED);
	Serial.print("Connected! IP address: ");
	Serial.println(WiFi.localIP());
	Serial.printf("UDP server on port %d\n", localPort);
	diagWifiStatus();
	Udp.beginMulticast(WiFi.localIP(), multicastAddress, localPort);
	Serial.println(multicastAddress);
DeadMeon's avatar
DeadMeon a validé
void loop()
DeadMeon's avatar
DeadMeon a validé
	if (isAlive)
	{
		shootLaser();
		chestState();
	}
	else
	{
		respawn();
	}

	//Serial.println( analogRead( SENSOR_PIN ) );
	parseData();
}



void setDead(bool state){
	if (state) {
		digitalWrite(LASER_PIN, LOW);
		digitalWrite(LED_PIN, HIGH);
DeadMeon's avatar
DeadMeon a validé
		isAlive = false;
	} else {
		digitalWrite(LED_PIN, LOW);
DeadMeon's avatar
DeadMeon a validé
		tmpOfDeath = 0;
		isAlive = true;
	}
}

void respawn()
{
	if (tmpOfDeath < TIME_OF_DEATH)
	{
		tmpOfDeath++;
		delay(1);
	}
	else
	{
		setDead(false);
	}
void chestState()
{
	if (analogRead(SENSOR_PIN) > SEUIL_OF_DEATH)
	{
		sendMsg("HIT");
DeadMeon's avatar
DeadMeon a validé
		setDead(true);

void shootLaser()
{
	if (digitalRead(TRIGER_PIN) == HIGH)
	{
		digitalWrite(LASER_PIN, HIGH);
	}
	else
	{
		digitalWrite(LASER_PIN, LOW);
	}
void parseData()
DeadMeon's avatar
DeadMeon a validé
{
	int packetSize = Udp.parsePacket();
	if (packetSize)
	{
		int len = Udp.read(packetBuffer, 255);
		if (len > 0)
		{
			packetBuffer[len] = 0;
		}

		printData(packetSize);

		String token = String(strtok(packetBuffer, separateur));
		if (token == localId)
DeadMeon's avatar
DeadMeon a validé
		{
			token = strtok(NULL, separateur);
			if (token == serverId)
DeadMeon's avatar
DeadMeon a validé
			{
				token = strtok(NULL, separateur);
				if (token == "SERVER_TEST")
DeadMeon's avatar
DeadMeon a validé
				{
					sendMsg("TEST_RECEIVED");
				}
				else if (token == "PING")
DeadMeon's avatar
DeadMeon a validé
				{
					sendMsg("PONG");
DeadMeon's avatar
DeadMeon a validé
					setDead(true);
DeadMeon's avatar
DeadMeon a validé
				}
			}
		}
DeadMeon's avatar
DeadMeon a validé
	}
DeadMeon's avatar
DeadMeon a validé
void printData(int packetSize)
{
	Serial.print("Received packet of size ");
	Serial.println(packetSize);
DeadMeon's avatar
DeadMeon a validé
	Serial.print("From ");
	IPAddress remoteIp = Udp.remoteIP();
	Serial.print(remoteIp);
	Serial.print(", port ");
	Serial.println(Udp.remotePort());
DeadMeon's avatar
DeadMeon a validé
	Serial.println("Contents : ");
	Serial.println(packetBuffer);
DeadMeon's avatar
DeadMeon a validé
void sendMsg(char *msg)
{
	char buf[256];
	String str = serverId;
	str.concat(separateur);
	str.concat(localId);
	str.concat(separateur);
	str.concat(msg);
	str.toCharArray(buf, 256);

DeadMeon's avatar
DeadMeon a validé
	Udp.beginPacket(multicastAddress, localPort);
	Udp.write(buf);
DeadMeon's avatar
DeadMeon a validé
	Udp.endPacket();

	Serial.print("Msg Send : ");
	Serial.println(buf);
}

String hexaGenerator(int length)
{
	int val = rand();
	char hex[length];
	itoa(val, hex, 16);
	String result = String(hex);
	Serial.print("\nEquivalent Hex Byte: ");
	Serial.println(result);
	return result;
}

void diagWifiStatus()
{
	/**
	 * Return value available : 
  	 * 0 : WL_IDLE_STATUS when Wi-Fi is in process of changing between statuses
  	 * 1 : WL_NO_SSID_AVAIL in case configured SSID cannot be reached
  	 * 3 : WL_CONNECTED after successful connection is established
  	 * 4 : WL_CONNECT_FAILED if connection failed
  	 * 6 : WL_CONNECT_WRONG_PASSWORD if password is incorrect
  	 * 7 : WL_DISCONNECTED if module is not configured in station mode
  	 */
	Serial.printf("Connection status: %d\n", WiFi.status());